Bài 4: IPv6 QoS

Tiếp tục sử dụng hạ tầng kết nối router từ các bài thực hành trước. Trong bài này, 3 dòng dữ liệu truyền từ trạm C0 đến C4, C1 đến C3 và C2 đến C3 được thiết lập thông số QoS khác nhau để dòng C0 => C4 luôn được đảm bảo chất lượng cho dù các dòng kia đòi hỏi băng thông vượt quá năng lực của hạ tầng mạng. Giải pháp là sử dụng trường Traffic Class để thiết lập ưu tiên cho dòng C0=>C4 và sử dụng Traffic Control trong các Linux router để cài đặt xử lý các gói tin theo mức ưu tiên khác nhau. Các bước thực hiện:

  • Bước 1: Kiểm tra băng thông các dòng dữ liệu cạnh tranh.
  • Bước 2: Cấu hình Traffic Control cho các router để xử lý ưu tiên các dòng.
  • Bước 3: Kiểm tra tính chất QoS của hệ thống.
  • Bước 4: Áp dụng trường Traffic Class.
  • Bước 5: Áp dụng trường Flow Label.

Bước 1: Kiểm tra băng thông các dòng dữ liệu cạnh tranh

Kiểm tra băng thông dòng dữ liệu toàn mạng từ C0 đến C4 với iperf3. C4 chạy iperf3 chế độ server, C0 chạy iperf3 chế độ client. Thông số hiển thị cho biết hệ thống kết nối từ C0, đi qua tất cả các router, đến C4 với băng thông khoảng 110Mbps:

[root@C4 ~]# iperf3 -s -p 5001
-----------------------------------------------------------
Server listening on 5001
-----------------------------------------------------------
Accepted connection from fec0::7, port 55694
[  5] local 2000::7 port 5001 connected to fec0::7 port 55695
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  8.58 MBytes  71.9 Mbits/sec                 
[  5]   1.00-2.00   sec  7.65 MBytes  64.1 Mbits/sec                 
[  5]   2.00-3.00   sec  12.0 MBytes   101 Mbits/sec                 
[  5]   3.00-4.00   sec  16.4 MBytes   138 Mbits/sec                 
[  5]   4.00-5.00   sec  13.4 MBytes   112 Mbits/sec                 
[  5]   5.00-6.00   sec  17.9 MBytes   150 Mbits/sec                 
[  5]   6.00-7.00   sec  14.7 MBytes   123 Mbits/sec                 
[  5]   7.00-8.00   sec  7.52 MBytes  63.2 Mbits/sec                  
[  5]   8.00-9.00   sec  16.4 MBytes   138 Mbits/sec                 
[  5]   9.00-10.00  sec  15.8 MBytes   132 Mbits/sec                 
[  5]  10.00-10.03  sec   471 KBytes   115 Mbits/sec                 
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.03  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.03  sec   131 MBytes   109 Mbits/sec                  receiver

 

[root@C0 ~]# iperf3 -6 -c 2000::7 -p 5001
Connecting to host 2000::7, port 5001
[  4] local fec0::7 port 55695 connected to 2000::7 port 5001
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  9.68 MBytes  81.1 Mbits/sec    0    361 KBytes      
[  4]   1.00-2.00   sec  8.18 MBytes  68.7 Mbits/sec    0    582 KBytes      
[  4]   2.00-3.00   sec  12.4 MBytes   104 Mbits/sec   79    565 KBytes      
[  4]   3.00-4.00   sec  16.2 MBytes   136 Mbits/sec   73    449 KBytes      
[  4]   4.00-5.00   sec  13.7 MBytes   115 Mbits/sec    0    491 KBytes      
[  4]   5.00-6.00   sec  18.0 MBytes   151 Mbits/sec    0    517 KBytes      
[  4]   6.00-7.00   sec  13.5 MBytes   113 Mbits/sec    0    531 KBytes      
[  4]   7.00-8.00   sec  8.15 MBytes  68.4 Mbits/sec   30    385 KBytes      
[  4]   8.00-9.00   sec  16.9 MBytes   142 Mbits/sec    0    421 KBytes      
[  4]   9.00-10.00  sec  15.5 MBytes   130 Mbits/sec    0    442 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   132 MBytes   111 Mbits/sec  182             sender
[  4]   0.00-10.00  sec   131 MBytes   110 Mbits/sec                  receiver

