【问题标题】:How to set ethernet Class of Service via UDP socket?如何通过 UDP 套接字设置以太网服务等级?
【发布时间】:2014-05-08 21:23:19
【问题描述】:

除了 IP 标头中的 DSCP 字段之外,我还想在我的 UDP 数据包的以太网帧标头中设置 Class of Service 字段,以确保网络硬件以正确的优先级处理我的数据包。

在使用 UDP 套接字(使用 SOCK_DGRAM 类型创建)时是否有可能,或者此功能是否只能通过原始以太网套接字(使用 SOCK_RAW 类型创建)提供?

【问题讨论】:

  • 这是特定于操作系统的,那么您的平台是什么?
  • @nos 我的平台是Linux 3.4.84-rt105 #4 SMP PREEMPT RT
  • @nos 但我也有兴趣了解 Windows :-)

标签: c linux sockets udp ethernet


【解决方案1】:

某些操作系统允许您通过使用setsockopt()IP_TOSSO_PRIORITY 选项来访问相关的IP 字段服务类型,但有些操作系统需要root 才能这样做。

我不知道有任何方法可以从SOCK_DGRAM 级别访问以太网帧头。我不希望这样通常会起作用,因为 IP 级别独立于链接级别运行。换句话说,UDP/IP 套接字无法知道任何给定的数据报是否会在以太网、环回、火线、USB 或其他链接类型上结束。

界面设置可能更好看。例如,Solaris 允许您使用ifconfig 设置 CoS。我不确定Linux是否有等价物。为避免所有流量共享相同的 CoS,您可以使用调整后的 CoS 创建一个接口别名,然后将您的套接字绑定到该别名。

但首先要考虑的是你的网络硬件是否真的关注这些领域。

【讨论】:

  • 以太网 CoS 仅在 VLAN 上可用。因此需要配置一个vlan。在 linux 上,您可以使用 vconfig set_egress_map 命令将套接字优先级映射到以太网 CoS。默认出口映射是将所有套接字优先级映射到 vlan 标头中的值 0。套接字优先级可以同时使用 SO_PRIORITY 和 IP_TOS 设置,并且可以有 8 个不同的值——尽管内核执行的从 IP_TOS 到套接字优先级的静态映射对我来说并不完全清楚。
  • VLAN 限制仅适用于 Linux,还是一般? SO_PRIORITY 应该直接映射到 IP 网络的 ToS,几年前我通过数据包跟踪验证了这一点。我从来没有考虑过它会如何映射到另一个方向。我不知道任何实际使用 ToS 的网络设备。 MPLS 似乎是处理 LAN 以外流量优先级的首选方式。
  • 不,一般。没有 vlan 的以太网没有 CoS。它是 VLAN“标头”中的一个字段,它不存在于没有 vlan 的以太网帧中。 TOS 已经过时了好几年,被DSCP 取代(它重用了 TOS 中的许多位)。 DSCP 仍然使用 IP_TOS 选项设置,尽管它的值是您使用 IP_TOS 设置的第 2-7 位。企业网络设备支持 DSCP,并且大多数还可以配置为将 DSCP 映射到 vlan 上的以太网 CoS,就像使用 vconfig set_egress_map 一样。
  • @SethNoble 非常感谢到目前为止的想法,这已经有所帮助。您可能对直接访问以太网帧是正确的,但我希望有一些机制(如 SO_PRIORITY)允许设置底层传输的优先级——不管是什么。
  • @nos 您介意添加您的 cmets 作为答案吗,我认为它们很有价值。
猜你喜欢
  • 2018-10-19
  • 2010-10-15
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多