我有一台装有 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