一.tc的简介

tc,即traffic control,顾名思义,tc是linux进行流量控制的工具.通过tc,你可以控制网络接口发送数据的速率. 
每个网络接口(如:eth0,ppp0)都有一个队列,用于管理和调度待发的数据.tc的工作原理就是,通过设置不同类型 
的网络接口队列,从而改变数据包发送的速率和优先级,达到流量控制的目的.

二.启用tc功能

如果你想使用tc功能,请确认你的内核配置中带有 “IP: advanced router” 和”IP: policy routing” 两项, 
并添加了相关的子选项.重新编译内核后,就可以使用tc命令对内核网络队列进行配置了.

三.tc中的队列类型

tc是通过设置不同的队列类型和属性来控制网络接口的流量. 
Linux内核中支持的队列有: 
TBF(Token Bucket Flow令牌桶过滤器), pfifo_fast(Third Band First In First Out Queue先进先出队列), 
SFQ(Stochastic Fairness Queueing随机公平队列), HTB(Hierarchy Token Bucket分层令牌桶)等.

每个队列有不同的用途和属性值:

1.pfifo_fast(先进先出队列)

这个队列有3个所谓的”频道”.FIFO规则应用于每一个频道.并且:如果在0频道有数据包等待发送,1频道的包就不会被处理, 
1频道和2频道之间的关系也是如此. 
pfifo_fast只起到调度的作用,对数据流量不进行控制. 
pfifo_fast是系统默认的队列类型,你可以使用ip命令来查看当前的网络队列设置:

# ip link list
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueuelink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000link/ether 00:40:ca:66:3d:d2 brd ff:ff:ff:ff:ff:ff
3: sit0: <NOARP> mtu 1480 qdisc nooplink/sit 0.0.0.0 brd 0.0.0.0

2.令牌桶过滤器(TBF)

令牌桶过滤器(TBF)是一个简单的队列规定:按照事先设定的速率来处理数据包通过,但允许短暂突发流量 
朝过设定的速率. 
TBF很精确,对于网络和处理器的影响都很小.TBF的实现在于一个缓冲器(桶),里面是一些叫做”令牌”的数据.
它以特定的速率处理网络数据包.桶最重要的参数就是它的大小,也就是它能够存储令牌数据的数量. 
每个令牌从数据队列中收集一个数据包,然后从桶中被删除.这个算法关联到两个流上——令牌流和数据流, 
于是我们得到3种情景: 
数据流以等于令牌流的速率到达TBF.这种情况下,每个到来的数据包都能对应一个令牌,然后无延迟地通过队列. 
数据流以小于令牌流的速度到达TBF.通过队列的数据包只消耗了一部分令牌,剩下的令牌会在桶里积累下来,直到桶被装满. 
剩下的令牌可以在需要以高于令牌流速率发送数据流的时候消耗掉,这种情况下会发生突发传输. 
数据流以大于令牌流的速率到达TBF.这意味着桶里的令牌很快就会被耗尽.导致TBF中断一段时间,称为”越限”. 
如果数据包持续到来,将发生丢包. 
最后一种情景非常重要,因为它可以用来对数据通过过滤器的速率进行×××. 
令牌的积累可以导致越限的数据进行短时间的突发传输而不必丢包,但是持续越限的话会导致传输延迟直至丢包. 
<TBF参数说明>

limit/latency 
limit确定最多有多少数据(字节数)在队列中等待可用令牌.你也可以通过设置latency参数来指定这个参数, 
latency参数确定了一个包在TBF中等待传输的最长等待时间.后者计算决定桶的大小,速率和峰值速率. 
这两个参数是相互独立的.

burst/buffer/maxburst 
桶的大小,以字节计.这个参数指定了最多可以有多少个令牌能够即刻被使用.通常,管理的带宽越大,需要的缓冲器就越大. 
在Intel体系上,10Mbit/s的速率需要至少10k字节的缓冲区才能达到期望的速率. 
如果你的缓冲区太小,就会导致到达的令牌没有地方放(桶满了),这会导致潜在的丢包.

mpu 
一个零长度的包并不是不耗费带宽.比如以太网,数据帧不会小于64字节.Mpu(Minimum Packet Unit,最小分组单位) 
决定了令牌的最低消耗.默认值是0.