iperf Done.

Tạo thêm một dòng dữ liệu từ  C1 đến C3, sau đó tạo dòng dữ liệu C0 đến C4 trong khi dòng C1=>C3 chưa kết thúc. Có thể thấy băng thông dòng C0=>C4 đã giảm đáng kể, xuống còn khoảng 25Mbps:

[root@C1 ~]# iperf3 -6 -t 10 -c fec3::7 -p 5001
Connecting to host fec3::7, port 5001
[  4] local fec1::7 port 41055 connected to fec3::7 port 5001
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  6.64 MBytes  55.7 Mbits/sec    0    289 KBytes      
[  4]   1.00-2.00   sec  8.16 MBytes  68.4 Mbits/sec    0    559 KBytes       
[  4]   2.00-3.00   sec  11.1 MBytes  93.0 Mbits/sec   42    336 KBytes      
[  4]   3.00-4.00   sec  8.38 MBytes  70.6 Mbits/sec    0    367 KBytes      
[  4]   4.00-5.00   sec  6.20 MBytes  52.0 Mbits/sec    0    388 KBytes      
[  4]   5.00-6.00   sec  6.01 MBytes  50.4 Mbits/sec   14    284 KBytes      
[  4]   6.00-7.00   sec  5.45 MBytes  45.7 Mbits/sec    0    311 KBytes      
[  4]   7.00-8.00   sec  9.60 MBytes  80.5 Mbits/sec    0    328 KBytes      
[  4]   8.00-9.00   sec  6.78 MBytes  56.9 Mbits/sec    0    333 KBytes      
[  4]   9.00-10.00  sec  7.27 MBytes  61.0 Mbits/sec    0    335 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  75.6 MBytes  63.4 Mbits/sec   56             sender
[  4]   0.00-10.00  sec  74.5 MBytes  62.5 Mbits/sec                  receiver

[root@C0 ~]# iperf3 -6 -t 4 -c 2000::7 -p 5001
Connecting to host 2000::7, port 5001
[  4] local fec0::7 port 55705 connected to 2000::7 port 5001
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  1.44 MBytes  12.0 Mbits/sec    0    109 KBytes      
[  4]   1.00-2.00   sec  2.97 MBytes  25.0 Mbits/sec    0    227 KBytes      
[  4]   2.00-3.00   sec  3.96 MBytes  33.2 Mbits/sec    2    245 KBytes      
[  4]   3.00-4.00   sec  3.55 MBytes  29.8 Mbits/sec    0    283 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-4.00   sec  11.9 MBytes  25.0 Mbits/sec    2             sender
[  4]   0.00-4.00   sec  11.6 MBytes  24.4 Mbits/sec                  receiver

iperf Done.

Tiếp tục tạo thêm dòng dữ liệu C2=>C3 và chạy song song cả 3 dòng dữ liệu, băng thông C0=>C4 giảm tiếp xuống còn khoảng 5.8Mbps.

[root@C0 ~]# iperf3 -6 -c 2000::7 -p 5001
Connecting to host 2000::7, port 5001
[  4] local fec0::7 port 55755 connected to 2000::7 port 5001
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   123 KBytes  1.00 Mbits/sec    0   32.1 KBytes      
[  4]   1.00-2.00   sec   234 KBytes  1.92 Mbits/sec    0   54.4 KBytes      
[  4]   2.00-3.00   sec   240 KBytes  1.97 Mbits/sec    0   65.5 KBytes      
[  4]   3.00-4.00   sec   445 KBytes  3.64 Mbits/sec    0   86.5 KBytes      
[  4]   4.00-5.00   sec   597 KBytes  4.88 Mbits/sec    0    114 KBytes      
[  4]   5.00-6.00   sec   731 KBytes  5.99 Mbits/sec    0    145 KBytes      
[  4]   6.00-7.00   sec   845 KBytes  6.92 Mbits/sec    0    183 KBytes      
[  4]   7.00-8.00   sec  1.57 MBytes  13.2 Mbits/sec    0    250 KBytes      
[  4]   8.00-9.00   sec  1.41 MBytes  11.9 Mbits/sec    0    312 KBytes      
[  4]   9.00-10.00  sec  1.13 MBytes  9.46 Mbits/sec    0    364 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  7.25 MBytes  6.08 Mbits/sec    0             sender
[  4]   0.00-10.00  sec  6.91 MBytes  5.80 Mbits/sec                  receiver

