我有一个在Windows Server 2008 R2上运行的networking应用程序,它必须在很短的时间间隔内发送小包,每个微秒都很重要。 我的问题是,窗口积累的数据包,并发送他们在一个大的TCP数据包,但我希望每个数据包分开发送。
我禁用中断适度的nic。 我也将接口的MTU大小设置为63(这是我的数据包的最小尺寸)。 我用微软的Netmon检查stream量,大部分时间这个设置似乎被忽略,Windows在发送数据包之前一直在积累数据包。 我究竟做错了什么? 数据包一到达接口,是否有其他方式强制windows发送小包? 据我所知,Windows正在使用Nagle来合并数据,但我无法使用registry来禁用它。 我无法改变平台。
如果您对应用程序本身有任何控制,则在创build套接字时设置套接字选项TCP_NODELAY将会产生您正在查找的效果。 这会通知套接字为该连接禁用Nagel。 这可能是最可靠的方法。
这听起来像你已经发现了TcpAckFrequency
registry技巧; 但是如果你没有,那么如果你不能调整应用程序代码,它可能会提供一些解决办法。 为了那个原因:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces
下find您的界面 TcpAckFrequency
的新的32位DWORD值并将其设置为1。 那里曾经有一个叫做TcpNoDelay
的键,但是它似乎已经在Win 2008中被移除了。