Networking
使用 tc 減少到特定目標地址的頻寬
我正在嘗試使用 Dijkstra 程式碼找到兩個主機 H1 和 H2 之間的最短路徑。在該路徑上的一個開關中設置條件。條件是:如果數據包發送到 H2 則自動改變路徑。
我正在使用 Mininet,我想使用tc通過過濾進入交換機並發送到 H2 的數據包來減少出站頻寬,然後 Dijkstra 程式碼將更改路徑。
我想問,我可以使用**(tc qdisc)**來控制給定鏈路上出站頻寬的使用嗎?tc對物理鏈路或模擬鏈路有影響嗎?
是的,它
tc
就是為此而設計的。TC 適用於任何類型的介面(物理和軟體)。最簡單的隊列調度器是htb
分層令牌桶(Hierarchical Token Bucket)。典型的簡單配置:
- htb 根隊列規則
- 根類(100% 頻寬)
- 預設葉類(80% 頻寬保證,最高 100% 頻寬)
- 頻寬受限葉類 1(10% 頻寬保證)
- 頻寬受限葉類 2(10% 頻寬保證,最高 100% 頻寬)
- 每個葉類上的 sfq 隊列規則,以公平共享流之間的限制
子類的匯總頻寬不應超過父類的頻寬。否則調度器將不准確。
猜測介面頻寬為100Mbit/s。因此,您的配置命令將如下所示:
tc qdisc add dev enp4s0f0 root handle 1: htb default 10 tc class add dev enp4s0f0 parent 1: classid 1:1 htb rate 100Mbit ceil 100Mbit quantum 15000 tc class add dev enp4s0f0 parent 1:1 classid 1:10 htb rate 80Mbit ceil 100Mbit quantum 15000 tc class add dev enp4s0f0 parent 1:1 classid 1:11 htb rate 10Mbit ceil 10Mbit quantum 15000 tc class add dev enp4s0f0 parent 1:1 classid 1:12 htb rate 10Mbit ceil 100Mbit quantum 15000 tc qdisc add dev enp4s0f0 parent 1:10 handle 10: sfq tc qdisc add dev enp4s0f0 parent 1:11 handle 11: sfq tc qdisc add dev enp4s0f0 parent 1:12 handle 12: sfq
配置好類的層次結構後,就應該配置分類。有許多類型的分類器,具有各種特徵和不同級別的使用者友好度。分類器根據配置的標準檢查數據包。如果數據包匹配,則將類分配給該數據包。
tc filter add dev <iface> parent 1: prio 1 protocol ip 800::1 u32 match dst ip 192.168.10.2/32 classid 1:11 tc filter add dev <iface> parent 1: prio 1 protocol ip 800::2 u32 match dst ip 192.168.10.0/24 classid 1:12
在這個小例子中,發送到主機的數據包
192.168.10.2
將被傳遞到 1:11 類,因此受到 10Mbit/s 的限制。從子網到其他地址的數據包192.168.10.0/24
將被傳遞到類 1:12。所有其他數據包將被傳遞到預設類 (1:10)。
tc
這是使用該工具的快速起點。如果你有問題,問它。