TCP交互数据流之经受时延的ACK和Nagle算法

经受时延的ACK

通常TCP在接收到数据时并不立即发送ACK,相反,它将等待一段时间(如200ms),以期望将ACK与需要沿该方向发送的数据一起发送,这种现象也称为数据捎带ACK。这样做的目的是为了减少发往网络的报文,以提高网络传输效率,节省网络资源。(特别对于广域网)

经受时延的ACK工作过程:

TCP交互数据流之经受时延的ACK和Nagle算法_第1张图片

wireshark工具抓包:

TCP交互数据流之经受时延的ACK和Nagle算法_第2张图片

经受时延ACK的负面影响:

在某些情况下,Delay ACK会带来难以接受的延时问题,如下面的场景:服务器单向向客户端间歇发送一些数据,但是客户端无应用数据需要提交给对方,此时,如果客户端每收到对端包含有应用字段的报文时,都等待200ms才对其进行确认,那么如果服务器与客户端的交互次数为1000的话,那么整个应用交易或应用会话将要持续1000*200=200S,而200秒对于绝大多数的应用来说是不可接受的)。

经受时延ACK补充:

  1. 绝大多数实现采用的时延为200ms,也就是说,TCP将以最大200ms的时延等待是都有数据一起发送,但是这个200ms的值并不是必须的,开发者可以根据自己的需要来设定这个数值,因此,我们在实际工作过程如果发现非200ms但是工作机制与Delay ACK一致的TCP交互过程,那基本上就是Delay ACK机制了。

  2. 如果连续收到对端两个数据段,则一般立即回应ACK数据包,如下图所示:

TCP交互数据流之经受时延的ACK和Nagle算法_第3张图片


Nagle算法

背景

TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也要发送ACK来确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此TCP/IP总是希望以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小块数据。

定义:

Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。

算法规则

(1)如果包长度达到MSS,则允许发送;
(2)如果该包含有FIN,则允许发送;
(3)设置了TCP_NODELAY选项,则允许发送;
(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。

例子

在主机slip和主机vangogh.cs.berkeley.edu之间建立一个Rlogin连接,主要是功能是客户端输入字符,服务器接收字符并回显。首先是按下F1功能键,这将产生3个字节:一个esc(转义字符),一个左括号和一个M。然后按下F2 功能键,将产生另外3个字节。

TCP交互数据流之经受时延的ACK和Nagle算法_第4张图片

我们可以看到主机slip发送字节时是一个一个字节发送的,也就是说当第一个字节esc发出之后,需要等待主机vangogh的ack收到之后,才发出第二字节,依次类推。其中报文5表示delay ACK.

关闭Nagle算法

想象如下场景:在一个交互注册过程中键入终端的一个特殊功能键,这个功能键通常可以产生多个字符序列,一般从ASCII码的转移字符开始,如果TCP每次得到一个字符,它很可能会发送序列中的第一个字符,然后缓存其他字符并等待对该字符的确认,但当服务器接收到该字符时,它并不发送确认,而是继续等待接收序列的其他字符,这就会经常触发服务器的Delay ACK机制,产生很大时延。所以在这个情况下,用户可以通过使用TCP_NODELAY选项来关闭Nagle算法。

参考:

http://baike.baidu.com/linkurl=iw2tqmqsvoLGeDKfoVOxZn8pNUuS2y3MVdaXN3JsTe3tM2tgTlEEFnssQqRpBWzRlFGblK8_o6gDjhPmInYrDeP-fc0d6bwBs6N5dXycWMO

http://www.vants.org/?post=114

你可能感兴趣的:(计算机网络)