【HTTP】TCP连接性能初探

参考:《HTTP权威指南》


HTTP紧挨着TCP,位于其上层,所以HTTP事务的性能在很大程度上取决于底层TCP通道的性能。

TCP时延取决于硬件速度、网络和服务器负载,请求和响应报文的尺寸,以及客户端和服务器之间的距离。HTTP事务的时延有以下几种主要原因

1)客户端首先需要根据URI确定Web服务器的IP地址和端口号。如果最近没有对URI中的主机名进行访问,通过DNS解析系统将URI中的主机名转换成一个IP地址需要花费数十秒时间

2)客户端向服务器发送一条TCP连接请求,并等待服务器回送一个请求接受应答。每条新的TCP连接都会有连接建立时延。

3)连接建立后,客户端通过新建的TCP管道来发送HTTP请求,数据到达时,Web服务器会从TCP连接中读取请求报文并对请求进行处理。传输请求报文以及服务器处理请求报文需要时间

4)Web服务器回送HTTP响应,也需要时间


性能聚焦区域

1)TCP连接建立握手

2)TCP慢启动拥塞控制

3)数据聚集的Nagle算法

4)用于捎带确认的TCP延迟确认算法

5)TIME_WAIT时延和端口耗尽。


TCP连接的握手时延

TCP连接握手需要经过一下几个步骤

1)客户端要想服务器发送一个小的TCP分组,这个分组中设置了一个特殊的SYN标记,说明这是一个连接请求。

2)如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个TCP分组,这个分组中SYN和ACK标记都被置位,说明连接请求已被接受。

3)客户端向服务器回送一条确认信息,通知它连接已成功建立。这个确认信息里,就可以开始发送数据了。


延迟确认

因特网自身无法确保可靠分组传输,所以TCP实现了自己的确认机制来确保数据的成功传输。每个TCP段都有一个序列号和数据完整性校验和。每个段的接受着收到完好的段时,都会想发送者回答小的确认分组。如果发送者没有在指定的窗口时间内收到确认信息,发送者就认为分组已被破坏或损毁,并重发数据。由于确认报文很小,所以TCP允许发往相同方向的输出数据分组中对其进行捎带。TCP将返回的去人信息于输出的数据分组结合在一起,可以更有效地利用网络。为了增加确认报文找到 同向传输数据分组的可能性,很多TCP栈都实现了一种“延迟确认”算法。延迟确认算法会在一个特定的窗口时间(通常是100ms到200ms)内将输出确认存在缓冲区中,以寻找能够捎带它的输出数据分组。如果在哪个时间段内没有输出数据分组,就将确认信息放在单独的分组中传送。


TCP慢启动

TCP数据传输的性能取决于TCp连接的使用期(age)。TCP连接会随着时间进行自我“调谐”,起初会在限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐被称为TCP慢启动,用于防止因特网的突然过载和拥挤。

TCP慢启动限制了一个TCP端点在任意时刻的传输的分组数。每成功接收一个分组,发送端就有了发送另外两个分组的权限。如果某个HTTP事务有大量数据要发送,是不能一次将所有分组都发送出去的。必须发送一个分组,等待确认;然后可以发送两个分组,每个分组都必须被确认,这就可以发送四个分组了。这种方式被称作“打开拥塞窗口”。所以新的连接的传输速度会比已经交换过一定量数据的“已调谐”连接慢一些。


Nagele算法与TCP_NODELAY

TCP有一个数据流接口,应用程序可以通过它将任意 尺寸的数据放入TCP栈中,即使一次只放一个字节也可以。但是每个TCP段中都至少转载了40个字节的标记和首部,所以如果TCP发送了大量包含少量数据分组,网络性能就会严重下降。Nagle算法试图在发送一个分组之前,将大量TCP数据绑定在一起,以提高网络效率。该算法鼓励发送全尺寸(大约1500字节1.5KB)的段,只有当所有其他分组都被确认之后,Nagle算法才允许发送非全尺寸的分组。如果其他分组仍然在传输过程中,就将那部分数据缓存起来,只有当挂起分组被确认,或者缓存中积累了足够发送一个全尺寸分组的数据时,才会将缓存的数据发送出去。HTTP应用程序常常会在自己的栈中设置参数TCP_NODELAY,禁用Nagle算法,提高性能


TIME_WAIT积累与端口耗尽

当某个TCP端口点关闭TCP连接时,会在内存中维护一个小的控制块,用来记录最近所关闭连接的IP地址和端口号。这类信息只会维持一小段时间,通常是所顾忌的最大分段使用期的两倍(2MSL),以确保在这段时间内不会创建具有相同地址和端口号的新连接。这个算法可以防止在两分钟内创建、关闭并重新创建两个相同IP地址和端口号的连接。

客户端每次连接到服务器上时,都会获得一个新的源端口,以实现连接的唯一性。但由于可用源端口的数量有限(比如600000),而且在2MSL秒(比如 120s)内连接时无法重用的,连接率就被限制在了60000/120=500次/秒。如果再不断进行优化,并且服务器的连接率不高于500次/秒,就可确保不会遇到TIME_WAIT端口耗尽问题。

修正这个问题,可以增加客户端负载生成机器的数量或者确保客户端和服务器的循环使用的虚拟IP地址以增加更多链接组合。

特别小心有大量连接处于打开状态或处于等待状态的连接分配了大量控制块的情况,有些操作系统的速度回严重减缓。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值