一,TCP fast open 客户端实现
这个特性是google提出并主导开发的。实现的原理是对于客户端允许发送syn请求时携带数据, 对于服务器端收到带有数据的syn请求后,可以立刻提交给用户层,并发送ack, 这样节省一个RTT时间。
这个特性对于短连接的业务类型比较有很大的帮助,据测试结果有4%~41%的性能提升。
这个特性需要客户端和服务器端的os都支持,并且未知window何时才支持这个特性。另外,这个特性需要业务用户层代码相应的调整。估计在全网使用开还需要一定时间。
但是,对于手持设备,特别是基于android系统智能机而言,随着android内核分支逐渐向主线靠拢,
可以预见最先开疆扩土,并得到这个特性带来收益的将是基于linux的android上应用。
这个机制是用来针对缓存膨胀(bufferbloat),意思是在tcp传输路径中有中很多的缓存,比如socket buffer,qdisc的队列buffer,网卡驱动层也有队列buffer。 而这些buffer会缓存住数据包,但是对于tcp协议层而言,可能已经认为数据包已经发送到网络中,会增加数据包传输的rtt时间,而可以自定义的socket buffer 大小,qdisc队列长度,会膨胀放大延时。因此,可以通过tcp_limit_output_bytes这个proc参数让用户限制qdisc的队列和驱动层队列中所有数据包的总字节数, 默认是131072字节。
对于同等的带宽,启动这个功能后,延时变化情况:
1000M网卡: 小于 1ms on Gbit (之前是 50ms with TSO)
100M网卡: 小于 8ms on 100Mbit (之前是 132 ms)
针对缓存膨胀的其他方法是codel qdisc策略,以及基于字节的bql qdisc策略。
参考:https://lwn.net/Articles/507065/