iperf Done.

Nhìn vào sơ đồ kết nối mạng có thể thấy ngay các dòng dữ liệu C0=>C4, C1=>C3, C2=>C3 sử dụng chung kênh truyền giữa R3 và R4. Khi xuất hiện dòng C1=>C3 và C2=>C3, băng thông dòng C0=>C4 bị giảm đi tốc độ truyền dữ liệu của kênh vật lý giữa R3 và R4 không đủ lớn (bằng tổng 3 băng thông dòng dữ liệu cộng lại). Điều này có thể thấy rõ hơn khi hạn chế băng thông vật lý của các card mạng R3 xuống còn 10Mbps:

VBoxManage bandwidthctl "R3" add Limit10m --type network --limit 10m

VBoxManage modifyvm "R3" --nicbandwidthgroup3 Limit10m

VBoxManage modifyvm "R3" --nicbandwidthgroup4 Limit10m

Khi đó, nếu chỉ có riêng dòng C0=>C4, băng thông là khoảng 10Mbps.

[root@C0 ~]# iperf3 -6 -c 2000::7 -p 5001
Connecting to host 2000::7, port 5001
[  4] local fec0::7 port 55769 connected to 2000::7 port 5001
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  1.37 MBytes  11.4 Mbits/sec    0   83.7 KBytes      
[  4]   1.00-2.00   sec  1.24 MBytes  10.4 Mbits/sec    0    138 KBytes      
[  4]   2.00-3.00   sec  1.11 MBytes  9.29 Mbits/sec    0    185 KBytes      
[  4]   3.00-4.00   sec  1.18 MBytes  9.90 Mbits/sec    0    233 KBytes      
[  4]   4.00-5.00   sec  1.19 MBytes  10.0 Mbits/sec    0    278 KBytes      
[  4]   5.00-6.00   sec  1.21 MBytes  10.2 Mbits/sec    0    311 KBytes      
[  4]   6.00-7.00   sec  1.10 MBytes  9.25 Mbits/sec    0    344 KBytes      
[  4]   7.00-8.00   sec  1.29 MBytes  10.8 Mbits/sec    0    357 KBytes      
[  4]   8.00-9.00   sec  1.01 MBytes  8.49 Mbits/sec    0    386 KBytes      
[  4]   9.00-10.00  sec  1.42 MBytes  11.9 Mbits/sec    0    421 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  12.1 MBytes  10.2 Mbits/sec    0             sender
[  4]   0.00-10.00  sec  11.6 MBytes  9.72 Mbits/sec                  receiver

iperf Done.

Và nếu có 2 dòng C1=>C3, C2=>C3 xuất hiện thì băng thông C0=>C4 giảm xuống còn trên 700Kbps.

[root@C0 ~]# iperf3 -6 -c 2000::7 -p 5001
Connecting to host 2000::7, port 5001
[  4] local fec0::7 port 55771 connected to 2000::7 port 5001
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  16.7 KBytes   137 Kbits/sec    0   13.9 KBytes      
[  4]   1.00-2.00   sec  62.8 KBytes   514 Kbits/sec    0   20.9 KBytes      
[  4]   2.00-3.00   sec  94.8 KBytes   775 Kbits/sec    0   37.7 KBytes      
[  4]   3.00-4.00   sec  83.7 KBytes   688 Kbits/sec    0   57.2 KBytes      
[  4]   4.00-5.00   sec   123 KBytes  1.01 Mbits/sec    0   61.4 KBytes      
[  4]   5.00-6.00   sec  64.1 KBytes   524 Kbits/sec    0   65.5 KBytes      
[  4]   6.00-7.00   sec   142 KBytes  1.17 Mbits/sec    0   69.7 KBytes      
[  4]   7.00-8.00   sec  78.1 KBytes   640 Kbits/sec    0   75.3 KBytes      
[  4]   8.00-9.00   sec   145 KBytes  1.19 Mbits/sec    0   83.7 KBytes      
[  4]   9.00-10.00  sec   148 KBytes  1.21 Mbits/sec    0   94.8 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   958 KBytes   785 Kbits/sec    0             sender
[  4]   0.00-10.00  sec   858 KBytes   702 Kbits/sec                  receiver

iperf Done.

Bước 2: Cấu hình Traffic Control cho các router để xử lý ưu tiên các dòng

