Linux下的網絡輸入輸出流量的帶寬控制網絡
整理者:赤子玄心測試
QQ:280604597操作系統
Email:280604597@qq.com隊列
你們有什麼不明白的地方,或者想要詳細瞭解的地方能夠聯繫我,我會認真回覆的ip
Linux中能夠對不一樣網卡的網絡輸入輸出的數據包作複雜的帶寬控制,能夠作到針對輸入或輸出的數據包的不一樣的源發地址、不一樣的源發端口、不一樣的目的地址、不一樣的目的端口作不一樣的帶寬控制。it
Linux中的QoS分爲入口(Ingress)部分和出口(Egress)部分,入口部分主要用於進行輸入流量的帶寬控制,出口部分主要用於進行輸出流量的帶寬控制。io
Linux是經過隊列對網絡流量進行帶寬控制,大多數隊列(qdisc)都是用於輸出流量的帶寬控制,例如HTB隊列等,而輸入流量只有一個隊列,即Ingress隊列。HTB隊列的能夠設置複雜的隊列規則,從而靈活的控制輸出流量的帶寬,而ingress隊列的功能很簡單,不可指定複雜的隊列規則,但能夠重定向數據包incoming packets。若是要對輸入流量作複雜的帶寬控制,能夠經過Ingress隊列把輸入流量重定向到虛擬設備ifb,而後對虛擬設備ifb的輸出流量配置HTB隊列,就能達到對輸入流量設置複雜的隊列規則。class
Linux的每一個網絡設備上,默認都會有一個輸出隊列,默認沒有輸入隊列。添加新的輸出隊列會覆蓋默認的輸出隊列。配置
當隊列的帶寬被佔滿時,操做系統就會延遲發送數據包,再不行就丟包。queue
隊列等級劃分:一個HTB隊列有且只有一個根分類,一個根分類下能夠有零至多個主分類,一個主分類下能夠有零至多個子分類,一個子分類下還能夠有零至多個子分類,……
全部分類的流量統計是在這個分類的入口作的。
全部分類的流量帶寬控制是在這個分類的通道里作的。
只有根分類入口上能添加過濾器,其餘隊列入口只作分流,即便添加過濾器也不會觸發。
過濾器只能把數據包扔給最底層的隊列,若是該隊列有子分類,則數據包不能扔給這個隊列,由於有子分類的主分類或子分類是沒有隊列通道的。注意:若是必定要扔給父隊列,這個過濾器能添加成功,且過濾器還能匹配成功,可是數據包就是不走這個隊列。
通過測試,發現子分類的帶寬不受父分類的帶寬控制。
網絡設備名:網絡設備的名字,通常叫ethX,用ifconfig或ip link命令查看。
虛擬網絡設備名:虛擬網絡設備的名字,通常叫ifbX,用ifconfig或ip link命令查看。
優先級:優先處理的等級,爲整數,數值越低優先級越高。通過測試,發現htb隊列的優先級高低沒有對數據包產生影響。
隊列的優先級由高到低爲0、一、二、三、四、五、六、7,最高爲0,最低爲7。若是過濾器的優先級爲0,會致使沒法刪除此過濾器。
注意:tc命令都是實時生效的。
Shell命令:tc [-s] qdisc show dev 網絡設備名
注意:-s選項表示顯示網絡流量信息。
例如:tc qdisc show dev eth0
解釋:查看eth0設備的隊列信息。
例如:tc -s qdisc show dev eth1
解釋:查看eth1設備的隊列信息,並顯示隊列的網絡流量信息。
Shell命令:tc qdisc add dev 網絡設備名 root [handle 根分類句柄] htb [default 默認分類句柄]
注意:若是指定了默認分類句柄,當數據包在不被任何過濾器匹配成功時候,就走默認分類。若是指定的默認分類不存在或不指定,數據包就走根分類。
注意:若是要指定根分類句柄,那麼其範圍必須是大於等於一、小於等於ffff的十六進制數值。若是是其餘數值或不指定,則會出現隨機的句柄。
例如:tc qdisc add dev eth0 root htb
解釋:在eth0設備上添加HTB隊列的根分類,隊列句柄爲隨機,默認分類爲根分類。
例如:tc qdisc add dev eth0 root handle 1: htb
解釋:在eth0設備上添加HTB隊列的根分類,隊列句柄爲1:,默認分類爲根分類。
例如:tc qdisc add dev eth1 root handle 2: htb default 2:1
解釋:在eth1設備上添加HTB隊列的根分類,隊列句柄爲2:,默認分類句柄爲2:1的分類。
Shell命令:tc qdisc del dev 網絡設備名 root
Shell命令:tc [-s] class show dev 網絡設備名
注意:-s選項表示顯示網絡流量信息。
Shell命令:tc class add dev 網絡設備名 [parent 父分類句柄] classid 該分類句柄 htb rate 保留帶寬{MBps|KBps|Bps|Mbit|Kbit|bit} [ceil 共享帶寬{MBps|KBps|Bps|Mbit|Kbit|bit}] [prio 優先級]
注意:若是指定的父隊列句柄不存在或不指定時,則父分類就是根分類。
注意:若是不指定共享帶寬,則共享帶寬和保留帶寬同樣。
注意:若是指定的優先級爲負數,則會致使命令執行失敗。若是指定的優先級大於等於8,則優先級實際會設置成7。若是不指定優先級,則優先級實際會設置成0。
bit表示位每秒傳輸
Bps表示字節每秒傳輸
KBps表示千字節每秒傳輸
MBps表示兆字節每秒傳輸
1MBps=1000KBps
1KBps=1000Bps
使用Mbit、Kbit、bit單位控制輸出流量帶寬時,會致使控制不許,控制輸入流量帶寬時沒問題。
使用MBps、KBps、Bps單位控制輸入輸出流量帶寬都很準。
例如:tc class add dev eth0 classid 1:1 htb rate 100MBps
解釋:在eth0設備上添加主分類,父分類默認爲根分類,該分類句柄爲1:1,保留帶寬爲100MBps(800000Kbit),共享帶寬默認與保留帶寬同樣,優先級默認爲0。
例如:tc class add dev eth0 parent 1:1 classid 1:2 htb rate 50MBps ceil 100MBps prio 1
解釋:在eth0設備上添加子分類,父分類爲1:1,該分類句柄爲1:2,保留帶寬爲50MBps(400000Kbit),共享帶寬爲100MBps(800000Kbit),優先級爲1。
Shell命令:tc class change dev 網絡設備名 classid 分類句柄 htb rate 保留帶寬{MBps|KBps|Bps|Mbit|Kbit|bit} [ceil 共享帶寬{MBps|KBps|Bps|Mbit|Kbit|bit}] [prio 優先級]
注意:保留帶寬是必需要填的,且沒法修改父分類。
注意:若是不指定共享帶寬,則共享帶寬和保留帶寬同樣。
注意:若是指定的優先級爲負數,則會致使命令執行失敗。若是指定的優先級大於等於8,則優先級實際會設置成7。若是不指定優先級,則優先級實際會設置成0。
Shell命令:tc class del dev 網絡設備名 classid 分類句柄
注意:若是有過濾器的與要刪除的隊列有關聯,必須先刪除過濾器,而後才能刪除該隊列。
注意:若是要刪除的隊列有子隊列時,必須先刪除子隊列,而後才能刪除該隊列。
Shell命令:tc [-s] filter {show|ls} dev 網絡設備名
Shell命令:tc filter add dev 網絡設備名 parent 根分類句柄 protocol ip [prio 優先級] u32 [match ip src 源發IP地址/XX] [match ip sport XXX 0xffff] [match ip dst 目的IP地址/XX] [match ip dport XXX 0xffff] flowid 分類句柄
注意:若是優先級爲0或不指定,則優先級實際會設置成很大的一個數,也就是說優先級很低。
刪除指定優先級的全部過濾器:tc filter del dev 網絡設備名 prio 優先級
刪除指定句柄的單個過濾器:tc filter del dev 網絡設備名 parent 根分類句柄 protocol ip prio 優先級 handle 句柄 u32
加載虛擬網絡設備驅動:
modprobe ifb
啓用虛擬網絡設備:
ip link set dev 虛擬網絡設備名 up [txqueuelen 1000]
給網絡設備添加ingress隊列,ingress隊列用於對輸入流量控制:
tc qdisc add dev 網絡設備名 ingress
注意:ingress隊列的句柄默認是ffff:,沒法修改。
將網絡設備的輸入流量重定向到虛擬網絡設備的輸出流量上:
tc filter add dev 網絡設備名 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev 虛擬網絡設備名
tc qdisc
tc class {add | replace | change | del}
tc filter
l 一個:
如下eth1爲內網網卡地址
tc qdisc del dev eth1 root #刪除之前的隊列
tc qdisc add dev eth1 root handle 1: htb #開啓限速規則爲htb(分層令牌桶)
tc class add dev eth1 parent 1: classid 1:1 htb rate 3mbit burst 15k #規劃限制帶寬爲3M峯值15k
tc qdisc add dev eth1 parent 1:1 handle 10: sqf perturb 10 #設定平均分配帶寬
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.8.17 flowid 1:1 #限制192.168.8.17速度爲3mbit