高速网络下的http协议优化
http协议是基于TCP协议,具备TCP协议的所有功能。但是与一般TCP的长连接不同的是http协议往往连接时间比较短,一个请求一个响应了事。但是总所周知,TCP协议除了具备可靠的传输以外,还有拥塞控制,慢启动等策略。在当年提出这些策略的时候网速普遍较低,这些策略引起的负面影响尚不明显,然而现在的动则百兆光纤的高速网络下TCP也必须不断优化以适应现在的环境,因为从目前来看弄出第二种协议才取代TCP是不可能的。
1.增大发送窗口
TCP的慢启动就是说,协议一开始从设置发送窗口从某个数值开始,如果没有出现丢包,则发送窗口以指数级增长,一旦发生丢包那么立刻减半防止因为拥塞大量丢包。
那么问题来了,http协议很多时候传输数据量很小,当慢启动还在试探的时候整条连接就被咔嚓了,这么一来本来可以两三个包交互的过程可能被拖到了4,5,6个,网络资源得不到完美利用。因此增大TCP的初始化窗口是极为必要的,可以在较短的时间内获得极大的吞吐量以便于网络资源得到充分发挥。
Google建议TCP初始化传输窗口增大到10个MSS,差不多16K左右。据统计,百分之九十的http回包大都数都是在16K以下。
2.优化三次握手策略
TCP在建立连接的时候首先要进行三次握手,所谓的三次握手就是彼此协商好一切初始化数据。比如说初始化序列号,协商好MSS。。。但是如果放到http协议里面,本来一个请求一个响应,可能很多时候根本就是一个包来就可以了事的事,却偏偏弄成了三次握手,一个包来,回复一个ack,然后再加上4次挥手断开连接,网络资源平白无故的浪费了许多。
事实上这里如果我们能优化掉一个包,那么整个互联网上减少的数据包会少掉多少?虽说无法统计但是能想像得到。不过有一点是有统计数据的,三次握手在http协议当中占据的传输时间少则占用百分之十,多则占用百分之三十。
其实TCP协议是可以在SYN数据包当中带数据的,不过为了安全考虑必须要等到三次握手结束之后才提交给应用程序,其套接字选项是TCP_LISTEN_TFO,对于编程来说也很简单。此时TCP协议会所带的数据和生成的cookis一起发送过去,据统计采用此技术后一些门户网站延迟效率提升了近百分之四十,而linux内核从3.6版本开始也采用了此项技术。
3.尾部探测技术
据统计,TCP传输的过程中,大约有30%的链接出现过丢包的情况。而TCP协议在处理丢包主要有两种方式:
1、发送端收到重复响应出发快速重传机制,大约需要1个RTT时间
2、当重传超时时进行数据包重传,一般都是5个甚至更多的RTT时间
数据包超时重传所需要的延迟远大于快速重传机制,另外TCP丢包往往发生在数据包的尾部,而且更多是连续性丢包,此时快速重传机制很难发挥作用,绝大多数这种情况下的丢包最后都是等到超时后重传的,如果我们能优化掉这个细节点,那么http协议传输效率则会有很大提高,于是我们出现了TLP机制。
TLP机制就是尾部丢失探测Tail Loss Probe,其原理就是当出现尾部连续性丢包时,补发最后那个包,此时就可以利用快速重传来代替超时重传,从而缩短TCP数据恢复的时间。而触发快速重传机制的根本就是引入了探测包的超时时间。当网络丢包时,探测的超时先于重传超时先触发,于是使得发送端发送最后那个数据,此时就可以从服务端收到ack回包,那么中间丢掉的包就会因为进入快速重传机制而很快补上而不用等到彻底超时。
有统计表明,因为这项改进增加了百分之一不到的探测报,从而导致搜索延迟减少了百分之六,数据重传减少了百分之十以上,可见其优化效果。