【问题标题】:retrieving TOS value on a TCP socket在 TCP 套接字上检索 TOS 值
【发布时间】:2012-02-02 22:17:38
【问题描述】:

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

问题是,在服务器端,如何检索从客户端接收到的 TOS 值?我可以假设客户端在整个会话期间不会更改 TOS 值,因此最初获取和设置一次 TOS 值就足够了。

设置IP_RECVTOS 并使用辅助数据适用于 UDP,但不适用于 TCP 套接字。如何在 TCP 套接字上实现类似的功能? getsockopt(2)SO_PRIORITYIP_TOS 返回本地套接字上的配置值。因此,如果我在本地执行 setsockopt(),那么 getsockopt() 会反映该值。它没有反映网络上收到的内容。

【问题讨论】:

  • 只是想知道,但您为什么要让远端配置选项更改您的出站流量优先级?
  • ToS 已经被 DSCP 取代很长时间了。

标签: c++ c sockets networking


【解决方案1】:

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

所以它不是接收 TCP 套接字的固定选项。

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

由于没有像 TCP 可用的“辅助消息”这样的功能,我看到找出 sender 设置为 TOS 的唯一方法是直接检查接收到的 TCP 数据报的标头。

【讨论】:

  • 是的,同意TCP和TOS这种按包数量分包的矛盾。这就是为什么我提到我们可以假设客户端在会话的生命周期内不会改变 tos 的价值。至于您对直接检查收到的标头的评论,您的意思是使用 iptables 之类的东西来读取和设置 DSCP 值还是您有其他想法?
  • 我并没有什么特别的想法。我只是想指出 TOS 值不一定是接收套接字的属性。此外,我想说,如果您不更改发送套接字的 TOS 值,甚至可能不是这种情况,因为在传输 TCP 数据报期间,它们的标头可能会在这方面被中间跃点修改。
  • @SanjayT:你可以看看 libpcap 让应用程序在较低级别监控它自己的传入 TCP 连接。
  • @SanjayT:使用ipfw 也可以,无论如何,因为您只想阅读后者可能会带来很多开销。
  • 感谢您的建议。我可能会在内核中进行更改。
猜你喜欢
  • 2017-11-08
  • 2018-12-16
  • 1970-01-01
  • 2017-01-18
  • 2017-05-25
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多