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 的输出流量
一般来说,对局域网流量的监控限制有两个解决方案:1. 串联方式的流量分配。
Linux *** 作系统中的流量控制器可以通过在输出端口处建立一个队列来实现流量控制。通过使用一台linux的网关,即可设置每台机器的流量。市场上也有相应的产品(一般是硬件产品)可以做到流量分配。
这个方案的关键是必须要使用网关或者网桥的连接方式,所以对网速会有一定的影响。
另外,固定的流量分配使用起来比较呆板,不能使互联网带宽得到有效利用。比如:在上网带宽很空闲的情况下,客户机仍然只能使用分配到的流量,从而造成了带宽资源的浪费。
优点在于可以精确的分配流量。
2. 旁路方式的流量限制。
如果不需要精确的分配流量,那么通过旁路方式的监控也可以做到流量的监控。旁路监控方式是通过交换机的端口镜像功能,对数据进行分析还原。同样也可以监控到每台机器的上网流量,并且可以禁止P2P软件使用。旁路方式的优点是部署方便,不会影响网速。缺点是不能做到精确的分配流量。
以超级嗅探狗为例,对流量控制方面可以做到如下功能:
1. 实时流量监视,监视每台电脑的实时流量。
2. 禁止带宽耗用比较多的协议,如:P2P、在线视频、下载等。
3. 在流量高峰时禁止某些电脑上网。如:当实时上网带宽到达了总带宽的80%时,禁止某些电脑上网。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)