rate 
速度操纵杆.参见上面的limits! 
如果希望设置峰值速率,使用下面的参数:

peakrate 
令牌桶的最大的速率.

mtu/minburst 
设置了peakrate后,为了提高精确度,也要设置接口的MTU值.如果需要设置peakrate,而又允许突发的大数据传输
这个值可以设置的大一些.minburst设置为3000字节,则可提供3Mbit/s的peakrate. 
令牌桶过滤器适用于需要精确设置速率的网络,它并不对数据包进行调度,只进行流量控制.

3. SFQ随机公平队列

SFQ(Stochastic Fairness Queueing,随机公平队列)是公平队列算法家族中的一个简单实现.它的没有其它的方法那么精确, 
它在实现高度公平的同时,需要的计算量却很少.SFQ的关键词是”会话”(或称作”流”) ,主要针对一个TCP会话或者UDP 
流.流量被分成相当多数量的FIFO队列中,每个队列对应一个会话.数据按照简单轮转的方式发送, 每个会话都按顺序得到发送
机会. 
这种方式非常公平,保证了每一个会话都不会没其它会话所淹没.SFQ之所以被称为”随机”,是因为它并不是真的为每一个会话 
创建一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去. 
因为使用了散列,所以可能多个会话分配在同一个队列里,从而需要共享发包的机会,也就是共享带宽.为了不让这种效应太明显, 
SFQ会频繁地改变散列算法,以便把这种效应控制在几秒钟之内. 
只有当你的出口网卡确实已经挤满了的时候,SFQ才会起作用!否则在你的Linux机器中根本就不会有队列,SFQ也就不会起作用. 
SFQ不会重新调整流量的速率,只是进行数据包的调度.

<SFQ参数说明> 
perturb 
多少秒后重新配置一次散列算法.如果取消设置,散列算法将永远不会重新配置(不建议这样做).10秒应该是一个合适的值. 
quantum 
一个流至少要传输多少字节后才切换到下一个队列.却省设置为一个最大包的长度(MTU的大小).不要设置这个数值低于MTU!

四. tc配置实例

1.单一队列的配置.

(1).在eth0上设置一个tbf(令牌桶过滤器)队列, 网络带宽220kbit,延迟50ms,缓冲区为1540个字节.

# tc qdisc add dev eth0 root tbf rate 200kbit latency 50ms burst 1540

查看eth0接口上的队列设置

# ip link list
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueuelink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc tbf qlen 1000link/ether 00:40:ca:66:3d:d2 brd ff:ff:ff:ff:ff:ff
3: sit0: <NOARP> mtu 1480 qdisc nooplink/sit 0.0.0.0 brd 0.0.0.0
# tc qdisc ls dev eth0 # 查看eth0上的队列规则
qdisc tbf 8001: rate 200Kbit burst 1539b lat 48.8ms

此时,另一台机器从这台服务器上下载文件的速率则只有20K左右. 
删除此队列规则

# tc qdisc del dev eth0 root tbf rate 220kbit latency 50ms burst 1540

(2).在eth0上设置一个sfq(随机公平队列).每10秒钟重新设置一次算法.

# tc qdisc add dev eth0 root sfq perturb 10

查看eth0接口上的队列设置

# ip link list
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueuelink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc sfq qlen 1000link/ether 00:40:ca:66:3d:d2 brd ff:ff:ff:ff:ff:ff
3: sit0: <NOARP> mtu 1480 qdisc nooplink/sit 0.0.0.0 brd 0.0.0.0
# tc qdisc ls dev eth0
qdisc sfq 8002: limit 128p quantum 1514b perturb 10sec

此时,另一台机器从这台服务器上下载文件的速率没有变化.因为sfq只进行调度,而不进行流量控制.

转载于:https://blog.51cto.com/professor/1571015

