2012-01-05 113 views
7

我有一个场景,客户端在设置了一些IP TOS值后打开TCP连接到服务器(setsockopt(.., IP_TOS, ..)。在服务器上,我想检索接收到的TOS值并将其设置在套接字上这样收到的TOS会反射回服务器端客户端的数据包上检索TCP套接字上的TOS值

问题是,在服务器端,我如何检索从客户端收到的TOS值?我可以假设客户端不会更改TOS值,因此一开始就可以获得并设置TOS值。

设置IP_RECVTOS并使用辅助数据适用于UDP,但不适用于TCP套接字。在TCP套接字上可以达到类似的效果吗? getsockopt(2)SO_PRIORITYIP_TOS返回本地套接字上配置的值。所以如果我在本地做了setsockopt()那么getsockopt()反映了这个价值。它不反映网络上收到的内容。

+0

只是想知道,但为什么你会让一个远端配置选项改变_your_出站流量优先级? – Alnitak 2012-01-05 08:43:08

+0

很长一段时间,ToS已被DSCP取代。 – 2016-12-26 17:10:58

回答

2

对于收到的每个TCP数据报,TOS值可能会发生变化。

因此,收到 TCP套接字并不是一个常数选项。

从后者可以得出结论,接收方不可能从接收方TCP套接字中获取TOS值,该值可能是使用getsockopt()读取的值。

由于没有像“辅助消息”可用于TCP这样的功能,所以我发现发件人设置为TOS的唯一方式是直接检查接收到的TCP数据报的标头。

+0

是同意TCP和像TOS这样的数据包数量的矛盾。这就是为什么我提到我们可以假设客户在会话的整个生命周期内不会改变它的价值。至于你对直接检查收到的标题的评论,你的意思是使用类似iptables的东西来读取和设置DSCP值,或者你有其他的想法吗? – SanjayT 2012-01-06 00:20:42

+1

我没有什么特别的想法。我只想指出,TOS值不一定是接收套接字的属性。此外,如果您不更改发送套接字的TOS值,则可能不会发生这种情况,因为在传输TCP数据报期间,它们的标头可能会因中间跳跃而在这方面进行修改。 – alk 2012-01-06 12:25:01

+1

@SanjayT:你可能会看看libpcap让应用程序监视它自己在较低级别的传入TCP连接。 – alk 2012-01-06 19:24:40