不知道是翻译的原因,还是本来就是如此,TCP/IP详解V1上对于nagle算法说的不是特别清楚。书上的原文是
书上附有一个例子,对第14、15报文段进行了描述。看书的时候,觉得这里不是太清楚,觉得和我们通常TCP的传输方式不是太一样,尤其是与滑动窗口的思想相违背,滑动窗口不是就让我们可以fill the pipe吗,那不就是意味着可以连续发送多个报文,以提高速度吗。于是找到RFC896,想搞清楚这事:
RFC896中的原文是
- The solution is to inhibit the sending of new TCP segments when
-
new outgoing data arrives from the user if any previously
-
transmitted data on the connection remains unacknowledged.
其中关键点在于那个when限制的条件表达式,不是不能发送多个报文,而是不会由于用户想要改送数据,就直接请求协议栈发送。那什么时候发呢,由对端的ACK驱动,即接收到ACK,就发送数据。在接收到ACK时,能够发送多少呢?由滑动窗口决定。那如果对方没有必要给ACK呢?这就是RFC中if条件所说的情况,如果没有unacknowledged报文,可以直接发送。
并且RFC规定的情况,并不仅限于小分组,nagle并不区分大小,只限定原则。RFC中有对于各种情形举例描述,说明了这是一个相当自适应的算法,适合于各种情况:交互式的,批量式的,快速链路,慢速链路,总之,就是通吃。
阅读(2546) | 评论(0) | 转发(0) |