traffic-control: tc流量管理简介     --TurboLinux知识库相关推荐

  1. Linux下QoS模块之tc(traffic control)操作简介/CBQ

    Linux从kernel 2.1.105开始支持QOS,不过,需要重新编译内核.运行 'make config'时将 EXPERIMENTAL_OPTIONS 设置成 'y',并且将 Class Ba ...

  2. Linux TC(Traffic Control)框架原理解析

    近日的工作多多少少和Linux的流控有点关系.自打几年前知道有TC这么一个玩意儿而且多多少少理解了它的原理之后,我就没有再动过它,由于我不喜欢TC命令行,实在是太繁琐了.iptables命令行也比較繁 ...

  3. 【网络】inux流量控制器TC(Traffic Control)

    目录 实施 实施步骤概览 实施步骤 原理 经验之谈: 实施 原文:https://blog.csdn.net/tycoon1988/article/details/40832325 实施步骤概览 在L ...

  4. 【测试】linux tc命令|Linux模拟网络延迟、丢包等|traffic control(流量控制)

    目录 一.工具介绍 1.netem 2.tc 二.命令使用说明 1.模拟延迟传输 2.模拟网络丢包: 3.模拟包重复: 4.模拟数据包损坏: 5.模拟数据包乱序: 6.删除模拟配置: 更多高级用法 一 ...

  5. Linux TC Traffic Control 框架原理解析

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 近日的工 ...

  6. 转载 - Linux TC(Traffic Control)框架原理解析

    近日的工作多多少少和Linux的流控有点关系,自打几年前知道有TC这么一个玩意儿并且多多少少理解了它的原理之后,我就没有再动过它,因为我不喜欢TC命令行,实在是太繁琐了,iptables命令行也比较繁 ...

  7. 【转】Linux TC(Traffic Control)框架原理解析

    看到一篇讲TC的博客,感觉是网上这么多介绍TC的文章里讲得最好的,就顺手转载了.感谢作者. 原地址:http://dog250.blog.51cto.com/2466061/1568267 近日的工作 ...

  8. 利用traffic control模拟网络延迟和丢包

    1. 模拟延迟和丢包语句介绍 # 设置延迟语句: 从 eno1.enp7s0f0 网口出去的包将延迟20ms tc qdisc add dev eno1 root netem delay 20ms t ...

  9. Linux流量控制指南 (Traffic control HOWTO)

    流量控制指南 版本 1.0.2 Martin A. Brown 原文地址:http://www.tldp.org/HOWTO/html_single/Traffic-Control-HOWTO/ 翻译 ...

最新文章

  1. 美国爱因斯坦计划技术分析
  2. R语言Box-Cox变换实战(Box-Cox Transformation):将非正态分布数据转换为正态分布数据、计算最佳λ、变换后构建模型
  3. ASP.NET之对称算法加密
  4. 2020.12.15
  5. Eclipse里选择Servlet Run As Server后,自动生成了哪些资源?
  6. B. One Bomb (#363 Div.2)
  7. 牛客OI周赛4-提高组 C 战争(war)
  8. day31-python阶段性复习五
  9. oracle ora 16047,令人误解的ORA-16047: DGID mismatch between destination setting and target database...
  10. Linux里面qt的可执行文件在命令行中可以打开,双击可执行文件打不开
  11. putty安装和使用
  12. SDL Trados外部审阅无法正常导入并显示修订的问题
  13. 展示和隐藏后缀名操作
  14. 一个男孩子如果到了23岁,就不会再长高了。。。
  15. 生活数字化 小故事告诉你什么是大数据
  16. java.lang.IllegalArgumentException: Can not set java.lang.Integer field com.pojo.Fruit.price to java
  17. hibernate中对象的状态有三种
  18. 管道过滤器和批处理方式
  19. 这篇Docker的网络通信与数据共享文章看不懂你来打我吧
  20. 360加固保so解密过程

热门文章

  1. python学习-06(模块化编程)
  2. dz邮箱验证怎么设置_如何设置discuz qq邮箱验证
  3. git 撤销提交 撤销暂存区 取消操作
  4. 笔记本新增一块1T固态,如何将系统迁移到新的固态,无缝对接(无需重装系统,迁移后直接用)。
  5. 如何解决万能地图下载器下载的地图和选择范围不一致
  6. Cesium - 地图下载器(python)
  7. 什么是强化学习呢,来涨波知识
  8. 保研之路——北大工学院生物医学工程系夏令营
  9. VLC-Android音频播放不完整问题踏坑
  10. 《Flex+PHP RIA应用开发实战详解-梁文新版》学习日记1