【发布时间】:2011-09-09 18:40:54
【问题描述】:
首先,这个问题的环境;
Windows XP SP3
独占使用重叠 I/O
Tx 和 Rx 套接字缓冲已禁用
TCP 传输
Nagle 已禁用
I/O完成端口
Wireshark 用于分析网络流量
我在我的应用程序中观察到的是网络流量接收与我的应用程序对这些事件的通知之间存在差异。
为了最好地说明这个问题,下面是一个这样的例子的 TCP 流示例:
# RelTime Dir Len 1 0 接收确认 2 10 接收 536 3 9 接收 536 4 0 发送确认 5 10 接收 536 6 10 接收 536 7 0 发送确认 8 9 接收 536 9 9 接收 429(用于接收此数据的发布缓冲区每个为 2044 字节)
我的应用程序在 3 个通知中接收到上述 3109 字节,分别为 2044 字节、100 字节、965 字节。因此,堆栈似乎已经等到它发送了两个 ACK(#4、#7),然后才决定将数据传播到用户空间(并再次在 #9)
现在除了似乎与所有关于通知的 Winsock 文档相矛盾(其中声明立即通知,在这种情况下每个字节为 536 个字节),通知延迟(例如,约 40 毫秒)非常重要,尤其是在我的情况下是一个以延时游戏输入分布为模型的游戏服务器。
我所追求的是对在线 TCP 和通过 Winsock 的用户空间通知之间关系的语义的正确解释。
谢谢,
马特。
P.S.,我已经就此问题向 MSDN Winsock 内核论坛提问,但无济于事。
P.P.S.,现在是凌晨 3 点,所以我希望我的问题至少有一些意义。
【问题讨论】: