要模拟网络延迟,可以使用linux自带的tc工具。
tc可以限制特定网卡发出的数据包的流量/延迟等,但不能限制收到的数据包。如果想要限制收到的数据包,就只能先虚拟出一块网卡,将接收到的来自特定ip端口的数据重定向到这块虚拟网卡,再限制虚拟网卡发出的数据包的流量/延迟,从而限制本机接收的数据包。
参考以下文章在Linux上为指定IP端口模拟网络收发包延迟_Linux教程_Linux公社-Linux系统门户网站 (linuxidc.com)
本文仅讨论往多个特定ip或特定端口的数据包延迟。
tc分为三个模块:
qdisc队列:默认情况下,包是FIFO的
class分类:比如一类限速10MBps,一类限速20MBps
filte过滤器:用于将特定ip端口划分到特定类里
- 首先确定网卡,可以用ifconfig命令来看(尽量不要将所有经由此网卡发出的数据包都一起延迟,会连不上网,特别是ssh登录的情况下)
- 在网卡bond1上添加一条root qdisc,prio是队列的类型:
sudo tc qdisc add dev bond1 root handle 1: prio bands 5
这条qdisc下设5个class,handle id为1:。在没有filter的情况下,tc从IP协议层收到的包会根据IP包头的TOS(Type of Service)字段进入第1~第3个class(与pfifo_fast规则相同),第4个和第5个class是没用的。
- ?现在给第4个class添加一个5秒延迟的qdisc,这个qdisc的handle id为40:,类的id为1:4
sudo tc qdisc add dev bond1 parent 1:4 handle 40: netem delay 5s
- 给root qdisc添加一个filter,将发给14100端口的包都送到第4个class:(这个fliter将划分给1:4这个类的数据包,prio是优先级的意思)
sudo tc filter add dev bond1 protocol ip parent 1:0 prio 4 u32 match ip dport 14100 0xffff flowid 1:4
- 现在给第5个class添加一个5秒延迟的qdisc,这个qdisc的handle id为50:,类的id为1:5;并给该队列添加一个filter,将发给192.168.0.1的包都送到第5个class
sudo tc qdisc add dev bond1 parent 1:5 handle 50: netem delay 5s
sudo tc filter?add dev bond1 protocol ip parent 1:0 prio 4 u32 match ip dst 192.168.0.1 flowid 1:5
如果要删除,
sudo tc qdisc del dev bond1 root
这样qdisc下的所有东西都会一起删除
如果要看,
sudo tc -s filter show dev bond1
sudo tc -s qdisc show dev bond1
|