2009-06-19 56 views
3

在阅读this文章时,我有一个疑问。关于Winsock内核缓冲区和Nagle算法的疑问

我明白,虽然转移小数据,但默格启用了Nagle算法,它将小数据包合并。这会导致在传输之前缓存一些数据。我相信Winsock Kernel Buffer是缓存发生的地方。纠正我,如果我错了。

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

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

回答

5

你提到的知识库文章给你的答案这样...

要在应用层优化性能,从应用程序的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设置为零将明确停止所有输出缓冲,并立即为套接字上的每个'write'尝试立即调度(至少在普通套接字实现中)。

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

+0

它仍然不清楚。它说使用TCP_NODELAY来禁用它。最后突出显示的声明表示,发送完成通知延迟到实际发送数据时为止。不是关于禁用Nagle算法。 – Canopus 2009-06-19 12:13:41

0

将SO_SNDBUF设置为0不会强制立即在线路上发送。

0

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