linux下使用tc模拟网络延迟和丢包

author author     2022-08-01     311

关键词:

模拟延迟传输简介

netem 与 tc: netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc 是Linux 系统中的一个工具,全名为 traffic control(流量控制)。tc 可以用来控制 netem 的工作模式,也就是说,如果想使用 netem ,需要至少两个条件,一个是内核中的 netem 功能被包含,另一个是要有 tc 。

需要注意的是:本文介绍的流控只能控制发包动作,不能控制收包动作,同时,它直接对物理接口生效,如果控制了物理的 eth0,那么逻辑网卡(比如 eth0:1)也会受到影响,反之,如果您在逻辑网卡上做控制,该控制可能是无效的。(注:虚拟机中的多个网卡可以在虚拟机中视为多个物理网卡)。


# tc qdisc add dev eth0 root netem delay 100ms

该命令将 eth0 网卡的传输设置为延迟 100 毫秒发送。易宝支付有限公司


更真实的情况下,延迟值不会这么精确,会有一定的波动,我们可以用下面的情况来模拟出

带有波动性的延迟值:

# tc qdisc add dev eth0 root netem delay 100ms 10ms

该命令将 eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送。

还可以更进一步加强这种波动的随机性:

# tc qdisc add dev eth0 root netem delay 100ms 10ms 30%

该命令将 eth0 网卡的传输设置为 100ms ,同时,大约有 30% 的包会延迟 ± 10ms 发送。示例:现在 ping 一下 216 机器:

易宝支付有限公司

可以看出数据明显的波动性。

模拟网络丢包:
# tc qdisc add dev eth0 root netem loss 1%

该命令将 eth0 网卡的传输设置为随机丢掉 1% 的数据包。示例:在 216 上执行

#tc qdisc add dev eth0 root netem loss 10%

显示 16 个包只有 13 个收到了。也可以设置丢包的成功率:

# tc qdisc add dev eth0 root netem loss 1% 30%

该命令将 eth0 网卡的传输设置为随机丢掉 1% 的数据包,成功率为 30% 


4.删除网卡上面的相关配置:将之前命令中的 add 改为 del 即可删除配置:

# tc qdisc del dev eth0 XXXXXXXXXXX(自己加的配置)该命令将 删除 eth0 网卡的相关传输配置

至此,我们已经可以通过 TC 在测试环境中模拟一定的网络延时和丢包的情况。下面是关tc 更多的用和介绍

模拟包重复:
# tc qdisc add dev eth0 root netem duplicate 1%

该命令将 eth0 网卡的传输设置为随机生 1% 复数据包 。模拟数据包损坏:

# tc qdisc add dev eth0 root netem corrupt 0.2%

该命令将 eth0 网卡的传输设置为随机生 0.2% 损坏的数据包 。 (内核版本需在 2.6.16 以上)

模拟数据包乱序:
# tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%

该命令将 eth0 网卡的传输设置为:有 25% 的数据包(50%相关)会被即发送,其他的延迟10 秒。

新版本中,如下命令也会在一定程度打乱发包的次:# tc qdisc add dev eth0 root netem delay 100ms 10ms

查看已经配置的网络条件:# tc qdisc show dev eth0

该命令将 显示 eth0 网卡的相关传输配置附录:TC 流量控制

TC 是一个流量控制的工具,下面了一于 TC 流量控制的文TC 介绍


在 linux 中,TC 种控制方法 CBQ 和 HTB.HTB 是设用来替换 CBQ 的。它是一个次式的过滤框架.

TC 括三本的成块:

队列规定 qdisc(queueing discipline )、(class)和分类器(Classifiers)

TC 中的队列(queueing discipline):
用来实现控制网络的收发速度.过队列,linux 可以将网络数据包缓存起,然后根据用

设置,量不中断连(如 TCP)的前提下来平网络流量.需要注意的是,linux 对接收队列的控制不好,以我们一只用发送队列,即控发不控收.封装其他两个要 TC 件(分类器)。内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的 qdisc(排队规则)数据包加入队列然后,内核会 可能多地从 qdisc 出数据包,它们交给网络配器动模块。

最简单的 QDisc 是 pfifo 它不对进的数据包做任理,数据包先入先出的式通过队列。不,它会保存网络接口一时无法处理的数据包。
队列规则括 FIFO(出),RED(随机早期探测),SFQ(随机公平队列)和令牌桶(Token Bucket),类基队列(CBQ),CBQ 是一种超级队列,即它能包含队列(它 CBQ)。

