Linux下的網絡輸入輸出流量的帶寬控制(2015-11-23更新)

Linux下的網絡輸入輸出流量的帶寬控制網絡

整理者:赤子玄心測試

QQ:280604597操作系統

Email:280604597@qq.com隊列

你們有什麼不明白的地方,或者想要詳細瞭解的地方能夠聯繫我,我會認真回覆的ip

1   概念

Linux中能夠對不一樣網卡的網絡輸入輸出的數據包作複雜的帶寬控制,能夠作到針對輸入或輸出的數據包的不一樣的源發地址、不一樣的源發端口、不一樣的目的地址、不一樣的目的端口作不一樣的帶寬控制。it

Linux中的QoS分爲入口(Ingress)部分和出口(Egress)部分,入口部分主要用於進行輸入流量的帶寬控制,出口部分主要用於進行輸出流量的帶寬控制。io

Linux是經過隊列對網絡流量進行帶寬控制,大多數隊列(qdisc)都是用於輸出流量的帶寬控制,例如HTB隊列等,而輸入流量只有一個隊列,即Ingress隊列。HTB隊列的能夠設置複雜的隊列規則,從而靈活的控制輸出流量的帶寬,而ingress隊列的功能很簡單,不可指定複雜的隊列規則,但能夠重定向數據包incoming packets。若是要對輸入流量作複雜的帶寬控制,能夠經過Ingress隊列把輸入流量重定向到虛擬設備ifb,而後對虛擬設備ifb的輸出流量配置HTB隊列,就能達到對輸入流量設置複雜的隊列規則。class

Linux的每一個網絡設備上,默認都會有一個輸出隊列,默認沒有輸入隊列。添加新的輸出隊列會覆蓋默認的輸出隊列。配置

當隊列的帶寬被佔滿時,操做系統就會延遲發送數據包,再不行就丟包。queue

 

 

2   HTB隊列

2.1 模型

 

2.2 簡介

隊列等級劃分:一個HTB隊列有且只有一個根分類,一個根分類下能夠有零至多個主分類,一個主分類下能夠有零至多個子分類,一個子分類下還能夠有零至多個子分類,……

全部分類的流量統計是在這個分類的入口作的。

全部分類的流量帶寬控制是在這個分類的通道里作的。

只有根分類入口上能添加過濾器,其餘隊列入口只作分流,即便添加過濾器也不會觸發。

過濾器只能把數據包扔給最底層的隊列,若是該隊列有子分類,則數據包不能扔給這個隊列,由於有子分類的主分類或子分類是沒有隊列通道的。注意:若是必定要扔給父隊列,這個過濾器能添加成功,且過濾器還能匹配成功,可是數據包就是不走這個隊列。

通過測試,發現子分類的帶寬不受父分類的帶寬控制。

網絡設備名:網絡設備的名字,通常叫ethX,用ifconfig或ip link命令查看。

虛擬網絡設備名:虛擬網絡設備的名字,通常叫ifbX,用ifconfig或ip link命令查看。

優先級:優先處理的等級,爲整數,數值越低優先級越高。通過測試,發現htb隊列的優先級高低沒有對數據包產生影響。

隊列的優先級由高到低爲0、一、二、三、四、五、六、7,最高爲0,最低爲7。若是過濾器的優先級爲0,會致使沒法刪除此過濾器。

3   輸出流量控制

注意:tc命令都是實時生效的。

3.1 查看根分類

Shell命令:tc  [-s]  qdisc  show  dev  網絡設備名

注意:-s選項表示顯示網絡流量信息。

 

例如:tc  qdisc  show  dev  eth0

解釋:查看eth0設備的隊列信息。

 

例如:tc  -s  qdisc  show  dev  eth1

解釋:查看eth1設備的隊列信息,並顯示隊列的網絡流量信息。

3.2 添加根分類

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的分類。

3.3 刪除根分類

Shell命令:tc  qdisc  del  dev  網絡設備名  root

3.4 查看主分類或子分類

Shell命令:tc  [-s]  class  show  dev  網絡設備名

注意:-s選項表示顯示網絡流量信息。

3.5 添加主分類或子分類

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。

3.6 修改主分類或子分類

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。

3.7 刪除主分類或子分類

Shell命令:tc  class  del  dev  網絡設備名  classid  分類句柄

注意:若是有過濾器的與要刪除的隊列有關聯,必須先刪除過濾器,而後才能刪除該隊列。

注意:若是要刪除的隊列有子隊列時,必須先刪除子隊列,而後才能刪除該隊列。

3.8 查看過濾器

Shell命令:tc  [-s]  filter  {show|ls}  dev  網絡設備名

3.9 添加過濾器

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或不指定,則優先級實際會設置成很大的一個數,也就是說優先級很低。

3.10  刪除過濾器

刪除指定優先級的全部過濾器:tc  filter  del  dev  網絡設備名  prio  優先級

刪除指定句柄的單個過濾器:tc  filter  del  dev  網絡設備名  parent  根分類句柄  protocol  ip  prio  優先級  handle  句柄  u32

4   輸入流量控制

加載虛擬網絡設備驅動:

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  虛擬網絡設備名

5   tc命令

tc qdisc

tc class {add | replace | change | del}

tc filter

6   例子

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

相關文章
相關標籤/搜索