Wondershaper网络限制脚本源码分析一(下载速度限制篇)

2024-05-16 11:36

本文主要是介绍Wondershaper网络限制脚本源码分析一(下载速度限制篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Wondershaper 是一个简单的 Linux 命令行工具,用于自动管理和控制网络接口的上行和下行带宽,旨在为用户提供稳定的网络体验,尤其是在网络拥塞的情况下。它通过 Traffic Control (tc) 工具集实现这一功能,但与直接使用 tc 相比,Wondersbaper 提供了更简洁易用的界面,特别适合没有深入网络管理知识的用户,但它其实就是由一个bash脚本组成,当然里面的思想非常精华。

当初我也是头痛不已,最终发现wondershaper居然可以限制下载速度,且用的居然也是tc!让我颇为震惊,但是苦于wondershaper并不支持限速特定的Ip,所以迫不得已只能去解析他的源码。

Wondershaper 的核心特点包括:

  1. 简单配置:用户只需要指定接口名称、上行速度和下行速度即可启动带宽整形,无需了解复杂的 tc 命令和配置。

  2. 保证交互性:它优先保证网络的交互性,比如网页浏览和SSH连接等,即使在大量下载或上传时也能保持良好的响应性。这是通过为交互式流量预留一部分带宽实现的。

  3. 易于安装和使用:Wondershaper 在许多Linux发行版的包管理器中都有,安装后只需几条命令就能开始工作。

  4. 透明运作:一旦设置好,Wondershaper 会在后台自动管理带宽,用户无需干预。

技术原理简述:

Wondershaper 主要通过以下方式工作:

  • HTB (Hierarchical Token Bucket):使用htb调度器为网络接口创建一个分层的令牌桶队列,实现带宽限制和优先级划分。
  • SFQ (Stochastic Fairness Queueing):在某些配置中,它可能还会使用SFQ(随机公平队列)来为不同流提供公平的带宽分配,确保网络交互性。
  • 预留带宽:为保证交互性,Wondershaper会为“交互”流量预留一部分带宽,这部分流量通常优先于其他流量传输,确保即使在带宽紧张时,用户界面操作也能快速响应。

对于tc来讲,正常我们限速网络的流程应该是创建根队列规则,创建分类,创建过滤器,匹配分类,完成限制。当然传统上tc的通病我相信用的朋友们也知道那就是限制发包但是不限制收包。这对我们去限制下载速度就很头疼了,就相当于我只管我自己发出去的,不管向自己发来过的包。

源码分析:

USPEED="88920"; 限制速率
IFB="ifb0"; 虚拟网卡名
infr="ens33" 真实网卡名
IP="77.77.77.100" 要限制的ipif [[ -n "$DSPEED" ]]; then# 创建虚拟网卡并启用modprobe ifb numifbs=1;ip link set dev "$IFB" up;tc qdisc add dev "$intf" handle ffff: ingresstc filter add dev "$intf" parent ffff: protocol ip u32 match u32 0 0 \action mirred egress redirect dev "$IFB";tc qdisc add dev "$IFB" root handle 2: htb;tc class add dev "$IFB" parent 2: classid 2:1 htb rate "${DSPEED}kbit";tc filter add dev "$IFB" protocol ip parent 2: prio 1 u32 \match ip src "$IP" flowid 2:1;
fi;

流程图:

代码流程:

  1. 开始: 检查变量 DSPEED 是否设置。
  2. 检查 DSPEED: 如果设置了 DSPEED,则创建并启用虚拟网卡。
  3. 创建并启用虚拟网卡:(精华所在)
    • 加载 ifb 模块。
    • 启用虚拟网卡 IFB
  4. 添加入口队列规则: 在真实网卡 intf 上添加入口队列规则。
  5. 添加过滤器: 在真实网卡 intf 上添加过滤器,将流量重定向到虚拟网卡 IFB
  6. 添加根队列规则: 在虚拟网卡 IFB 上添加根队列规则。
  7. 添加类: 在虚拟网卡 IFB 上添加类,设置速率为 DSPEED
  8. 在 IFB 上添加过滤器: 最后在虚拟网卡 IFB 上添加过滤器。

虚拟网卡:

  • modprobe 是一个用于动态加载内核模块的命令。
  • ifb 是要加载的内核模块名称,代表Intermediate Functional Block。
  • numifbs=1 是向 modprobe 传递的参数,指定了要创建的 IFB 设备的数量,在这个例子中创建了1个IFB设备。

IFB 虚拟网卡通常不直接用于终端通信,而是作为网络数据包的一个中转站,使得管理员可以在这里应用服务质量(QoS)策略,比如限制或优先处理特定类型的网络流量,而不会干扰主网络接口的数据转发流程。这对于实现网络流量整形、带宽限制或者优化网络应用的体验非常有帮助。

上方就是wondershaper最核心的限制Ip的网络下载速度的精华。

这篇关于Wondershaper网络限制脚本源码分析一(下载速度限制篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/994796

相关文章

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm