下面是对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()检查所有发送的小数据包是否被打包。
所以我的问题是:
哪个描述是正确的?
如果两者都是正确的,那么linux修改的优点是什么?

最佳答案

这两者之间的唯一区别,正如您写下的,是(2)将毫不延迟地发送一个部分段,即使有未锁定的段,如果这些段是全尺寸的。也就是说,如果它最近只发送全尺寸的片段,而其中一些仍然“悬而未决”。
这是一件好事,因为这种情况并不表示使用小数据包的聊天连接。这种情况经常发生在大量数据传输结束时。除非文件传输的大小可以精确地除以TCP段的大小,以便最后一个段填充一个段(这是不可能发生的),否则数据突发将有一个不完整的段作为其最后一个段。
仅仅因为最后一笔批量转账较小,就推迟发送是没有意义的。
规则1将导致发送方在发送最后一条消息之前实现一个无意义的延迟,从而减慢几乎所有http传输的速度。
(你确定这是真正的规则吗?注意Nikolai n Fetissov的评论,务必阅读真实的RFC,而不是二手资料。)

关于c - Nagle算法的哪些描述是正确的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9686480/

10-13 04:10