【发布时间】:2012-07-12 08:25:40
【问题描述】:
我发现 WinSock 发送调用可能会延迟 200 毫秒
来自 MSDN: http://support.microsoft.com/kb/214397/en
纳格尔算法: http://en.wikipedia.org/wiki/Nagle's_algorithm
问题总结:
如果重复发送带有 SO_SNDBUF "0" 选项的小消息(
我的问题: 为什么第一次发送消息延迟 200 毫秒?
因为 TCP 在第一次发送调用之前是空闲的,所以我认为第一条消息必须立即发送。
但测试结果并不理想。
第一条消息也延迟了 200 毫秒,为什么?
感谢您的回答。
添加一些细节:
Naggle 算法适用于以下小消息:
1. if wire is idle, send it immediately.
2. if formal message's ACK is not received, wait until ACK & send
3. Window's TCP ack delay mechanism send ack after 200ms.
所以,我的期望是第一条消息立即发送,第二条消息等待第一条消息的确认 200 毫秒,依此类推。
这是错的吗?
【问题讨论】:
-
为什么将 SO_SNDBUF 设置为零?这是一个非常糟糕的主意。越大越好。如果您不想要 Nagle 算法,只需将其关闭即可。其他不懂的东西不要乱搞。
-
@EJP :我同意你的看法(SO_SNDBUF=0 是个坏主意)。跟进第三方库的性能问题只是出于好奇(这解决了 SO_SNDBUF 不是 0)。