動機

以前遇過,review一下

概念

一般做tc就是在意下面4件事

  • POLICING(策略)
    • 進來的pkt要到哪邊
      • queue的入口
  • SCHEDULING(調度)
    • 怎麼分配bandwidth (QoS)
      • queue的內部
  • SHAPING (限制)
    • 調整輸出的速度
      • queue的出口
  • DROPPING(丟棄)
    • 爆量了怎麼辦

traffic control就是一個queue接一個queue,變成一個樹狀queue,有三個元件

  • qdisc
    • quene (virtual)
      • tree的node (特別是能放class的qdisc)
        • leaf (classless)
        • node (classful,會多兩個元件)
          • filter
            • (另外加的) 要讓traffic去哪 (class或qdisc)
              • 有點像goto
          • class
            • 下一個qdisc的入口,目前qdisc的出口
              • node的pointer

樹狀queue就是qdisc指到2種東西

  1. class
  2. qdisc (classless) 另外就是符合條件(filter)直接被指到
  3. class
  4. 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)