Ta sẽ điều khiển các luồng giao thông C0=>C4, C1=>C3, C2=>C3 bằng cách sử dụng tính năng Traffic Control trên router R3. Lưu ý rằng, tính năng Traffic Control chỉ tác động lên các gói tin gửi đi nên việc triển khai trên R3 phải được thực hiện tại kết nối mạng eth4 (fec3::1), là nơi các dòng dữ liệu đi từ router R3 ra mạng.
Tạo qdisc root là prio để các gói tin được xử lý độc lập theo 3 luồng. Khi đó, các lớp được tự động tạo ra cho 3 luồng này có classid là 1:1, 1:2 và 1:3.

[root@R3 ~]# tc qdisc add dev eth4 root handle 1: prio
[root@R3 ~]# tc qdisc show dev eth4
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

[root@R3 ~]# tc class show dev eth4
class prio 1:1 parent 1:
class prio 1:2 parent 1:
class prio 1:3 parent 1:

Hạn chế băng thông các luồng 1:2 và 1:3 tương ứng là 500kbps và 1mbps để ưu tiên luồng 1:1 bằng cách trên luồng 1:2 và 1:3 gán qdisc tbf với các thông số giới hạn băng thông.

[root@R3 ~]# tc qdisc add dev eth4 parent 1:2 handle 20: tbf rate 500kbit burst 3000 limit 5000
[root@R3 ~]# tc qdisc add dev eth4 parent 1:3 handle 30: tbf rate 1mbit burst 3000 limit 9000
[root@R3 ~]# tc qdisc show dev eth4
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
qdisc tbf 20: parent 1:2 rate 100000bit burst 1000b lat 80.0ms
qdisc tbf 30: parent 1:3 rate 1000Kbit burst 3000b lat 16.0ms

Cuối cùng, thiết lập các filter để lọc các gói tin và đưa vào các hàng đợi tương ứng. Có thể lọc gói tin theo nhiều tiêu chí, ví dụ như địa chỉ IP nguồn. Luồng từ C0 (fec0::7) được ưu tiên vào flow 1:1, hai luồng còn lại từ C1 (fec1::7) và C2 (fec2::7) được đưa vào flow 1:2 và 1:3 để hạn chế băng thông:

[root@R3 ~]# tc filter add dev eth4 parent 1: protocol ipv6 u32 match ip6 src fec0::7 flowid 1:1
[root@R3 ~]# tc filter add dev eth4 parent 1: protocol ipv6 u32 match ip6 src fec1::7 flowid 1:2
[root@R3 ~]# tc filter add dev eth4 parent 1: protocol ipv6 u32 match ip6 src fec2::7 flowid 1:3

[root@R3 ~]# tc filter show dev eth4
filter parent 1: protocol ipv6 pref 49150 u32
filter parent 1: protocol ipv6 pref 49150 u32 fh 802: ht divisor 1
filter parent 1: protocol ipv6 pref 49150 u32 fh 802::800 order 2048 key ht 802 bkt 0 flowid 1:3
match fec20000/ffffffff at 8
match 00000000/ffffffff at 12
match 00000000/ffffffff at 16
match 00000007/ffffffff at 20
filter parent 1: protocol ipv6 pref 49151 u32
filter parent 1: protocol ipv6 pref 49151 u32 fh 801: ht divisor 1
filter parent 1: protocol ipv6 pref 49151 u32 fh 801::800 order 2048 key ht 801 bkt 0 flowid 1:2
match fec10000/ffffffff at 8
match 00000000/ffffffff at 12
match 00000000/ffffffff at 16
match 00000007/ffffffff at 20
filter parent 1: protocol ipv6 pref 49152 u32
filter parent 1: protocol ipv6 pref 49152 u32 fh 800: ht divisor 1
filter parent 1: protocol ipv6 pref 49152 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1
match fec00000/ffffffff at 8
match 00000000/ffffffff at 12
match 00000000/ffffffff at 16
match 00000007/ffffffff at 20

Bước 3: Kiểm tra tính chất QoS của hệ thống

Chạy iperf3 trên C2 để kết nối đến C3 (luồng số 3 - flow id 1:3) sẽ thấy băng thông đo được là 964Kbps, không vượt quá ngưỡng đã thiết lập (1Mbps):