TC 中的 Class 
class 用来示控制策略.很显,很多时,我们很可能要对不同的 IP 实行不同的流量控制策略,这时我们就用不同的 class 示不同的控制策略.

TC 中的 Filter 规则
filter 用来将用户划入到具的控制策略(即不同的 class ).比如,现在,我们想对 xxa,xxb两个 IP 实行不同的控制策略(A,B),这时,我们可用 filter 将 xxa 划入到控制策略 A,将 xxb 划入到控制策略 B,filter 划分标志位可用 u32 打标功能或 IPtables的 set-mark (大多使用iptables 来做标记)功能来实现。
前,TC 可以使用的过滤器有:fwmark 分类器,u32 分类器,基于路由分类器和 RSVP分类器(分别于 IPV6IPV4)等;其中,fwmark分类允许我们使用 Linux netfilter 代码选择流量,而 u32 分类允许我们选择基于 ANY 的流量 .需要注意的是,filter (过滤)是在 QDisc 内部,它们不能作为主体

TC 用流
数据包->iptables(在通过 iptables 时,iptables 据不同的 ip 来设置不同的 mark)->TC(class)-

>TC(queue)

设 eth0 服务器的网网络接口。开之前,除 eth0 队列规则

tc qdisc del dev eth0 root 2> /dev/null > /dev/null1) 义最顶层()队列规则,并指定 default 类别编号

tc qdisc add dev eth0 root handle 1htb default 2易宝支付有限公司

2) 义第的 1:1 类别 (速度)本来是要多定义第二层叶类别,但目前来看,这个用中就可以了.

tc class add dev eth0 parent 1:1 classid 1:2 htb rate 98mbit ceil
100mbit prio 2 tc class add dev eth0 parent 1:1 classid 1:3 htb
rate 1mbit ceil 2mbit prio 2

:以上就是我们控制输出服务器的速度,一个为 98M,一个为 2M.
rate: 
是一个类保证得到的带宽值.如果有不只一个,请保证所子类总和是小于或等于父类.prio:用来用带宽时的竞争力,prio 越小,优先级越高,竞争力越.
ceil: ceil 
是一个类最大能到的带宽值.

同时为了不使一个会话永占带宽,加随即公平队列 sfq.
tc qdisc add dev eth0 parent 1:handle 2sfq perturb 10 tc qdisc

add dev eth0 parent 1:3 handle 3: sfq perturb 10

3) 设定过滤
过滤器可以使用本的 u32 也可以使用 iptables 标记
定在 root 类 1:0 中,对 192..168.0.2 过滤,使用 1:2 规则,来给他 98M 速度,写法就如下

tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src
192.168.0.2 flowid 1:2 tc filter add dev eth0 protocol ip parent1:0 u32 match ip src 192.168.0.1 flowid 1:3

如果是有 ip 写法就如
tc filter add dev eth0 protocol ip parent 1prio 50 u32 match ip

dst 0.0.0.0/flowid 1:10使用 Iptables 来配合过滤

还可以使用这个方法,需要借助下面的 iptables 的命令来做标记

tc filter add dev eth0 parent 1: protocol ip prio 1 handle 2 fw
flowid 1:2 tc filter add dev eth0 parent 1: protocol ip prio 1handle 2 fw flowid 1:3

iptables 只要记号就行了

iptables -t mangle -A POSTROUTING -d 192.168.0.2 -j MARK --set-mark 10 iptables -t mangle -A POSTROUTING -d 192.168.0.3 -j MARK--set-mark 20

TC 高速度的控制
Rate ceiling 率限
数 ceil 定了一个可以用的大带宽用来限制可以用多少带宽.缺省的 ceil 是和率一
这个性对于 ISP 是很有用的们一限制被服务的用量即使其他户没请求服务.(ISPS 很想用付更多的钱得到更好的服务) ,根类是不允许用的定 ceil

易宝支付有限公司

: ceil 的数值该至少和它在的率一样高也就是说 ceil 该至少和它的任一个子类样高

Burst 
网络
件只能在一个时间发送一个包这仅仅取决于一个件的链路共享软件可以用这个能态产生多个接运行在不同的速度率和 ceil 不是一个即时量只是一个在一个时间发送包的平均值的情况是怎样使一个流量很个时间大的率提供给其他类. burst 和 cburst 数控制多少数据可以以大的速度费力的发送需要的其他类.
如果 cburst 小于一个理上的数据包他形成的发不会超过 ceil 方法 TBF 最高速率也是这.
可能会么需要 bursts . 为它可以很易的提高向应速度在一个很拥挤链路.比如 WWW 流量是发的你访问主页.发的获得并阅读空闲的时间 burst "charge"一次.
: burst 和 cburst 至少要和其子类的值一.

