为什么TCP是个烂协议

TCP是个烂协议。

TCP或HTTP理论上是可靠连接,但是在网络不好的时候,其实根本不可靠。反而程序员会因为TCP理论上的可靠而不去做底层的重发机制。
那么在网络不好时,用TCP和UDP的区别仅仅是,程序员会收到一个TCP错误,用UDP则会在沉默中丢失数据。

但是如果程序员不手动处理TCP错误,只是“铛”的弹个对话框,把错误报告给用户,那么其实对用户来说一点用都没有。
另一方面,要想在上层手动处理TCP错误,根本做不到嘛。因为应用层重发请求常常导致服务器重复多次处理相同请求的bug。

我们可以看到,网络卡的时候,或者电信网通互相访问的时候,玩个游戏就会频繁掉线。这表现出TCP不适应中国国情。
具体的说,TCP丢包时会退避,然后就会超时。但是,在中国丢包往往是因为ISP的路由器丢你的包,而不是你本地带宽不足。对于ISP这种行为,对用户最有利的解决办法应该是暴力重发,抢占更多带宽,而不是主动退避嘛。

TCP是个烂协议,基本上是人尽皆知的常识。我建议能够选择自定义协议的场合,尽量改用谷歌的QUIC代替TCP协议。

那么,不得不使用TCP怎么办呢?

我在前东家做网页游戏时,Flash Player只支持TCP。我的办法是,每隔一两秒就发一个心跳包,对端只要收不到心跳包就暴力建立新TCP连接,而不是文质彬彬去退避。我把这个做法称为BCP(Brutal Control Protocol,残暴控制协议):


Bcp - scala-bcp 0.1.0

欢迎使用!

编辑于 2015-08-05

文章被以下专栏收录