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版本开始也采用了此项技术。
原文:http://www.cnblogs.com/mod109/p/5119688.html