首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Nagle算法的描述是正确的?

对Nagle算法的描述是正确的?
EN

Stack Overflow用户
提问于 2012-03-13 14:53:32
回答 1查看 552关注 0票数 2

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

版本1:在发送任何部分数据包之前,等待对等方确认先前发送的数据包。 版本2:等待对等方确认先前发送的部分数据包,然后再发送任何部分数据包

版本1是我从googled信息(如Wiki(Nagle算法)科克:比你想知道的还要多 )中了解到的结果。

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

代码语言:javascript
复制
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()检查是否所有发送的小数据包都是ACKed。

所以我的问题是:

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-13 17:00:39

这两段之间唯一的区别,正如您已经写下的,是(2)将毫不延迟地发送一个部分段,即使有未加标记的段,如果这些段是完全大小的。也就是说,如果它最近只发送了完整的部分,其中一些还在“空中”。

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

没有必要仅仅因为大容量传输的体积较小而延迟发送最后一部分。

规则1将导致发送方在发送最后一块之前实现无意义的延迟,从而减缓几乎每个HTTP传输的速度。

(你确定这是真正的规则吗?注意尼古拉·N·费蒂索夫( Nikolai N Fetissov)的评论,一定要阅读真正的RFC,而不是二手消息来源。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9686480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档