作者: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的。
这篇文章的关键词:tcifbfwhtb。主要希望能更灵活地实现一些流控的功能。

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

  • 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范围了…不过没关系,还是可以指定。

  • 6.如何实现保障?

    • 用htb进行保障,同时还支持优先级。
    • 注意:要预留突发带宽。例如10Mbps,要预留1-2M作为突发带宽。

4. 相关文档

  • LARTC-zh_CN.GB2312_流控高级应用
  • Tc-man、Htb-man等man
  • TC-HOWTO
  • HTB手册

Linux 工具 | 第1篇:高级流控-TC+HTB+IFB+内核模块相关推荐

  1. 防火墙、路由器、交换机+模拟软件+流控

    [布线技术和数据中心建设] 我们为什么需要智能布线? 网界网-数据中心百家讲坛 网络综合布线管理软件设计和实现 阿尔卡特朗讯数据中心交换方案 ALU应用流畅数据中心白皮书下载 解析数据中心布线系统构成 ...

  2. linux流控系统,Linux流量控制(TC)之表面

    1.1 流量控制是什么 ​ 流量控制是路由器上报文的接收和发送机制及排队系统的统称.这包括在一个输入接口上决定以何种速率接收何种报文,在一个输出接口上以何种速率.何种顺序输出何种报文. ​ 传统的流量 ...

  3. 流控思路——多消费者定量生产(第100篇)

    为什么80%的码农都做不了架构师?>>>    多线程消费队列到指定个数时触发一个生产线程往队列中补充元素,保证队列中有足够的数据供消费,不至于使消费线程等待,也不至于在队列中堆得过 ...

  4. Spring Cloud Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)

    文章目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashbo ...

  5. linux内核TCP 滑动窗口,TCP滑动窗口和流控

    TCP的滑动窗口是一个很重要的概念,也是很晦涩的一个知识点.下面就大概介绍下TCP滑动窗口为什么出现?它是怎么工作的的? 什么是TCP窗口 首先,要理解,client和server各自协议栈都有自己的 ...

  6. 搜狐视频P2P技术揭秘 - 流控篇

    1 各种流控算法 说到流控算法,业内人士脑海中应该立刻就能够浮现出下面的名词: TCP,拥塞控制,滑动窗口: QUIC,BBR: WebRTC,GCC,TransportCC UDT: KCP: -- ...

  7. 安排,谷粒商城java分布式开发基础篇高级篇与高可用集群架构篇2020

    来源: 来自网络,如侵权请告知博主删除????. 仅学习使用,请勿用于其他- 最近有小伙伴管我要分布式这类的项目,还有一些要商城的,还有要springboot,springcloud,k8s等,几乎涵 ...

  8. 鸟哥的Linux私房菜(基础篇)- 第十四章、Linux 账号管理与 ACL 权限配置

    第十四章.Linux账号管理与 ACL 权限配置 最近升级日期:2009/09/09 要登陆 Linux 系统一定要有账号与口令才行,否则怎么登陆,您说是吧?不过,不同的使用者应该要拥有不同的权限才行 ...

  9. c linux time微秒_学习linux,看这篇1.5w多字的linux命令详解(6小时讲明白Linux)

    用心分享,共同成长 没有什么比每天进步一点点更重要了 本篇文章主要讲解了一些linux常用命令,主要讲解模式是,命令介绍.命令参数格式.命令参数.命令常用参数示例.由于linux命令较多,我还特意选了 ...

最新文章

  1. 第二冲刺站立会议01
  2. mysql linux版本 rpm_Linux下查看MySQL版本及rpm里有没有MySQL
  3. 35岁学嵌入式合适吗_什么是嵌入式技术?
  4. SAR图像变化检测的评价方法
  5. 5月份美网络游戏用户达8700万 同比增长22%
  6. 介绍自己以及github注册流程
  7. [mount]linux 挂载时 mount: wrong fs type, bad option, bad superblock on /dev/sdb
  8. 苹果面临5G困境!向三星采购碰壁 高通表态:苹果有我们电话
  9. python init文件_Python __init__.py 作用详解
  10. 190531每日一句
  11. win10 u盘 修复计算机,不用u盘修复bootmgrwin10方法
  12. 用了很多群控与云控,微信还是慢慢死掉了
  13. ppt 计算机图标不见了,显示桌面图标不见了如何恢复.ppt
  14. 3D (Input) Sparse Convolution
  15. 手机wifi的mac地址是什么??
  16. Jupyter Notebook又一懒人神器,拖拽生成Python代码
  17. 分析拼多多分享文案的技巧
  18. 生产者消费者的几种写法
  19. command a expects \ followed by text
  20. 十四、C指针详解(四):指针的指针

热门文章

  1. 现在国内最牛逼的 Spring CloudAlibaba全栈操作手册,不接受反驳
  2. 洛谷T46780 ZJL 的妹子序列(生成函数)
  3. Godot着色器语言
  4. 第三篇第二章室内外消防给水系统
  5. MySQL每天定时12点弹出黑窗口
  6. Dfine2 for mac(图片降噪工具)
  7. Unity中图片挖洞
  8. python javascript人工智能_Python,Java和JavaScript哪个编程语言未来发展空间更大?...
  9. 文章转载-狂人日记-鲁迅
  10. 网易2019年实习生招聘笔试题