我正在使用tcp进行很多小发送,我应该关闭Nagles算法吗?(人们也知道这是TCP_NODELAY)

ret*_*eax 5 c++ linux tcp send linux-kernel

我重新发布这篇文章,因为我的标题选择太可怕了,抱歉.我的新帖子可以在这里找到:发送很多后,我的send()调用导致我的程序完全停止.这怎么可能?

非常感谢大家.问题是客户端实际上是机器人,他们从不从连接中读取.(感到愚蠢)

Nik*_*sov 4

TCP_NODELAY可能有助于减少从发送方到接收方的小数据包的延迟,但您给出的描述指向不同的方向。我可以想象以下内容:

  • 发送的数据多于接收者实际消耗的数据 - 这最终会溢出发送者的缓冲区 ( SO_SNDBUF) 并导致服务器进程在系统调用中显得“卡住” send(2)。此时,内核等待另一端确认一些未完成的数据,但接收方并不期望它,因此它没有recv(2)

可能还有其他解释,但不看代码很难判断。