linux_traffic_control

linux traffic control

Traffic Control 技术实现的基本原理就是 Queue(队列),通过在网络设备(包括:主机网卡、交换机、路由器等)的 Ingress 和 Egress 处使用一系列的 Queues 来对数据报文进行排队,继而控制它们的发送优先顺序和速率。同时,还可以针对不同的 Queues 施加相应的 Policy(策略),实现更灵活的功能特性。

首先,要使用tc指令,先要用sudo apt-get install iproute2 下载包

Add constant delay

我们可以通过tc指令为ping增加延迟。

首先我们可以通过sudo lshw -C network | grep 'logical name' 来获得当前机器的网卡。

首先我们来看没有增加延迟的时候,ping baidu.com的结果

然后我们通过指令增加延迟

sudo tc qdisc add dev ens160 root netem delay 200ms

此时可以用sudo tc qdisc show dev ens160来查看当前网卡的延时

同样的,可以使用 sudo tc qdisc del dev ens160 root 来删除这个延时

Add random delay

1
2
3
4
5
6
7
8
tc class add dev eth0 parent 1: classid 1:20 htb rate 8mibit
tc class add dev eth0 parent 1: classid 1:30 htb rate 8mibit

tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10

tc filter add dev eth0 parent 1: protocol ip prio 1 basic match 'cmp(u16 at 0 layer transport eq 1081)' flowid 1:20
tc filter add dev eth0 parent 1: protocol ip prio 1 basic match 'cmp(u16 at 0 layer transport eq 1082)' flowid 1:30

Add packet loss

我们可以用sudo tc qdisc add dev ens160 root netem loss 10% 来设置一个丢包率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Define variables
IP=192.168.1.100/32
PORT=8000
INTERFACE=eth0
VIRTUAL_INTERFACE=ifb0
# Speed unit is Mbits/s
TUPLE_SPEED=100

# Add the virtual interface
modprobe ifb numifbs=1;
ip link set dev "$VIRTUAL_INTERFACE" up;

# Redirect ingress packets to egress virtual interface
tc qdisc add dev "$INTERFACE" handle ffff: ingress
tc filter add dev "$INTERFACE" parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev "$VIRTUAL_INTERFACE";

# Create root qdisc and class for the virtual interface
tc qdisc add dev "$VIRTUAL_INTERFACE" root handle 1: htb;
tc class add dev "$VIRTUAL_INTERFACE" parent 1: classid 1:10 htb rate "${TUPLE_SPEED}mbit";

# Add a filter that match yor tuple
tc filter add dev "$VIRTUAL_INTERFACE" protocol ip parent 1: prio 1 u32 match ip dst "${IP}" match udp dst"${PORT}" flowid 1:10;

Set bandwidth limit

-------------本文结束,感谢您的阅读-------------