TC - Linux 流量控制工具

TC - Linux 流量控制工具,第1张

参考: TC - Linux 流量控制工具 | Life is magic. Coding is art. (int64.me)

TC(Linux下流量控制工具)详细说明及应用_Gino的专栏-CSDN博客

本来打算直接列一波用法,但是总觉得,不记录一下原理, *** 作起来也是一脸懵逼。 TC 通过建立处理数据包队列,并定义队列中数据包被发送的方式,从而实现进行流量控制。TC 模拟实现流量控制功能使用的队列分为两类:

classful 队列规定(qdisc), 类(class)和过滤器(filter)这 3 个组件组成,绘图中一般用圆形表示队列规定,用矩形表示类,图 copy 自 Linux 下 TC 以及 netem 队列的使用

都是以一个根 qdisc 开始的,若根 qdisc 是不分类的队列规定,那它就没有子类,因此不可能包含其他的子对象,也不会有过滤器与之关联,发送数据时,数据包进入这个队列里面排队,然后根据该队列规定的处理方式将数据包发送出去。

分类的 qdisc 内部包含一个或多个类,而每个类可以包含一个队列规定或者包含若干个子类,这些子类友可以包含分类或者不分类的队列规定,如此递归,形成了一个树。

句柄号:qdisc 和类都使用一个句柄进行标识,且在一棵树中必须是唯一的,每个句柄由主号码和次号码组成 qdisc 的次号码必须为 0(0 通常可以省略不写)

根 qdisc 的句柄为 1:,也就是 1:0。类的句柄的主号码与它的父辈相同(父类或者父 qdisc),如类 1:1 的主号码与包含他的队列规定 1:的主号码相同,1:10 和 1:11 与他们的父类 1:1 的主号码相同,也为 1。

新建一个类时,默认带有一个 pfifo_fast 类型的不分类队列规定,当添加一个子类时,这个类型的 qdisc 就会被删除,所以,非叶子类是没有队列规定的,数据包最后只能到叶子类的队列规定里面排队。

若一个类有子类,那么允许这些子类竞争父类的带宽,但是,以队列规定为父辈的类之间是不允许相互竞争带宽的。

默认 TC 的 qdisc 控制就是出口流量,要使用 TC 控制入口,需要把流量重定向到 ifb 网卡,其实就是加了一层,原理上还是控制出口 。

为何要先说 classless 队列,毕竟这个简单嘛,要快速使用,那么这个就是首选了。基于 classless 队列,我们可以进行故障模拟,也可以用来限制带宽。

TC 使用 linux network netem 模块进行网络故障模拟

网络传输并不能保证顺序,传输层 TCP 会对报文进行重组保证顺序,所以报文乱序对应用的影响比上面的几种问题要小。

报文乱序可前面的参数不太一样,因为上面的报文问题都是独立的,针对单个报文做 *** 作就行,而乱序则牵涉到多个报文的重组。模拟报乱序一定会用到延迟(因为模拟乱序的本质就是把一些包延迟发送),netem 有两种方法可以做。

以 tbf (Token Bucket Filter) 为例,

参数说明:

限制 100mbit

限制延迟 100ms, 流量 100mbit

这个就复杂一些,同样也特别灵活,可以限制特定的 ip 或者服务类型以及端口

以使用 htb 为例

使用 TC 进行入口限流,需要把流量重定向到 ifb 虚拟网卡,然后在控制 ifb 的输出流量

网络故障一般包含网络数据异常,网络丢包和网络延迟。

Linux内核从2.2开始提供TC(Traffic Control)去控制Linux内核的流量,一般系统都是自带tc工具。

TC控制流程:

这里使用paping而不是ping,按照原作者说法是为了防止在防火墙开启的状态下可以ping通,但无法进行tcp连接的问题。

网络延迟:

tc qdisc add dev eth0 root netem delay 300ms

网络丢包:

tc qdisc add dev eth0 root netem loss 7% 25% #代表丢掉7%的包,但是成功率只有25%

tc qdisc add dev eth0 root netem loss 7% #只设置7%是代表随机丢掉7%的包

网络数据异常:

tc qdisc add dev eth0 root netem corrupt 10% # 10%的数据包损坏,不是没传过去,而是传过去不对。

网络数据重复:

tc qdisc add dev eth0 root netem duplicate 1% #随机产生1%的包重复

网络数据包乱序:

tc qdisc add dev eth0 root netem delay 10ms reorder 25% 50% #有25%的数据包(50%相关)会被立即发送,其他的延迟10秒

关闭网络异常模拟:

tc qdisc del dev eth0 root netem

监控网卡:

tc qdisc add dev eth0 root netem

其余命令:

tc qdisc change dev eth0 root netem duplicate 1%

tc qdisc replace dev eth0 root netem duplicate 1%

tc是要在client端设置的,因为只能控制数据发出,它模拟的是异常的数据到达Server后如何被处理,前提是数据在到达Server的时候已经异常了。

至于server端的控制,需要使用iptables。

参考文档:

https://honeypps.com/chaos/how-to-simulate-network-fault/

https://www.haxi.cc/archives/Linux%E6%A8%A1%E6%8B%9F%E5%A4%8D%E6%9D%82%E7%BD%91%E7%BB%9C%E7%8E%AF%E5%A2%83%E4%B8%8B%E7%9A%84%E4%BC%A0%E8%BE%93-netem%E5%92%8Ctc.html

一般直接用标尺测量。

tc是linux中常用的流控软件,但是tc命令中的各种规则和概念乍一看让人望而生畏,其实tc并没有看起来那样复杂。tc主要针对流量的控制和对流的整理。这里的流主要指的是传输层tcp/udp协议中的连接,视从A主机端口号到B主机端口号的网络传输是一条流。

一台主机会有很多这样的流,我们有时候想让一些流的优先级高一些,即将属于该流的数据包优先发送。但是一个网卡在同一时刻内只能发送一个数据包,多个流的数据包只能排着队发送,这样就引出了网卡发送队列,以及如何排队等问题。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7362806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存