PRIO qdisc 示例不起作用

PRIO qdisc 示例不起作用

我有一台装有 OpenWrt 12.09(r36088、Linux 3.3.8)的 TP-Link WR1043-ND。有一个名为 br-lan 的桥接器连接 eth0.1(4 个 LAN 端口的标记 VLAN)和 wlan0(Wi-Fi)。eth0.2 处还有 WAN 端口。目前,我想在 LARTC 中尝试一个示例,对桥接器内的 SSH 数据包进行分类,以便它们优先于其他流量。我的计算机直接连接到路由器的 br-lan 进行测量,中间或任何路由器端口中没有其他任何东西。

这是我在执行任何操作之前的 qdisc 设置:

qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc mq 0: dev wlan0 root

没有 iptables 规则,全部刷新且默认策略接受。

以下是拉拉训练中心第 9.5.3.2 节

我们将创建这棵树:

     1:   root qdisc
    / | \ 
  /   |   \
  /   |   \
1:1  1:2  1:3    classes
 |    |    |
10:  20:  30:    qdiscs    qdiscs
sfq  tbf  sfq

频段 0 1 2 批量流量将转至 30:,交互式流量将转至 20: 或 10:。

命令行:

# tc qdisc add dev eth0 root handle 1: prio<br>
This *instantly* creates classes 1:1, 1:2, 1:3
# tc qdisc add dev eth0 parent 1:1 handle 10: sfq<br>
# tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000
# tc qdisc add dev eth0 parent 1:3 handle 30: sfq                                

现在让我们看看我们创建了什么:

# tc -s qdisc ls dev eth0 qdisc sfq 30: quantum 1514b 已发送 0 字节 0 个包(丢弃 0,超出限制 0)

qdisc tbf 20: rate 20Kbit burst 1599b lat 667.6ms 
Sent 0 bytes 0 pkts (dropped 0, overlimits 0) 

 qdisc sfq 10: quantum 1514b 
 Sent 132 bytes 2 pkts (dropped 0, overlimits 0) 

 qdisc prio 1: bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
 Sent 174 bytes 3 pkts (dropped 0, overlimits 0) 

这是我运行上述命令后的 qdisc 设置,运行 tc qdisc show 后得到的结果:

qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc prio 1: dev br-lan root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc sfq 10: dev br-lan parent 1:1 limit 127p quantum 1514b depth 127 divisor 1024
qdisc tbf 20: dev br-lan parent 1:2 rate 20000bit burst 1600b lat 560.0ms
qdisc sfq 30: dev br-lan parent 1:3 limit 127p quantum 1514b depth 127 divisor 1024
qdisc mq 0: dev wlan0 root

tc -s qdisc ls dev br-lan 的示例输出:

qdisc prio 1: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
 Sent 52544 bytes 528 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc sfq 10: parent 1:1 limit 127p quantum 1514b depth 127 divisor 1024
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc tbf 20: parent 1:2 rate 20000bit burst 1600b lat 560.0ms
 Sent 23492 bytes 206 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc sfq 30: parent 1:3 limit 127p quantum 1514b depth 127 divisor 1024
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0

我的 ssh 数据包被错误分类,全部被发送到 20:。scp 数据包和所有其他数据包也都一样。

如果我理解正确的话,PRIO 会查看 TOS 字段以了解将数据包设置为哪个频段,并且根据 priomap,TOS 为 0x10 (SSH) 的数据包应发送到频段 0 (10:),而 TOS 为 0x08 (SCP) 的数据包应最终发送到频段 2 (30:)。我已通过查看计算机上的 wireshark 确认数据包的 TOS 设置正确,并且通过查看路由器内部的 tcpdump 输出确认 TOS 已到达路由器。但一切仍然最终位于 20:。

有什么想法可以解释原因吗?

提前致谢。

答案1

查看调度程序手册prio( man tc-prio) 以了解 TOS 位与 priomap 的关系。TOS 0x08 和 TOS 0x10 分别对应于 priomap 条目 #5 和 #9,在您的示例中,它们都映射到 band 1,对应于 qdisc 20:

你应该改变 priomap 以将 TOS-LowDelay 数据包发送到 band 0

相关内容