关于Winsock Kernel Buffer和Nagle算法的疑问

2023-12-22

在读的时候this http://support.microsoft.com/kb/214397文章,我有一个疑问。

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

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

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


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

为了优化应用层的性能,Winsock 从应用程序复制数据缓冲区发送调用到 Winsock 内核缓冲区。然后,堆栈使用自己的启发式方法(例如 Nagle 算法)来确定何时实际将数据包放到线路上。

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

The TCP_NODELAY 套接字选项用于禁用 Nagle 算法以便将小数据包无延迟地传送到远程主机。

您可以使用 SO_SNDBUF 选项更改分配给套接字的 Winsock 内核缓冲区的数量(默认情况下为 8K)。如有必要,Winsock 可以缓冲明显大于 SO_SNDBUF 缓冲区大小的内容。大多数情况下,应用程序中的发送完成仅表明应用程序发送调用中的数据缓冲区已复制到 Winsock 内核缓冲区,并不表明数据已到达网络介质。唯一的例外是当通过将 SO_SNDBUF 设置为 0 来禁用 Winsock 缓冲.


阅读下面的评论,我意识到您可能会感到困惑,因为设置 TCP_NODELAY 或设置 SO_SNDBUF=0 似乎都在做同样的事情。如果是这种情况,请注意Nagle 仅适用于 TCP 流(将数据分段为数据包),而 SO_SNDBUF 也适用于 UDP 套接字。

将 SO_SNDBUF 设置为零显式停止所有输出缓冲,并尝试立即调度套接字上的每个“写入”(至少在正常套接字实现中)。

设置 TCP_NODELAY 将显式停止 TCP 套接字上的 Nagle 算法,尽管发送缓冲区可能可用并用于延迟调度(在向应用程序确认发送成功后)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Winsock Kernel Buffer和Nagle算法的疑问 的相关文章

随机推荐