首页 > 代码库 > linux 下使用 tc 模拟网络延迟和丢包

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

模拟延迟传输简介

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 模拟网络延迟和丢包