目录

文章目录

  • 目录
  • tc CLI - Linux 流量控制工具
  • TC 的基本原理
  • TC 的组件
    • Qdisc
      • 无类别队列规定(Classless Qdiscs)
      • 分类队列规定(Classful Qdiscs)
    • Class
    • Filter

tc CLI - Linux 流量控制工具

TC(Traffic Control)是 Linux 操作系统的流量控制器,它利用 “队列规定” 建立处理数据包的队列,并定义队列中的数据包被发送的方式, 从而实现对流量的控制。

示例:限制网卡 eth0 的速率为 10Mbps

tc qdisc add dev eth0 root tbf rate 10mbit burst 10kb lat 400.0ms
tc -s qdisc ls dev eth0

TC 的基本原理

  1. 数据包从 Input Interface 进入,经过 Ingress Policing 时丢弃了不符合规定的数据包,通过的数据包再由 Input De-Multiplexing(输入多路分配器)进行判断选择。

  2. 如果数据包的目的地是本主机,那么将数据包送给上层处理;否则需要进行 Forward(转发),将数据包交到 Forwarding Block(转发块)处理。Forwarding Block 同时也接收本主机上层(e.g. TCP、UDP 等网络协议栈)产生的包。 Forwarding Block 通过查看路由表,决定数据包的下一跳。然后,对数据包进行排列并传送到 Output Interface。

一般来说 Linux 只能限制网卡发送的数据包,而不能限制网卡接收的数据包,Linux 可以通过改变发送的次序来控制传输速率。Linux TC(Traffic Control)主要是在输出接口排列时进行处理和实现的。

TC 的组件

TC 主要由 qdisc(队列规定),class(类)和 filter(过滤器)这 3 个组件构成。

  • qdisc:通过队列将数据包缓存起来,用来控制网络收发的速度。
  • class:用来表示控制策略。
  • filter:用来将数据包划分到具体的控制策略。

绘图中一般用圆形表示 qdisc,用矩形表示 class:

Qdisc

Qdisc,队列,更准确应该称之为排队规则,是管理网卡输入/输出数据的一个算法,用于确定数据包的发送方式。每张网卡都与一个 Qdisc 关联,每当 Linux Kernel 需要将数据包从网卡发送时,都会先将数据包添加到该网卡所配置的 Qdisc 中,由 Qdisc 来决定数据包的发送顺序。因此可以说,所有的流量控制都发生在队列中。

TC 的 Qdisc 类型有很多,如:CBQ、HTB 等等。其中 CBQ 比较复杂,不容易理解。而 HTB(Hierarchical Token Bucket,分层令牌桶)是一个可分类的队列,与其他复杂的队列类型相比,HTB 具有功能强大、配置简单及容易上手等优点。下文示例中使用了 HTB。

总的来说,Qdisc 可分为两类:无类别队列规定分类队列规定。前者相对简单,而分类队列规定则具有分类和过滤器等概念,是高级的流量控制功能。

无类别队列规定(Classless Qdiscs)

所谓 “无类别”,即:对进入网卡的数据包不加以区分,使用统一的队列规定。

  • 无类别队列规定的队列支持:接受数据包、重新编排数据包、延迟或丢弃数据包,可以对整个网卡的流量进行整形,但不会细分各种情况。
  • 常用的无类队别规定队列主要有:pfifo _fast(先进现出,默认队列)、TBF(令牌桶过滤器)、SFQ(随机公平队列)、ID(前向随机丢包)等等。
  • 这类队列规定使用的流量整形手段主要是:排序、限速和丢包。

分类队列规定(Classful Qdiscs)

所谓 “分类”,即:对进入网络设备的数据包根据不同的需求以分类的方式区别对待。

  • 数据包进入一个分类队列规定的队列后,就被送到了某一个类中,即对数据包进行分类处理。对数据包进行分类的工具是过滤器,过滤器会返回一个决定,队列规定就根据这个决定把数据包送入相应的分类中进行排队。
  • 每个分类又可以拥有多个子类,而每个子类都可以再次使用各自的过滤器进一步的分类,直到不需要再次分类为止,数据包才进入该类包含的队列中排队。
  • 除了能够包含其它队列规定之外,绝大多数的分类队列规定还能够对流量进行整形。这在需要同时进行调度和流量控制的场景中非常有用。

Class

如果一个类没有子类,那么这个类被称为叶子类,否则就被成为内部类。如上图,1:1 和 1:12 是内部类,其他均为叶子类。叶子类都拥有一个负责为这个类发送数据的 Qdiscs,而且这个 qdisc 是可以再次分类的,如 1:10 有一个分类的队列规定。

Filter

就是一些规则,根据这些规则对数据包进行分类,过滤器可以属于 Qdiscs,也可以属于内部类,若需要在叶子类上再实现分类,那就必须将过滤器与叶子类的分类队列规定关联起来,而不能与叶子类相关联。