[root@C2 ~]# iperf3 -6 -t 10  -c fec3::7 -p 5003
Connecting to host fec3::7, port 5003
[  4] local fec2::7 port 37118 connected to fec3::7 port 5003
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   156 KBytes  1.28 Mbits/sec   32   5.58 KBytes      
[  4]   1.00-2.00   sec   100 KBytes   821 Kbits/sec    7   4.18 KBytes      
[  4]   2.00-3.00   sec   117 KBytes   961 Kbits/sec    7   2.79 KBytes      
[  4]   3.00-4.00   sec   117 KBytes   960 Kbits/sec    7   4.18 KBytes      
[  4]   4.00-5.00   sec   117 KBytes   960 Kbits/sec    6   5.58 KBytes      
[  4]   5.00-6.00   sec   117 KBytes   959 Kbits/sec    7   5.58 KBytes      
[  4]   6.00-7.00   sec   117 KBytes   961 Kbits/sec    7   4.18 KBytes      
[  4]   7.00-8.00   sec   117 KBytes   959 Kbits/sec    7   2.79 KBytes      
[  4]   8.00-9.00   sec   100 KBytes   822 Kbits/sec    7   2.79 KBytes      
[  4]   9.00-10.00  sec   117 KBytes   961 Kbits/sec    7   4.18 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  1.15 MBytes   964 Kbits/sec   94             sender
[  4]   0.00-10.00  sec  1.13 MBytes   945 Kbits/sec                  receiver

Chạy iperf3 trên C1 để kết nối đến C3 (luồng số 2 - flow id 1:2), cũng thu được kết quả tương tự. Băng thông luồng này đo được là 493Kbps.

[root@C1 ~]# iperf3 -6 -c fec3::7 -p 5002
Connecting to host fec3::7, port 5002
[  4] local fec1::7 port 49804 connected to fec3::7 port 5002
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  94.8 KBytes   777 Kbits/sec   26   5.58 KBytes      
[  4]   1.00-2.00   sec  55.8 KBytes   457 Kbits/sec    5   4.18 KBytes      
[  4]   2.00-3.00   sec  66.9 KBytes   548 Kbits/sec    3   5.58 KBytes      
[  4]   3.00-4.00   sec  50.2 KBytes   411 Kbits/sec    4   2.79 KBytes      
[  4]   4.00-5.00   sec  50.2 KBytes   411 Kbits/sec    3   5.58 KBytes      
[  4]   5.00-6.00   sec  66.9 KBytes   549 Kbits/sec    4   4.18 KBytes      
[  4]   6.00-7.00   sec  50.2 KBytes   411 Kbits/sec    3   4.18 KBytes      
[  4]   7.00-8.00   sec  66.9 KBytes   549 Kbits/sec    3   5.58 KBytes      
[  4]   8.00-9.00   sec  50.2 KBytes   411 Kbits/sec    4   2.79 KBytes      
[  4]   9.00-10.00  sec  50.2 KBytes   412 Kbits/sec    3   5.58 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   602 KBytes   493 Kbits/sec   58             sender
[  4]   0.00-10.00  sec   576 KBytes   472 Kbits/sec                  receiver

Cuối cùng, cho cả 3 luồng cùng chạy và đo băng thông luồng C0=>C4 (flow id 1:1), thu được giá trị 107Mbps.

[root@C0 ~]# iperf3 -6  -c 2000::7 -p 5002
Connecting to host 2000::7, port 5002
[  4] local fec0::7 port 33677 connected to 2000::7 port 5002
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  14.0 MBytes   118 Mbits/sec    0    464 KBytes      
[  4]   1.00-2.00   sec  11.5 MBytes  96.1 Mbits/sec    0    728 KBytes      
[  4]   2.00-3.00   sec  14.7 MBytes   123 Mbits/sec  107    665 KBytes      
[  4]   3.00-4.00   sec  15.0 MBytes   126 Mbits/sec   37    519 KBytes      
[  4]   4.00-5.00   sec  14.3 MBytes   120 Mbits/sec    0    556 KBytes      
[  4]   5.00-6.00   sec  14.4 MBytes   121 Mbits/sec    0    582 KBytes      
[  4]   6.00-7.00   sec  11.5 MBytes  96.8 Mbits/sec    2    414 KBytes      
[  4]   7.00-8.00   sec  12.7 MBytes   106 Mbits/sec    0    453 KBytes      
[  4]   8.00-9.00   sec  9.37 MBytes  78.7 Mbits/sec    0    478 KBytes      
[  4]   9.00-10.00  sec  10.2 MBytes  85.1 Mbits/sec    0    495 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   128 MBytes   107 Mbits/sec  146             sender
[  4]   0.00-10.00  sec   126 MBytes   105 Mbits/sec                  receiver

