Nagle算法的哪些描述是正确的?

时间:2012-03-13 14:53:33

标签: c linux tcp linux-kernel

以下是Nagle算法的两个简单描述。

  

版本1:在发送任何部分数据包之前等待对等体确认先前发送的数据包

     

版本2:在发送任何部分数据包之前,等待对等体确认先前发送的部分数据包

版本1是我从Google搜索信息中理解的结果,例如Wiki(Nagle's algorithm)TCP_CORK: More than you ever wanted to know

版本2是我从Nagle算法的Linux内核实现中理解的结果

static inline int tcp_nagle_check(const struct tcp_sock *tp,
                              const struct sk_buff *skb,
                              unsigned mss_now, int nonagle)
{
    return (skb->len < mss_now &&
            ((nonagle & TCP_NAGLE_CORK) ||
             (!nonagle && tp->packets_out && tcp_minshall_check(tp))));
}

函数tcp_minshall_check()检查是否所有发送的小数据包都被确认。

所以我的问题是:

  1. 哪个描述是正确的?
  2. 如果两者都正确,那么Linux修改的优势是什么?

1 个答案:

答案 0 :(得分:1)

这两者之间的唯一区别,就是你已经写下来了,即使有未分组的段,如果这些段是全尺寸的,(2)也会毫无延迟地发送一个部分段。即如果它最近只发送了全尺寸的片段,其中一些还在“空中”。

这是一件好事,因为这种情况并不表示使用小数据包的繁琐连接。这种情况经常在批量数据传输结束时发生。除非文件传输的大小完全可以被TCP段的大小整除,以便最后一块填充一个段,这是不太可能发生的,数据突发将有一个不完整的段作为它的最后一块。

延迟发送最后一块批量转移是没有意义的,只是因为它较小。

规则1将通过使发送方在发送最后一条之前实现无意义的延迟来减慢几乎所有HTTP传输。

(你确定这是真正的规则吗?注意Nikolai N Fetissov的评论一定要阅读真正的RFC而不是二手资料。)