TC是否可以通过IP头的Qos字段限制带宽?

我们正在开发客户端/服务器应用程序。 在我们的服务器应用程序中有三种types的networking数据:诸如video/audio的实时数据,诸如数据库数据和BestEfforts数据的关键数据的那些数据,如通常的文件传输。

我们打算设置每个IP数据包的QOS字段,以指示上面三个IP数据包属于哪个数据types,然后使用TC为这三种types的数据设置不同的最大速率。

据我所知,设置qos字段是可行的,但我不知道是否可以通过指定qos值(IP头中的QOS字段的值)来限制ip包的速率。

我想你的意思是在IPv4数据包头中的8位TOS字段。 你有没有读过LARTC HOWTO ? 这是你一定要阅读的指南。 简而言之,你需要

1)定义QDISCsCLASSes在这些QDISCsCLASSes中对stream量进行分类,优先sorting和整形( 出口stream量只能被整形!!! )。 一般来说,任何需要发送的数据包都会被QDISC到networking接口的QDISC中。

 CEIL=10 tc qdisc add dev eth0 root handle 1: htb default 15 tc class add dev eth0 parent 1: classid 1:1 htb rate ${CEIL}mbit ceil ${CEIL}mbit tc class add dev eth0 parent 1:1 classid 1:10 htb rate 4mbit ceil ${CEIL}mbit prio 0 tc class add dev eth0 parent 1:1 classid 1:11 htb rate 1mbit ceil ${CEIL}mbit prio 1 tc class add dev eth0 parent 1:1 classid 1:12 htb rate 6mbit ceil ${CEIL}mbit prio 2 tc qdisc add dev eth0 parent 1:11 handle 110: sfq perturb 10 tc qdisc add dev eth0 parent 1:12 handle 120: sfq perturb 10 

首先尝试较低的prio字段。 所以1:10类可能专门用于需要最小延迟的数据包。 类1:11和1:12附加了SFQ排队规则,以确保更公平的带宽共享。

2)定义filter将数据包入队到正确的CLASS

 tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 10 fw classid 1:10 tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 11 fw classid 1:11 tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 12 fw classid 1:12 

这只是告诉一个标记为10的数据包会进入第10类,依此类推。

3)定义iptables规则来标记一个数据包,使其排入正确的CLASS

 iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 0x10 iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 0x11 iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 0x12 

我有意使用iptables tos模块向您展示如何匹配TOS字段的特定值并相应地标记它。 有关此模块运行的更多信息

 iptables -m tos --help