Winsock TCP缓冲行为

时间:2011-09-09 18:40:55

标签: windows winsock

首先,这个问题的环境;

Windows XP SP3
独家使用重叠I / O
禁用Tx和Rx套接字缓冲 TCP传输
Nagle禁用了 I / O完成端口
Wireshark用于分析网络流量

我在申请时所观察到的是网络流量接收与我的应用程序对这些事件的通知之间的差异。

为了最好地说明此问题,以下是一个此类案例的TCP流示例:

#   RelTime  Dir  Len
1   0        Rx   ACK
2   10       Rx   536
3   9        Rx   536
4   0        Tx   ACK
5   10       Rx   536
6   10       Rx   536
7   0        Tx   ACK
8   9        Rx   536
9   9        Rx   429

(用于接收此数据的已发布缓冲区各为2044字节)

上述3109字节由我的应用程序在3个通知中接收为2044字节,100字节,965字节。因此,在决定将数据传播到用户空间(并再次在#9上)之前,堆栈似乎一直等到它发送了两个ACK(#4,#7)。

现在除了看起来与所有关于通知的Winsock文档(其中说明立即通知,在这种情况下每个都是536个字节)相矛盾时,通知的延迟(例如,~40ms)非常重要,特别是在我的情况下是一个以延时游戏输入分布为模型的游戏服务器。

我所追求的是关于线路上的TCP与通过Winsock的用户态通知之间关系的语义的正确解释。

谢谢,

P.S。,我已经对MSDN Winsock内核论坛提出质疑,但无济于事。

P.P.S。,现在是凌晨3点,所以我希望我的问题至少在某种意义上得以实现。

1 个答案:

答案 0 :(得分:0)

最佳猜测:关闭Windows防火墙或已安装的任何其他安全产品(并重新启动)。

此外,查找可能安装的任何其他非Microsoft LSP。我见过一些奇怪的网络问题,因为有人安装了一些第三方代理和网络工具。 http://www.herongyang.com/Windows/Winsock-netsh-winsock-show-catalog-LSP.html