以下是Nagle算法的两个简单描述。
版本1:在发送任何部分数据包之前,等待对等方确认先前发送的数据包。 版本2:等待对等方确认先前发送的部分数据包,然后再发送任何部分数据包
版本1是我从googled信息(如Wiki(Nagle算法)或科克:比你想知道的还要多 )中了解到的结果。
版本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()检查是否所有发送的小数据包都是ACKed。
所以我的问题是:
发布于 2012-03-13 17:00:39
这两段之间唯一的区别,正如您已经写下的,是(2)将毫不延迟地发送一个部分段,即使有未加标记的段,如果这些段是完全大小的。也就是说,如果它最近只发送了完整的部分,其中一些还在“空中”。
这是一件好事,因为这种情况并不表示使用小数据包的聊天连接。这种情况经常发生在大量数据传输结束时。除非文件传输的大小可被TCP段的大小完全除以,以便最后一块填充一个段,这是不可能发生的,否则数据突发将有一个不完整的段作为它的最后一块。
没有必要仅仅因为大容量传输的体积较小而延迟发送最后一部分。
规则1将导致发送方在发送最后一块之前实现无意义的延迟,从而减缓几乎每个HTTP传输的速度。
(你确定这是真正的规则吗?注意尼古拉·N·费蒂索夫( Nikolai N Fetissov)的评论,一定要阅读真正的RFC,而不是二手消息来源。
https://stackoverflow.com/questions/9686480
复制相似问题