Linux用tc实现模拟网络延时的shell脚本

101 篇文章 0 订阅
51 篇文章 0 订阅
TC的基础介绍,文本不再介绍,详细介绍可以参考: Linux使用tc模拟网络延迟和丢包_清除网损 tc-CSDN博客
1.队列控制的分类算法 PRIO介绍 & 针对指定的目的IP配置规则进行延迟网卡报文发送(举例)
2.TC模拟网络延迟shell脚本
3.针对IP地址的限速配置
 

1.队列控制的分类算法 PRIO介绍

队列控制的分类算法PRIO
PRIO分类优先算法(从左至右优先发包),队列规定并不进行整形,仅仅根据你配置的过滤器把流量进一步细分。
我么可以理解为PRIO队列规定是pfifo_fast的一种衍生物,区别在每个频道都是一个单独的类,而非简单的FIFO。
当数据包进入PRIO队列规则后,将根据你给定的过滤器设置选择一个类。缺省情况下有三个类,这些类仅包含纯FIFO队列规定而没有更多的内部结构。你可以把它们替换成自己需要的任何队列规则。
每当有一个数据包需要出队时,首先处理:1类。只有当标号更小的类中没有需要处理的包时,才会标号大的类。

PRIO配置范例:大批量数据使用30:交互数据使用20:或10:

使用TC进行Linux流量控制主要分为创建队列、创建分类和创建过滤器,最后还可以通过过滤器相配合建立特定的路由表。
创建队列:一般情况下,针对一个网卡只需建立一个队列。
创建分类:一般情况下,针对一个队列需建立一个根分类,然后再在其上建立子分类。对于分类,按其分类的编号顺序起作用,编号小的优先;一旦符合某个分类匹配规则,通过该分类发送数据包,则其后的分类不再起作用。

PRIO配置使用举例:
针对指定的目的IP配置规则进行延迟网卡报文发送:

tc qdisc del dev ens160 root #删除限制规则
tc qdisc add dev ens160 root handle 1: prio bands 4 #创建队列(针对网络物理设备绑定一个队列 handle 1:)
tc qdisc add dev ens160 parent 1:4 handle 40: netem delay 2s #创建分类(在队列上建立分类)
tc filter add dev ens160 protocol ip parent 1:0 u32 match ip dst 192.168.1.210/32 flowid 1:4 #创建过滤器(为每一分类建立一个基于路由的过滤器filter,效果为:本机192.168.1.100发送给目的192.168.1.210的IP报文将被延迟发送)
#路由我这里不使用,就不创建路由了

说明:
"handle 1:" 为规则算法编号
"bands" 为创建频道的数目。每个频道实际上就是一个类,跟priomap参数配合使用。
注意:频道是类,缺省情况下命名为主标号":1"到主标号":3"。如果你的PRIO队列规则是"12:",把数据包过滤到"12:1"将得到最高优先级。0频道的次标号是1,1频道的次标号是2,以此类推。
priomap 给TC提供过滤器,如不提供PRIO队列规则将参考TC_PRIO的优先级来决定如何给数据包入队。

2. tc模拟网络延迟shell脚本:
# cat tcdelay.sh
#!/bin/sh
argc=$#
numExp='^[0-9]+$'
if [ $argc -ne 1 ]
then
  echo "# Use $0 {-c | delayTime}"
  echo "# Use $0 -c : clear delaySet"
  echo "# Use $0 delayTime : set delay time, eg delayTime=2000 will delay 2000ms."
  exit
elif [ $1 = "-c" ]
then
  echo "to qdisc delete"
  tc qdisc delete  dev ens160 root
  exit;
elif [[ $1 =~ $numExp ]]
then
  time=$1
else
  time=500
fi
echo "to delay: $time"ms
tc qdis add dev ens160 root netem delay "$time"ms
# disable after 10 seconds

max=10
for((i=1;i<=$max;i++))
do
  echo "=== $i/$max"
  sleep 1
done

tc qdisc delete dev $interface root
echo "tc deleted!"


3.针对IP地址的限速配置:

#删除限制规则
tc qdisc del dev ens160 root

#创建队列(针对网络物理设备绑定一个队列 handle 1:),添加一个HTB(Hierarchy Token Bucket)类型的控制规则、并为根类别设置一个 80mbit/s(即:10MB/s)的下载速度限制
tc qdisc add dev ens160 root handle 1: htb default 10 
tc class add dev ens160 parent 1: classid 1:1 htb rate 80mbit ceil 80mbit

## 将流量限制应用到特定的类别,这里是下行链接(ingress)
#tc filter add dev ens160 parent 1: protocol ip prio 1 u32 match ip sport 0 0xFFFF flowid 1:1

# 如果要针对指定的目的IP进行限速的话(针对目的IP 192.168.1.34/32 限速)
tc filter add dev ens160 parent 1: protocol ip prio 1 u32 match ip dst 192.168.1.34/32 flowid 1:1
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny05296

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值