TC 命令式:

tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc[ qdisc specific parameters ]
tc class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc specificparameters ]

tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priorityfiltertype [ filtertype specific parameters ] flowid flow-id

显示

tc [-s | -d ] qdisc show [ dev DEV ]
tc [-s | -d ] class show dev DEV tc filter show dev DEV

看 TC 状态
tc -s -d qdisc show dev eth0tc -s -d class show dev eth0

删除tc规则
tc qdisc del dev eth0 root

实例
使用 
TC 限制个 IP 进行速度控制

tc qdisc add dev eth0 root handle 1: htb r2q 1 tc class add dev
eth0 parent 1: classid 1:1 htb rate 30mbit ceil 60mbit tc  filter
add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst
192.168.1.2  flowid 1:1

就可以限制 192.168.1.2 的下载速度为 30Mbit 最高可以 60Mbit ,中 r2q,指没有 default root,使个网络的带宽有限制

使用 TC 整段 IP 进行速度控制
tc qdisc add dev eth0 root handle 1htb r2q tc class add dev

易宝支付有限公司

eth0 parent 1: classid 1:1 htb rate 50mbit ceil 1000mbit tc filter
add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst
192.168.111.0/24 flowid 1:1

就可以限制 192.168.111.0 到 255 的带宽为 3000k 了,实载速度为 200k 左右。这种情况下,这个网段所有机器共享这 200k 的带宽。
还可以加
一个 sfq(随机公平队列)

tc qdisc add dev eth0 root handle 1: htb r2q 1 tc class add dev
eth0 parent 1: classid 1:1 htb rate 3000kbit burst 10k tc qdisc
add dev eth0 parent 1:1 handle 10: sfq perturb 10 tc filter add
dev eth0 parent 1: protocol ip prio 16 u32 match ip dst
192.168.111.168 flowid 1:1

sfq,可以防止一个内的一个 ip 个带宽。使用 TC 控制服务器对速度为 10M

如下,我要理一台服务器,只能向外发 10M 的数据

tc qdisc del dev eth0 root tc qdisc add dev eth0 root handle 1:htb tc class add dev eth0 parent 1classid 1:htb rate 100mbitceil 100mbit tc class add dev eth0 parent 1:classid 1:10 htbrate 10mbit ceil 10mbit tc qdisc add dev eth0 parent 1:10 sfqperturb 10 tc filter add dev eth0 protocol ip parent 1prio 2u32 match ip dst 220.181.xxx.xx/32flowid 1:上面台,220.181.xxx.xx/32 的,主要是让这个 ip 进来不被控制 tcfilter add dev eth0 protocol ip parent 1prio 50 u32 match ip dst0.0.0.0/flowid 1:10 认让所有的流量都从这个


本文出自 “尼古风锁丝愁过” 博客,请务必保留此出处http://smoke520.blog.51cto.com/9256117/1844034

linux环境下模拟延时和丢包实现--tc(代码片段)

前言在性能测试过程中,我们还需要模拟网络异常的情况下,是否会出现一些异常数据。最常见的就是写库操作,比如说我们下单的场景,如果出现网络异常的时候是否会出现数据对不上这种情况。如我们JMeter发... 查看详情

tc和netem模拟动态网络(代码片段)

...TC可以用来控制Netem模块的工作模式,也就是说如果想使用N 查看详情

renix如何查看时延和抖动和丢包——网络测试仪实操

查看时延和抖动​一、预约测试资源​打开Renix软件,连接机箱,预约端口​二、新建流​选中流模板,点击“新建流”,创建2条流,port1和port2相互发流​点击“发送所有流”​三、查看时延和抖动​默认情况下“统计2”StreamBlo... 查看详情

收集tcp端口的访问延迟和丢包率

需求:   找一款工具可以对TCP80端口收集访问延迟和丢包率找到的工具:   1、Hping: http://www.hping.org/   2、paping:https://docs.azure.cn/zh-cn/articles/azure-operations-guide/virtual- 查看详情

用iperf3测试网络带宽和丢包

参考技术A用iperf3测试网络带宽和丢包具体步骤如下: 查看详情

如何在linux下使用tc优雅的实现网络限流

1.Linux下的流量控制原理通过对包的排队,我们可以控制数据包的发送方式。这种控制,称之为数据整形,shapethedata,包括对数据的以下操作:增加延时丢包重新排列重复、损坏速率控制在qdisc-class-filter结构下,对流量进行控制需... 查看详情

