在阅读 this 文章时,我有一个疑问。

我知道在传输小数据时,默认情况下启用 Nagle 算法来合并小数据包。这导致在传输之前缓存一些数据。我相信 Winsock Kernel Buffer 是缓存发生的地方。如果我错了,请纠正我。

这是否意味着如果使用 SO_SNDBUF 选项将 Winsock 内核缓冲区设置为零,是否会禁用 Nagle 算法?

如果不是,那么 WINSOCK 在哪里缓存小数据?

最佳答案

您引用的知识库文章以这种方式给出了您的答案...

并且,设置 TCP_NODELAY 或 SO_SNDBUF=0 将禁用 Nagle 算法,如下所示,


阅读您在下面的评论,我意识到您可能会感到困惑,因为设置 TCP_NODELAY 或设置 SO_SNDBUF=0 似乎都在做同样的事情。如果是这种情况,请注意 Nagle 仅适用于 TCP 流(将数据分段为数据包),而 SO_SNDBUF 也适用于 UDP 套接字。
将 SO_SNDBUF 设置为零显式停止所有输出缓冲,并尝试为套接字上的每个“写入”立即分派(dispatch)(至少在正常的套接字实现中)。
设置 TCP_NODELAY 将显式停止 TCP 套接字上的 Nagle 算法,尽管发送缓冲区可能可用并用于延迟调度(在向应用程序确认发送成功后)。

关于windows - 关于 Winsock Kernel Buffer 和 Nagle 算法的疑问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1017507/

10-11 22:56