简短版本:我尝试在应用程序发送的流量上设置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有时可能很弱,但是关于Windows10支持IP_TOS的信息似乎相当稀少。我有一个MSDN Doc说不要使用它(而不是使用QoS API),但它在Windows 10中受支持,我认为这意味着它可以设置。我也有一个旧的support doc,它说必须启用支持,但我找不到与Windows 10相关的最新文档。我确实尝试了注册表调整,加上第二个(不要使用NLA),但没有帮助。
我现在有点不知所措,所以我希望有人以前处理过这个问题,并有一个解决方案来设置套接字上的IP_TOS。真的尝试避免引入另一个API或调用应用程序之外(netsh或组策略),以实现一些应该很简单的事情。
1条答案
按热度按时间kgsdhlau1#
TOS在操作系统中默认禁用(不完美)
要启用TOS,请使用regedit:HKEY_LOCAL_MACHINE\系统\当前控制集\服务\Tcpip\参数\禁用用户TOSS设置
https://learn.microsoft.com/en-us/previous-versions/windows/desktop/dd874008(v=vs.85)