一、HTTP事务延迟
(1)DNS解析,将客户端输入的主机名转换成ip地址需要大约10s时间;
(2)建立TCP连接,1~2s
(3)发送HTTP报文与接收HTTP报文。
二、TCP时延
(1)TCP连接建立握手:通常一次HTTP事务处理的数据量不大,一次TCP握手会占用大部分时间(大约50%)
(2)TCP慢启动拥塞控制:TCP连接会随着网络的拥塞程度进行加快或减缓窗口大小,如果HTTP事务有大量数据发送,会将这些数据分组,根据拥塞算法发送分组。
(3)数据聚集的Nagle算法:TCP有一个数据流接口,应用程序可以通过它将任意尺寸的数据放入TCP栈,每个TCP段中至少撞在了40个字节的标记和首部,所以如果TCP发送了大量包含少量数据的分组,网络性能会严重下降。Nagle算法试图在发送一个分组之前将大量TCP数据绑定在一起,以提高网络效率。Nagle算法发送全尺寸段(MTU=1500),只有所有其他分组都被确认才允许发送非全尺寸的段。如果其他分组仍然在传输过程中,就将那部分数据缓存起来,只有挂起的分组被确认或者缓存中积累了足够发送一个全尺寸的数据时,才会将缓存的数据发送出去。
在HTTP协议中,小的HTTP报文无法填满一个分组,有时会因为等待永远不会到来的额外数据而产生时延。与延迟算法之间的交互性问题:Nagle算法会阻塞数据发送,知道有确认分组抵达为止,但确认分组自身会被延迟确认算法延迟100~200ms。因此,HTTP应用程序会设置参数TCP_NODELAY,禁止Nagle算法,提高性能。如果这样做,一定确保会向TCP写入大块数据,这样就不会产生一堆小分组。
(4)用于捎带确认的TCP延迟确认算法:由于确认报文很小,为了有效利用网络,TCP将返回的确认信息与输出的数据分组结合在一起发送出去。延迟算法会在一个特定窗口时间内将输出确认报文放在缓冲区内,以寻找能够捎带它的数据分组。如果一定时间内没有输出数据分组,就将确认信息放在单独的分组中传输。但是HTTP事务由请求应答行为降低了捎带信息的可能性,通常延迟算法会引入大量时延。
(5)TIME_WAIT时延和端口耗尽:当某个TCP端口关闭TCP连接时,会在内存中维持一个小的控制块,用来记录所关闭连接的IP地址和端口号,维持时间为2MSL(120s),当有大量客户端同时关闭连接,服务器会产生大量TIME_WAIT,由于源端口有限(如6000个),连接率就限制在6000/120=500次/s,要解决这个问题,可以增加服务器数量,也可以保持长连接。
三、提高HTTP连接性能
(1)并性连接:通过多条TCP连接发起并发的HTTP请求,并行连接会将时延重叠起来,加快加载速度。但并行连接不一定快,多个对象去竞争有限的带宽,每个对象都会以较慢的速度加载,性能提升小,而且打开大量连接消耗很多内存资源,从而引发自身性能问题。但并行连接会使整个界面看起来素的快。
(2)持久连接:重用TCP连接,在事务处理完后仍然保持打开状态,以消除连接及关闭时延,并且已经打开的连接可以避免慢启动的拥塞适应阶段,以便更快速地传输数据。
(3)管道化连接:通过共享TCP连接发起并发的HTTP请求。在响应到达之前,可将多条请求放入队列,当第一条请求通过网络流向另一端服务器时,第二条第三条请求也可以发送了。可以降低网络的环回时间,提高性能。要求:持久化连接,确保顺序回送HTTP响应,做好连接任意时刻关闭的准备并重发管道化请求。