C 如何通过UDP套接字设置以太网服务级别?

C 如何通过UDP套接字设置以太网服务级别?,c,linux,sockets,udp,ethernet,C,Linux,Sockets,Udp,Ethernet,除了IP报头中的DSCP字段外,我还想设置UDP数据包的以太网帧报头中的字段,以确保网络硬件以正确的优先级处理数据包 当使用UDP套接字(使用SOCK_DGRAM类型创建)时,这是可能的,还是此功能仅通过原始以太网套接字(使用SOCK_raw类型创建)可用?某些操作系统允许您使用setsockopt()访问相关的IP字段类型的服务使用IP\u-TOS或SO\u-PRIORITY选项,但有些需要root用户才能执行此操作 我不知道有什么方法可以从sockdgram级别访问以太网帧头。由于IP级别独

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


当使用UDP套接字(使用SOCK_DGRAM类型创建)时,这是可能的,还是此功能仅通过原始以太网套接字(使用SOCK_raw类型创建)可用?

某些操作系统允许您使用
setsockopt()访问相关的IP字段类型的服务
使用
IP\u-TOS
SO\u-PRIORITY
选项,但有些需要root用户才能执行此操作

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

一个更好的地方可能是界面设置。例如,Solaris允许您使用
ifconfig
设置CoS。我不确定Linux是否有类似的版本。为了避免所有通信共享相同的CoS,您可以使用调整后的CoS包装接口别名,然后将套接字绑定到该别名


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

这是特定于OS的,那么你的平台是什么?@我的平台是代码> Linux 3.4.84-RT105 4,SMP抢占RT NOS,但我也有兴趣了解Windows:-)以太网COS只能在VLAN上使用。因此,需要配置vlan。在linux上,您可以使用
vconfig set\u express\u map
命令将套接字优先级映射到以太网CoS。默认出口映射是将所有套接字优先级映射到vlan头中的值0。套接字优先级可以用SO_priority和IP_TOS设置,并且可以有8个不同的值——尽管内核执行的从IP_TOS到套接字优先级的静态映射对我来说并不完全清楚。VLAN限制仅适用于Linux还是一般情况
SO_PRIORITY
应该直接映射到IP网络的ToS,几年前我用数据包跟踪验证了这一点。我从未考虑过它将如何映射到另一个方向。我不知道有任何网络设备实际使用ToS。MPLS似乎是处理局域网以外流量优先级的首选方法。不,它是通用的。没有vlan的以太网没有CoS。它是VLAN“头”中的一个字段,在没有VLAN的以太网帧中不存在。TOS已经过时好几年了,被(它重用了TOS中的许多位)取代。DSCP仍然使用IP_TOS选项设置,尽管其值为您使用IP_TOS设置的值的2-7位。Enterprise networking gear支持DSCP,并且大多数设备还可以配置为将DSCP映射到VLAN上的以太网CoS,就像使用
vconfig set\u exgress\u map
@SethNoble所做的一样。非常感谢迄今为止的想法,这已经有所帮助。关于直接访问以太网帧,您可能是对的,但我希望有某种机制(如SO_PRIORITY)允许设置底层传输的优先级——不管是什么。@否您是否介意添加您的注释作为答案,我认为它们是有价值的。