【问题标题】:Winsock TCP buffering behaviourWinsock TCP 缓冲行为
【发布时间】: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 点,所以我希望我的问题至少有一些意义。

【问题讨论】:

    标签: windows winsock


    【解决方案1】:

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

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

    【讨论】:

    • 我的系统就是人们所说的简约;我没有安全软件也没有防火墙,几乎所有的服务都被禁用了。我已经分析了从源到接收器的管道(即驱动程序、SPI LSP 等),没有发现任何异常。我还在另一台机器上对此进行了测试,以防它是我的网络驱动程序的设计选择,但它呈现相同的结果。
    • 问题在 Windows 7 或 Windows Server 上消失了吗?我唯一的另一个想法是尝试使用 SO_RCVBUF 套接字选项,也许还有 SO_RCVLOWAT。但调整这些设置可能会使情况变得更糟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    相关资源
    最近更新 更多