为什么tcp在高时延和丢包的网络中传输效率差?

说明:有同学私信问到,为什么TCP在高时延和丢包的网络中传输效率差?Google可以搜到很多的信息,这里转译了部分IBMAsperafasp技术白皮书的第一章节内容,作为参考。-在这个数字世界中,数字数据的快速和可靠移动,包括全球范... 查看详情

安装和使用smokeping

(一)简介smokeping是对IDC网络质量,稳定性等最好的检测工具,包括常规的ping,dig,echoping,curl等,可以监视www服务器性能,监视dns查询性能,监视ssh性能等。底层也是rrdtool做支持,特点是画的图非常漂亮,网络丢包和延迟用... 查看详情

弱网测试:使用netem模拟网络延迟丢包损坏重复和乱序等网络问题(代码片段)

...拟发送的报文有16%的丢包率2.2、enp2s0网卡模拟发送的报文使用lossstate/lossgemodel模型进行丢包2.3、enp2s0网卡模拟发送的报文选用lossstate/lossgemodel模型进行丢包时的enc选项3、损坏/错误报文---corrupt3.1、enp2s0网卡模拟发送的报文中随机... 查看详情

为啥我的基于 Linux prio 的 tc 没有改善网络延迟?

】为啥我的基于Linuxprio的tc没有改善网络延迟?【英文标题】:WhyismyLinuxpriobasedtcnotimprovingnetworklatency?为什么我的基于Linuxprio的tc没有改善网络延迟?【发布时间】:2011-04-1422:47:58【问题描述】:我正在构建一个具有各种网络流量... 查看详情

千兆以太网卡吞吐量和丢包率优化总结

...兆,并且丢包率很高。最近我做了一些以太网吞吐量和丢包率方面的优化工作,有一些心得和大家分享一下。一、测试模型 二、影响吞吐量和丢包率的因素1.网卡DMA缓冲区大小  这个缓冲区决定txringbuffer和rxringbuffer的大... 查看详情

javasocket编程解决粘包和丢包问题

##socket丢包粘包解决方式采用固定头部长度(一般为4个字节),包头保存的是包体的长度header+body包头+包体 思路是:先读出一个包头,得到包体的长度,解析出包体 publicclassSocketServer{publicstaticvoidmain(Stringargs[]){ServerSockets... 查看详情

千兆以太网卡吞吐量和丢包率优化总结

...当网卡DMA缓冲区太小时,ringbuffer不够用,会造成网络数据丢包。此时,需要将数据包及时从ringbuffer里面取出来,暂存到接收队列里面(发送数据时同理)。然后在合适的时机再把数据包上传给协议栈。这... 查看详情

混沌工程之chaosmesh使用之模拟pod网络丢包(代码片段)

...留下一个思考的空间前言在《混沌工程之ChaosBlade-Operator使用之模拟POD丢包场景》中,我们提到过一次丢包场景的模拟了,但是不同的混沌工具,是否有不同的实现方式呢?今天我们来玩一个ChaosMesh的网络丢包࿰... 查看详情

混沌工程之chaosmesh使用之模拟pod网络丢包(代码片段)

...留下一个思考的空间前言在《混沌工程之ChaosBlade-Operator使用之模拟POD丢包场景》中,我们提到过一次丢包场景的模拟了,但是不同的混沌工具,是否有不同的实现方式呢?今天我们来玩一个ChaosMesh的网络丢包࿰... 查看详情

1.4包交换网络的时延,丢包,吞吐

1.4包交换网络的时延,丢包,吞吐问:考虑通过从源主机在固定线路发送一个数据包发送到目的主机。列出在端至端延迟的延迟因素。哪些因素是恒定的,哪些是变量?答:延迟因素有处理延迟(processingdelays),传输延迟(transmi... 查看详情

如何对idc机房网络带宽进行测试

...评估。一、网络稳定性检测机房的网络延迟、丢包率可以使用ping、smokeping、mtr三种工具来进行测试。Ping测试法(windows):1、 在windows系统下打开“运行”。快捷键:win+R2、 在运行窗口内输入“cmd”点击确定3、 在打... 查看详情

弱网测试

  在移动互联网时代,用户会在各种网络状况下使用我们的APP。他们使用3G或4G网络,甚至还在用2G,现在的人们更习惯在上下班的路上去关注一些新闻,看看股市,小说,直播,玩游戏等等。那么就会面临一个问题,在地铁里... 查看详情