最常用的是 U32 过滤器,由一个过滤器和一个动作组成,选择器用来对数据包进行匹配,一旦匹配成功就执行该动作。

Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)相关推荐

  1. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的实现原理

    目录 文章目录 目录 基本概念 QoS.Bandwidth 和 Traffic Control 队列 FIFO 队列 pfifo_fast 队列 SFQ 队列 令牌桶队列 数据流(Data Flow) ...

  2. Linux Kernel TCP/IP Stack — L2 Layer — Traffic Control(流量控制)的基本操作

    目录 文章目录 目录 使用 TC 进行流量控制 创建队列 创建分类 设置过滤器 上行带宽限制 下行带宽限制 对 SrcIP 进行限速 使用 TC 进行流量控制 综上,Linux 要对网卡进行流量控制, ...

  3. Linux Kernel TCP/IP Stack — L2 Layer — Linux Bridge(虚拟网桥)的基本操作

    目录 文章目录 目录 Linux bridge 的基本操作 创建 Bridge 将 veth pair 连上 Bridge 为 Bridge 配置 IP 地址 将物理网卡接口设备挂靠 Bridge L ...

  4. Linux Kernel TCP/IP Stack — L2 Layer — Linux Bridge(虚拟网桥)

    目录 文章目录 目录 Linux bridge Linux bridge 的实现方式 Linux bridge 的代码逻辑 Linux bridge 在 Linux 的语境中,Bridge(网桥)和 ...

  5. Linux Kernel TCP/IP Stack — L2 Layer

    目录 文章目录 目录 L2 Layer IEEE 802 协议族 L2 Layer IEEE 802 协议族 802.1 VLAN 802.3 CSMA/CD 802.5 Token Ring(令牌环 ...

  6. Linux Kernel TCP/IP Stack — L2 Layer — switchdev L2 Offload

    目录 文章目录 目录 switchdev 框架(二层交换 Offload 实现) switchdev 框架(二层交换 Offload 实现) Linux 4.0 引入了 switchdev 框架,它代 ...

  7. Linux Kernel TCP/IP Stack — L2 Layer — Linux VLAN device for 802.1.q(虚拟局域网)

    目录 文章目录 目录 虚拟局域网(Linux VLAN device for 802.1.q) 虚拟局域网(Linux VLAN device for 802.1.q) VLAN 的种类很多,按照协议 ...

  8. Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架

    目录 文章目录 目录 netfilter 框架 netfilter 的组成模块 netfilter 的 Hook 机制实现 netfilter 的工作原理 规则(Rules) 链(Chains) 表( ...

  9. Linux Kernel TCP/IP Stack — L7 Layer — Application Socket I/O 接口类型

    目录 文章目录 目录 基本概念 同步与异步 阻塞与非阻塞 I/O 操作的执行流程 Socket I/O 接口类型 阻塞 IO 缺点 非阻塞 IO 缺点 阻塞 IO 与非阻塞 IO 的区别 IO 多路复 ...

最新文章

  1. html style属性
  2. C#合并两张表结构相同(列数和列类型都相同)的表
  3. 音频编码标准发展现状
  4. boost::sort::block_indirect_sort相关的测试程序
  5. 基本机器学习面试问题 --- 理论/算法2
  6. 提现接口网站 php,API提现接口
  7. java 管理系统登陆完毕后关闭窗口_【求助】登录窗口登录成功后隐藏窗口
  8. sendMessage 与 obtainMessage (sendToTarget)比较
  9. 在不动用sp_configure的情况下,如何 =》去掉列的自增长,并保留原数据
  10. 42 可写成成三个整数的立方和
  11. 创业者应该了解的五大无服务器AWS服务
  12. Java学习系列及数据结构博客全目录
  13. 2018蓝桥杯C++A组:三角形面积(海伦公式;向量的叉积)
  14. poj 1001 分析
  15. mac内存空间不足怎么办?试试删除这几个文件夹!
  16. android office转pdf插件,Office自带Word转PDF插件 让office的另存为可存储为PDF文件
  17. 在移动硬盘上安装Deepin Linux 操作系统
  18. 泰勒展开式求sinx近似值
  19. 服务器日志显示意外关闭,服务器多次异常关闭,错误日志:计算机已经从检测错误后重新启动。。检测错误: - Microsoft Community...
  20. WTL 自绘控件库 (CQSTreeView)

热门文章

  1. 重庆事业单位计算机职称评定,看效果 | 重庆事业单位改革 职称评定不再“终身制”...
  2. python课后题答案第五章_Python语言程序设计(美-梁勇)第5章习题解答
  3. 事务配置_SSH(五)- 使用注解方式配置事务管理
  4. c++中把一个函数中的语句复制到另一个语句中报错_从底层看前端(十一)—— JavaScript语法:脚本,模块和函数体。...
  5. multisim页面不够大_观赏变出售 捡漏钱不够
  6. seaborn系列 (2) | 散点图scatterplot()
  7. 统计学习方法笔记(二)-kd树原理及python实现
  8. 看屁股,你是一头大象吧
  9. 百度景鲲:疫情居家让智能音箱经受了检验,下一步「破圈」
  10. iPhone遭遇最强烈的黑客攻击:密码、位置、联系人,敏感数据都泄露,谷歌发现的...