動機
以前遇過,review一下
概念
一般做tc就是在意下面4件事
- POLICING(策略)
- 進來的pkt要到哪邊
- queue的入口
- 進來的pkt要到哪邊
- SCHEDULING(調度)
- 怎麼分配bandwidth (QoS)
- queue的內部
- 怎麼分配bandwidth (QoS)
- SHAPING (限制)
- 調整輸出的速度
- queue的出口
- 調整輸出的速度
- DROPPING(丟棄)
- 爆量了怎麼辦
traffic control就是一個queue接一個queue,變成一個樹狀queue,有三個元件
- qdisc
- quene (virtual)
- tree的node (特別是能放class的qdisc)
- leaf (classless)
- node (classful,會多兩個元件)
- filter
- (另外加的) 要讓traffic去哪 (class或qdisc)
- 有點像goto
- (另外加的) 要讓traffic去哪 (class或qdisc)
- class
- 下一個qdisc的入口,目前qdisc的出口
- node的pointer
- 下一個qdisc的入口,目前qdisc的出口
- filter
- tree的node (特別是能放class的qdisc)
- quene (virtual)
樹狀queue就是qdisc指到2種東西
- class
- qdisc (classless) 另外就是符合條件(filter)直接被指到
- class
- qdisc (classless)
classless & classful qdisc
就qdisc能不能放class
- classless
- pfifo: 一般的queue
- pfifo_fast: 根據ToS去分到對應的一般的queue
- red: 爆量時隨機drop
- sfq: Stochastic Fairness Queueing
- tbf: Token Bucket Filter
- classful
- cbq: Class Based Queueing
- htb: Hierarchy Token Bucket
ingress qdisc & ifb
ifb,tc作用在egress(從主機出去的traffic),如果要用在ingress,就要設ifb把traffic灌進去,把tc設定ifb的egress
# init ifb
modprobe ifb numifbs=1
ip link set ifb0 up
# redirect ingress to ifb0
tc qdisc add dev eth0 ingress handle ffff:
tc filter add dev eth0 parent ffff: protocol ip prio 0 u32 match u32 0 0 flowid ffff: action mirred egress redirect dev ifb0
# add qdisc
tc qdisc add dev ifb0 root handle 1: htb default 2 r2q 100
# add default class
tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 1000mbit ceil 1000mbit
tc class add dev ifb0 parent 1:1 classid 1:2 htb prio 5 rate 1000mbit ceil 1000mbit
tc qdisc add dev ifb0 parent 1:2 handle 2: pfifo limit 500
# add default filter
tc filter add dev ifb0 parent 1:0 prio 5 protocol ip u32
tc filter add dev ifb0 parent 1:0 prio 5 handle 4: protocol ip u32 divisor 256
tc filter add dev ifb0 parent 1:0 prio 5 protocol ip u32 ht 800:: match ip dst 192.168.0.0/16 hashkey mask 0x000000ff at 16 link 4:
# add ingress rules for 192.168.0.9
tc class add dev ifb0 parent 1:1 classid 1:9 htb prio 5 rate 3mbit ceil 3mbit
tc qdisc add dev ifb0 parent 1:9 handle 9: pfifo limit 500
tc filter add dev ifb0 parent 1: protocol ip prio 5 u32 ht 4:9: match ip dst "192.168.0.9" flowid 1:9
sharping的原理
Leaky Bucket: 把流量queue住,一次只出去指定的量
Token Bucket: 把流量queue住,等有token才能出去同等數量的traffic
htb就是parent的token可以轉給小孩用
sharping的作法
用netem
tc qdisc add dev enp0s5 root handle 1: prio
tc qdisc add dev enp0s5 parent 1:1 handle 10: netem delay 100ms 10ms
tc filter add dev enp0s5 protocol ip parent 1:0 prio 1 u32 match ip dst 151.101.0.0/16 match ip dport 443 0xffff flowid 1:1
用htb
tc qdisc add dev enp0s5 root handle 1:0 htb
tc class add dev enp0s5 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps
Ref
Linux TC(Traffic Control)框架原理解析 Linux Traffic Control (tc) 研究 流量控制 TC 入門 (traffic control)