Linux 流量控制:如何使用網橋和 qdisc 對流量進行優先級排序?
我正在嘗試優先處理網路中基於 Linux 的軟體橋的流量。當我在本地(在託管網橋的機器上)生成流量時,流量的優先級正確。但是,“遠端”流量(來自通過網橋的其他節點)沒有優先級(相同的頻寬分配給所有發送者)。也許有人知道為什麼?
針對 I350 網路適配器(Linux 5.1.8-1-MANJARO #1 SMP PREEMPT Sun Jun 9 20:44:14 UTC 2019 x86_64 GNU/Linux)的 Bridge 設置如下:
brctl addbr br0 ip link set dev enp1s0f0 promisc on ip link set dev enp1s0f1 promisc on ip link set dev enp1s0f2 promisc on ip link set dev enp1s0f3 promisc on brctl addif br0 enp1s0f0 brctl addif br0 enp1s0f1 brctl addif br0 enp1s0f2 brctl addif br0 enp1s0f3 ip link set dev br0 up tc qdisc del dev enp1s0f0 root tc qdisc add dev enp1s0f0 root prio tc qdisc del dev enp1s0f1 root tc qdisc add dev enp1s0f1 root prio tc qdisc del dev enp1s0f2 root tc qdisc add dev enp1s0f2 root prio tc qdisc del dev enp1s0f3 root tc qdisc add dev enp1s0f3 root prio ip addr add 192.168.1.1/24 dev br0
UDP 流量是使用 iperf3 生成的,並通過適當地設置 TOS 欄位,例如
Low-Prio Sender: iperf3 -c 192.168.1.140 -u -b 100m -S 0x2 -p 5201 -t 30 Hi-Prio Sender : iperf3 -c 192.168.1.140 -u -b 100m -S 0x0 -p 5202 -t 30
Prio 地圖保留預設設置:priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
如果我明確對流量進行分類,則優先級適用於遠端流量:
tc filter add dev enp1s0f1 parent 1: protocol ip prio 10 u32 match ip dst 192.168.1.140 match ip dport 5201 0xffff flowid 1:1 tc filter add dev enp1s0f1 parent 1: protocol ip prio 20 u32 match ip dst 192.168.1.140 match ip dport 5202 0xffff flowid 1:2
但不是預設設置……也許這是第 2 層/第 3 層問題?
我回到這個話題是因為我在橋的埠上實現我的 qdisc 時遇到了同樣的麻煩。
使用 tc filter 的第一個解決方案對我不起作用。而arp解決方案似乎是一個很好的解決方案,但是當您使用DHCP時會出現問題,因為它通過OSI模型的第2層,而arp橋通過第3層(我看到您可以使用dhcp-helper來解決這個問題,但我不想用這個)。
所以我在我的嵌入式 Linux 系統中找到了另一個適合我的解決方案。
我用 VLAN 介面製作了第二個網橋:
我有第一個橋 br0,它與 eth0、eth1 和 eth2 建立連結。
同時,我有一個連接 eth0.100、eth1.100 和 eth2.100 的第二個網橋 br1。
使用這種方法,我的由 VLAN id 為 100 的 VLAN 標記組成的乙太網幀通過 br1,因此 PCP 用於映射我的數據包的優先級。當我使用tc -s -d qdisc ls dev eth0查看我的 qdisc 類時,我發現它解決了問題,我的 qdisc 現在可以使用優先級來調整我的流量。
希望這個解決方案可以幫助某人