Bước 4: Áp dụng trường Traffic Class trong IPv6

Trong các bước trên, địa chỉ nguồn của gói tin IPv6 được sử dụng để xác định lớp dịch vụ (flow id) cho nó và thực hiện ưu tiên. Để đảm bảo các router có thể thực hiện chức năng QoS dựa vào trường Traffic Class, cần sửa lại các filter đã thiết lập. Linux tc u32 filter hỗ trợ option dsfiled để lọc trường Traffic Class nhưng rất tiếc nó chỉ hỗ trợ IPv4, chưa hỗ trợ IPv6. Ví dụ, filter sau đây được thiết lập để lọc các gói tin IP thuộc lớp Traffic Class 0x12 (lớp AF21: Drop probability: Low, Equivalent IP precedence value: Immediate):

[root@R3 ~]# tc filter add dev eth4 parent 1: protocol ip \
                                u32 match ip dsfield 0x12 0x1e flowid 1:1

Đối với IPv6, ta sử dụng kiểu lọc u32 theo vị trí bit (gọi là general selector). Traffic Class có độ dài byte bắt đầu từ bit thứ 4 (byte số 0) trong IPv6 header. Thiết lập Traffic Class của 3 flow 1:1, 1:2 và 1:3 tương ứng là 0x2e (ưu tiên cao nhất), 0x0a (ưu tiên vừa) và 0x00 ưu tiên thấp:

[root@R3 ~]# tc filter add dev eth4 parent 1: protocol ipv6 \
                                u32 match u16 0x02e0 0x0ff0 at 0 flowid 1:1
[root@R3 ~]# tc filter add dev eth4 parent 1: protocol ipv6 \
                                u32 match u16 0x0000 0x0ff0 at 0 flowid 1:2
[root@R3 ~]# tc filter add dev eth4 parent 1: protocol ipv6 \
                                u32 match u16 0x00a0 0x0ff0 at 0 flowid 1:3

Sử dụng iperf3 trên C0 với tham số -S để thiết lập Traffic Class, có thể thấy cùng gửi đến C4 tại địa chỉ 2000::7, khi đặt các Traffic Class khác nhau thì băng thông cũng khác nhau tương ứng:

[root@C0 ~]# iperf3 -6 -t 4 -c 2000::7 -p 5002 -S 0x2e
Connecting to host 2000::7, port 5002
[  4] local fec0::7 port 33697 connected to 2000::7 port 5002
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  7.43 MBytes  62.4 Mbits/sec    0    298 KBytes      
[  4]   1.00-2.00   sec  9.86 MBytes  82.6 Mbits/sec    0    549 KBytes      
[  4]   2.00-3.00   sec  10.6 MBytes  89.3 Mbits/sec   40    541 KBytes      
[  4]   3.00-4.00   sec  9.54 MBytes  79.7 Mbits/sec    0    618 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-4.00   sec  37.5 MBytes  78.5 Mbits/sec   40             sender
[  4]   0.00-4.00   sec  36.0 MBytes  75.4 Mbits/sec                  receiver

iperf Done.

[root@C0 ~]# iperf3 -6 -t 4 -c 2000::7 -p 5002 -S 0x0a
Connecting to host 2000::7, port 5002
[  4] local fec0::7 port 33699 connected to 2000::7 port 5002
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   128 KBytes  1.05 Mbits/sec   21   2.79 KBytes      
[  4]   1.00-2.00   sec   109 KBytes   890 Kbits/sec    7   2.79 KBytes      
[  4]   2.00-3.00   sec   117 KBytes   961 Kbits/sec    6   5.58 KBytes      
[  4]   3.00-4.00   sec   117 KBytes   960 Kbits/sec    7   4.18 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-4.00   sec   471 KBytes   965 Kbits/sec   41             sender
[  4]   0.00-4.00   sec   439 KBytes   900 Kbits/sec                  receiver

iperf Done.

