Windows 10 ignores setsockopt IP_TOS

Windows 10 ignores setsockopt IP_TOS

本文关键字:TOS IP setsockopt ignores Windows      更新时间:2023-10-16

简短版本:我正在尝试在我的应用程序发送的流量上设置IP_TOS字段,即使setsockopt成功返回并且getsockopt返回正确的IP_TOS值,流量在离开Windows 10框时是未标记的。

更长的版本:我有一个应用程序,它发送需要设置IP_TOS字段的流量,并且IP_TOS值可以是一系列值中的一个;这是一个环境要求,所以没有办法绕过它。应用程序还需要跨平台(Windows 10和Linux(。考虑到这些要求,我们决定只使用 boost asio,并在创建时在套接字上设置IP_TOS。

Linux 端按照我们想要的方式工作,创建套接字,设置IP_TOS,发送数据,tcpdump 显示数据在发送端和接收端正确标记。

Windows端执行除实际标记流量之外的所有操作。套接字被创建,IP_TOS设置并读回以在发送之前进行验证,但是wireshark/tcpdump显示流量根本没有被标记(IP_TOS为0(。当我们开始看到这个问题时,我们使用普通的Windows TCP套接字创建了一个简单的测试应用程序,使用setsockopt和getsockopt设置和读取IP_TOS,但仍然有同样的问题。

我的google-fu有时可能很弱,但有关Windows 10支持IP_TOS的信息似乎相当稀少。我有一个MSDN文档说两者都不使用它(而是使用QoS API(,但它在Windows 10中受支持,我认为这意味着可以设置它。我还有一个较旧的支持文档,说必须启用支持,但我找不到与 Windows 10 相关的更新文档。我确实尝试了注册表调整,加上第二个(不使用NLA(,但没有帮助。

我现在有点不知所措,所以我希望有人以前处理过这个问题,并且有一个解决方案来设置IP_TOS在插座上。真正尝试避免引入另一个 API 或在应用程序(netsh 或组策略(之外进行调用以实现应该简单的事情。

TOS在OS中默认禁用(不完美(

要启用 TOS,请使用注册表编辑器:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersDisableUserTOSSetting

请参阅:设置服务类型 (TOS( 位