Linux 工具 | 第1篇:高级流控-TC+HTB+IFB+内核模块
作者:isshe
日期:2018.09.19
邮箱:i.sshe@outlook.com
github: https://github.com/isshe
高级流控-TC+HTB+IFB+内核模块
- 1. 前言
- 2. 约定及环境
- 3. 需求、问题及解决方案
- 3.1 需求
- 3.2 最终实现图
- 3.3 遇到的问题
- 4. 相关文档
1. 前言
接触了TC以后,感觉就是:别说入门了,根本连门都找不到。
网上资料一大堆,但是就是看得头痛并且一脸懵逼。
但是这篇文章并不对TC相关基础概念进行介绍。网络上一搜基本都是关于概念介绍
以及TC+iptables
或者TC + 单ifb
的。
这篇文章的关键词:tc
、ifb
、fw
、htb
。主要希望能更灵活地实现一些流控的功能。
2. 约定及环境
环境:
- openwrt路由器
一些约定:
出口/入口:站在用户的角度,对用户而言,也就是上传=出口,下载=入口。
一些关键信息:TC的整形一般情况下,只能对出口流量(egress)进行。
- 对于
wan口
来说:下载是ingress,上传是egress - 对于
lan口
来说:下载是egress,上传是ingress - 因此,常规做法是,在lan口做下载流控,在wan口做上传流控
- 对于
3. 需求、问题及解决方案
3.1 需求
探索一个工具,通常是因为一些需求。
最本质的需求:对入口/下载
和出口/上传
流量中重要的
流量进行保障,提升冲浪?体验。
重要与否是根据个人需求。文章中指的重要的流量:游戏、语音通话等(流量不大并对延时要求高的流量);不重要的流量:下载等(流量大并对延时要求低的)
3.2 最终实现图
[wan1] \ / [lan1]
[wan2]-- ifb0 ----ifb1 -- [lan2]
[wan3] / \ [lan3]
优点:
- 支持多lan、多wan;
- 流控内容可定制性高,可实现复杂的流控。
- 配置简单(相比使用TC+U32+iptables)
缺点:
- 需要编写流量识别模块(识别IP?识别协议?识别应用?)
- 需要编写内核打标记模块。
这两个模块可以合二为一。
3.3 遇到的问题
1.如何只对外网流量(lan-wan)进行控制,不对内网流量(lan-lan)进行控制?
- 很简单,不使用常规做法,不用lan口,不对lan口做任何流控。
刚开始的尝试是,对lan-lan流量进行过滤。但是最后没有这样实现:1.不灵活,IP识别困难,外网IP也可以当做内网IP用;2.对不关注的流量进行操作,有性能损耗。
2.使用wan口的话,
egress/上传
的流控如何识别lan口的IP?egress的流量,经过nat以后,源IP不再是lan段的IP,因此无法标识具体的IP/用户。----> ingress ---> | ---> netfilter ---> | ---> egress --------------------------------------------------------(打mark)nat转换 TC流控
- 解决方法是使用
fw
分类器。在netfilter的forward上挂一个自定义的模块(如:MyMark)
,根据需求打mark,这里可以任意发挥想象,直觉可以实现任意你想到的功能。(牛13吹起来) fw
分类器,根据mark来分类:把打了1111
标记的分类到1:10
tc filter add dev ifbx parent 1: protocol ip prio 1 handle 1111 fw flowid 1:10
- 解决方法是使用
3.如何做到对
上传
和下载
都进行流控,并且不使用lan口?- 这里用的是
ifb
;还有其他方式,但是没细看。 ifb
原理就是开一些接口,把实际接口的ingress流量转到这些ifb接口的egress上;这样看起来会有一定的性能损耗。但是记得文档上说,对性能影响不大。(待查实)
- 这里用的是
4.如果采用打mark的形式,会遇到问题:打mark是在
netfilter
那里,但是ingress处流控在netfilter之前,将无法使用mark?----> ingress ---> | ---> netfilter(打mark) ---> | ---> egress
- 这个人家实现ifb的时候已经考虑到了:把eth0的所有IP协议流量转到ifb0,并把链接跟踪的mark恢复到skb->mark中。
tc filter add dev eth0 parent ffff: protocol ip prio 0 u32 match u32 0 0 action connmark action mirred egress redirect dev ifb0
- 这个人家实现ifb的时候已经考虑到了:把eth0的所有IP协议流量转到ifb0,并把链接跟踪的mark恢复到skb->mark中。
5.如果其他程序(如mwan3)也使用了skb->mark的话,怎么办?
- mark是按位操作的。例如:mwan3使用0x0000-0xff00,我们就可以用
0x01xxxx-0xffxxxx(16-23位)
- 问题2中的配置可以改为: (注意
65536/ff0000
!)tc filter add dev ifbx parent 1: protocol ip prio 1 handle 65536/ff0000 fw flowid 1:10
mwan3新版本貌似可以自定义mark范围了…不过没关系,还是可以指定。
- mark是按位操作的。例如:mwan3使用0x0000-0xff00,我们就可以用
6.如何实现保障?
- 用htb进行保障,同时还支持优先级。
注意:要预留突发带宽。例如10Mbps,要预留1-2M作为突发带宽。
4. 相关文档
- LARTC-zh_CN.GB2312_流控高级应用
- Tc-man、Htb-man等man
- TC-HOWTO
- HTB手册
Linux 工具 | 第1篇:高级流控-TC+HTB+IFB+内核模块相关推荐
- 防火墙、路由器、交换机+模拟软件+流控
[布线技术和数据中心建设] 我们为什么需要智能布线? 网界网-数据中心百家讲坛 网络综合布线管理软件设计和实现 阿尔卡特朗讯数据中心交换方案 ALU应用流畅数据中心白皮书下载 解析数据中心布线系统构成 ...
- linux流控系统,Linux流量控制(TC)之表面
1.1 流量控制是什么 流量控制是路由器上报文的接收和发送机制及排队系统的统称.这包括在一个输入接口上决定以何种速率接收何种报文,在一个输出接口上以何种速率.何种顺序输出何种报文. 传统的流量 ...
- 流控思路——多消费者定量生产(第100篇)
为什么80%的码农都做不了架构师?>>> 多线程消费队列到指定个数时触发一个生产线程往队列中补充元素,保证队列中有足够的数据供消费,不至于使消费线程等待,也不至于在队列中堆得过 ...
- Spring Cloud Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)
文章目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashbo ...
- linux内核TCP 滑动窗口,TCP滑动窗口和流控
TCP的滑动窗口是一个很重要的概念,也是很晦涩的一个知识点.下面就大概介绍下TCP滑动窗口为什么出现?它是怎么工作的的? 什么是TCP窗口 首先,要理解,client和server各自协议栈都有自己的 ...
- 搜狐视频P2P技术揭秘 - 流控篇
1 各种流控算法 说到流控算法,业内人士脑海中应该立刻就能够浮现出下面的名词: TCP,拥塞控制,滑动窗口: QUIC,BBR: WebRTC,GCC,TransportCC UDT: KCP: -- ...
- 安排,谷粒商城java分布式开发基础篇高级篇与高可用集群架构篇2020
来源: 来自网络,如侵权请告知博主删除????. 仅学习使用,请勿用于其他- 最近有小伙伴管我要分布式这类的项目,还有一些要商城的,还有要springboot,springcloud,k8s等,几乎涵 ...
- 鸟哥的Linux私房菜(基础篇)- 第十四章、Linux 账号管理与 ACL 权限配置
第十四章.Linux账号管理与 ACL 权限配置 最近升级日期:2009/09/09 要登陆 Linux 系统一定要有账号与口令才行,否则怎么登陆,您说是吧?不过,不同的使用者应该要拥有不同的权限才行 ...
- c linux time微秒_学习linux,看这篇1.5w多字的linux命令详解(6小时讲明白Linux)
用心分享,共同成长 没有什么比每天进步一点点更重要了 本篇文章主要讲解了一些linux常用命令,主要讲解模式是,命令介绍.命令参数格式.命令参数.命令常用参数示例.由于linux命令较多,我还特意选了 ...
最新文章
- 第二冲刺站立会议01
- mysql linux版本 rpm_Linux下查看MySQL版本及rpm里有没有MySQL
- 35岁学嵌入式合适吗_什么是嵌入式技术?
- SAR图像变化检测的评价方法
- 5月份美网络游戏用户达8700万 同比增长22%
- 介绍自己以及github注册流程
- [mount]linux 挂载时 mount: wrong fs type, bad option, bad superblock on /dev/sdb
- 苹果面临5G困境!向三星采购碰壁 高通表态:苹果有我们电话
- python init文件_Python __init__.py 作用详解
- 190531每日一句
- win10 u盘 修复计算机,不用u盘修复bootmgrwin10方法
- 用了很多群控与云控,微信还是慢慢死掉了
- ppt 计算机图标不见了,显示桌面图标不见了如何恢复.ppt
- 3D (Input) Sparse Convolution
- 手机wifi的mac地址是什么??
- Jupyter Notebook又一懒人神器,拖拽生成Python代码
- 分析拼多多分享文案的技巧
- 生产者消费者的几种写法
- command a expects \ followed by text
- 十四、C指针详解(四):指针的指针