c - 下列哪项对 Nagle 算法的描述是正确的?

标签 c linux tcp linux-kernel

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

Version 1: Wait for the peer to acknowledge the previously sent packets before sending any partial packets

Version 2: Wait for the peer to acknowledge the previously sent partial packets before sending any partial packets

版本 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 修改后的优势是什么?

最佳答案

这两者之间的唯一区别,如您所写,是 (2) 将毫不延迟地发送一个部分段,即使有未确认的段,如果这些段是全尺寸的话。 IE。如果它最近只发送完整尺寸的片段,并且其中一些片段仍然“悬而未决”。

这是一件好事,因为这种情况并不表示使用小数据包的聊天连接。这种情况经常发生在批量传输数据结束时。除非文件传输的大小可以被 TCP 段的大小整除,以便最后一 block 填满一个段(这种情况不太可能发生),否则数据突发的最后一 block 将是不完整的段。

仅仅因为批量传输的最后一 block 较小而延迟发送是没有意义的。

规则 1 会导致发送方在发送最后一 block 之前实现无意义的延迟,从而减慢几乎每次 HTTP 传输。

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

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

相关文章:

c - C 中字符和字符串函数的二维数组

c - 在 C 中将字符串设置为 null

Linux 上的 C 内联汇编,将字符串从堆栈写入标准输出

Java TCP 客户端发送被阻止?

C 枚举 : unknown type name

c - 处理系统时间变化

c - 如何在溢出时停止双重自动转换?

linux - 使用 gstreamer 和音频/视频从电视调谐器/网络摄像头录制不同步

linux - Nginx 没有正确释放 TCP 套接字?

TCP序列号