在TCP套接字上检索TOS值

7
我有一个场景,其中客户端在设置一些IP TOS值 (setsockopt(.., IP_TOS, ..)) 后打开到服务器的TCP连接。在服务器上,我想要检索接收到的TOS值并将其设置在套接字上,以便在服务器-客户端数据包上反映回接收的TOS。
问题是,在服务器端,如何检索从客户端接收到的TOS值?我可以假设客户端在整个会话期间不会更改TOS值,因此只需最初获取和设置TOS值即可满足要求。
对于UDP工作,设置IP_RECVTOS并使用辅助数据可以实现,但对于TCP套接字却无效。如何在TCP套接字上实现类似的功能呢?使用 getsockopt(2)SO_PRIORITYIP_TOS可以返回本地套接字上配置的值。因此,如果我在本地执行了setsockopt(),那么getsockopt()就会反映该值,而不是网络中收到的值。

只是好奇,但为什么你会让远端配置的选项改变_你自己_的出站流量优先级呢? - Alnitak
很长一段时间以来,DSCP已经取代了ToS。 - Ron Maupin
1个回答

2

TOS的值可能会因为每个接收到的TCP数据报而改变。

因此,它不是接收TCP套接字的恒定选项。

由此可以得出结论,接收者不能通过使用getsockopt()读取该选项的值从接收TCP套接字中获取TOS的值。

由于对于TCP没有可用的“辅助消息”功能,我唯一看到的方法是直接检查接收到的TCP数据报头,以了解发送者设置的TOS值。


同意TCP和TOS之间的矛盾,这是我提到过我们可以假设客户端在会话期间不会更改TOS的原因。至于你关于直接检查接收到的头部的评论,你是指使用类似iptables来读取和设置DSCP值,还是有其他想法? - SanjayT
1
我并没有特别想法,只是想指出TOS值不一定是接收套接字的属性。此外,如果您不更改发送套接字的TOS值,在传输TCP数据报时,它们的头可能会在中间跳中被修改。 - alk
1
@SanjayT:您可以看一下libpcap,让应用程序在更低的级别上监视自己的传入TCP连接。 - alk
@SanjayT:使用 ipfw 也可以,但是由于你只想读取后者,可能会带来太多的开销。 - alk
谢谢您的建议。我可能会选择在内核中进行更改。 - SanjayT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接