关于Winsock Kernel Buffer和Naglealgorithm的疑问

在阅读这篇文章的时候,我有一个疑问。

我明白,在传输小数据的时候,Naglealgorithm是默认启用的,它会合并小数据包。 这会导致在传输之前caching一些数据。 我相信Winsock Kernel Buffer是caching发生的地方。 纠正我,如果我错了。

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

如果不是那么WINSOCKcaching小数据呢?

Solutions Collecting From Web of "关于Winsock Kernel Buffer和Naglealgorithm的疑问"

您提到的知识库文章以这种方式给出了您的答案…

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

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

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

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


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

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

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

SO_SNDBUF设置为0不会强制立即发送电报。

将SO_SNDBUF设置为零不会隐式禁用nagle; 由WSK维护的鹰状态独立于缓冲区所在的位置。 你有责任保持你发布的缓冲区有效,直到传输消耗它。