强制 Windows 在数据包到达网卡后立即发送

强制 Windows 在数据包到达网卡后立即发送

我有一个在 Windows Server 2008 R2 上运行的网络应用程序,必须在很短的时间间隔内发送小数据包,每微秒都很重要。我的问题是 Windows 会累积数据包并将它们发送到一个大的 TCP 数据包中,但我希望每个数据包都单独发送。

我禁用了网卡中的中断调节。我还将接口的 MTU 大小设置为 63(这是我的数据包可以容纳的最小大小)。我使用 Microsoft 的 Netmon 检查流量,大多数时候这个设置似乎被忽略,Windows 一直在积累数据包然后再发送它们。我做错了什么?有没有其他方法可以强制 Windows 在数据包到达接口后立即发送小数据包?据我所知,Windows 使用 Nagle 来合并数据,但我无法使用注册表禁用它。我无法更改平台。

答案1

如果你对应用程序本身有任何控制权,可以设置套接字选项TCP节点延迟创建套接字时将产生您想要的效果。这会通知套接字禁用该连接的 Nagel。这可能是最可靠的方法。

听起来你已经发现了TcpAckFrequency注册表技巧;但如果还没有,如果你无法调整应用程序代码,它可能会提供一些帮助。为此:

  1. 找到你的界面HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces
  2. 创建一个名为 的新 32 位 DWORD 值TcpAckFrequency并将其设置为 1。

那里曾经有一个名为的密钥TcpNoDelay,但是它似乎已被 Win 2008 删除。

相关内容