[root@C0 ~]# iperf3 -6 -t 4 -c 2000::7 -p 5002 -S 0x00
Connecting to host 2000::7, port 5002
[  4] local fec0::7 port 33701 connected to 2000::7 port 5002
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  90.6 KBytes   741 Kbits/sec   27   5.58 KBytes      
[  4]   1.00-2.00   sec  55.8 KBytes   457 Kbits/sec    3   5.58 KBytes      
[  4]   2.00-3.00   sec  66.9 KBytes   549 Kbits/sec    4   4.18 KBytes      
[  4]   3.00-4.00   sec  50.2 KBytes   411 Kbits/sec    3   4.18 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-4.00   sec   264 KBytes   540 Kbits/sec   37             sender
[  4]   0.00-4.00   sec   236 KBytes   482 Kbits/sec                  receiver

iperf Done.

Bước 5: Áp dụng trường Flow Label trong IPv6

Do Flow Label là trường được thiết kế riêng cho IPv6, filter u32 hỗ trợ option lọc tường minh (specific) flowlabel cho riêng ip6. Thiết lập filter để các flow label 1234, 1235 và 1236 được xử lý trong các flow id 1:1, 1:2 và 1:3.

[root@C0 ~]# tc filter add dev $IF parent 1: protocol ipv6 u32 \
                        match ip6 flowlabel 1234 0x3ffff flowid 1:1
[root@C0 ~]# tc filter add dev $IF parent 1: protocol ipv6 \
                        u32 match ip6 flowlabel 1235 0x3ffff flowid 1:2
[root@C0 ~]# tc filter add dev $IF parent 1: protocol ipv6 \
                        u32 match ip6 flowlabel 1236 0x3ffff flowid 1:3

Sử dụng iperf3 trên C0 với tham số -L để thiết lập Flow Label, có thể thấy cùng gửi đến C4 tại địa chỉ 2000::7, khi đặt các Flow Label khác nhau thì băng thông cũng khác nhau tương ứng:

[root@C0 ~]# iperf3 -6 -t 4 -c 2000::7 -p 5002 -L 1234
Connecting to host 2000::7, port 5002
[  4] local fec0::7 port 33705 connected to 2000::7 port 5002
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  6.05 MBytes  50.7 Mbits/sec    0    243 KBytes      
[  4]   1.00-2.00   sec  13.5 MBytes   113 Mbits/sec    0    607 KBytes      
[  4]   2.00-3.00   sec  13.1 MBytes   109 Mbits/sec   14    566 KBytes      
[  4]   3.00-4.00   sec  12.0 MBytes   100 Mbits/sec    0    639 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-4.00   sec  44.6 MBytes  93.4 Mbits/sec   14             sender
[  4]   0.00-4.00   sec  43.1 MBytes  90.4 Mbits/sec                  receiver

iperf Done.

[root@C0 ~]# iperf3 -6 -t 4 -c 2000::7 -p 5002 -L 1235
Connecting to host 2000::7, port 5002
[  4] local fec0::7 port 33707 connected to 2000::7 port 5002
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  92.0 KBytes   754 Kbits/sec   29   8.37 KBytes      
[  4]   1.00-2.00   sec  47.4 KBytes   388 Kbits/sec    8   4.18 KBytes      
[  4]   2.00-3.00   sec  58.6 KBytes   480 Kbits/sec    6   4.18 KBytes      
[  4]   3.00-4.00   sec  58.6 KBytes   479 Kbits/sec    6   4.18 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-4.00   sec   257 KBytes   525 Kbits/sec   49             sender
[  4]   0.00-4.00   sec   230 KBytes   471 Kbits/sec                  receiver

iperf Done.

[root@C0 ~]# iperf3 -6 -t 4 -c 2000::7 -p 5002 -L 1236
Connecting to host 2000::7, port 5002
[  4] local fec0::7 port 33709 connected to 2000::7 port 5002
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec   148 KBytes  1.21 Mbits/sec   32   5.58 KBytes      
[  4]   1.00-2.00   sec   114 KBytes   936 Kbits/sec   11   6.97 KBytes      
[  4]   2.00-3.00   sec   117 KBytes   960 Kbits/sec   12   5.58 KBytes      
[  4]   3.00-4.00   sec   106 KBytes   868 Kbits/sec   12   5.58 KBytes      
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-4.00   sec   485 KBytes   994 Kbits/sec   67             sender
[  4]   0.00-4.00   sec   455 KBytes   931 Kbits/sec                  receiver

iperf Done.