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" 要限制的ip

if [[ -n "$DSPEED" ]]; then
            # 创建虚拟网卡并启用
            modprobe ifb numifbs=1;
            ip link set dev "$IFB" up;

            tc qdisc add dev "$intf" handle ffff: ingress
            tc 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的网络下载速度的精华。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/633558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python基础之开发工具配置

day01-Python基础 一、Python介绍 Python是一个计算编程语言,可以实现计算程序开发,也可以用于数据处理。SQL语言只能用于结构化数据的处理。Python的比SQL应用更广泛。 1990年推广Python,最初是应用于运维开发,随着不断更新迭代…

xxe漏洞--xml外部实体注入漏洞

1.xxe漏洞介绍 XXE(XML External Entity Injection)是一种攻击技术,它允许攻击者注入恶意的外部实体到XML文档中。如果应用程序处理XML输入时未正确配置,攻击者可以利用这个漏洞访问受影响系统上的敏感文件、执行远程代码、探测内…

PLC工程师按这个等级划分是否靠谱?

在工业自动化领域,PLC工程师扮演着至关重要的角色,他们负责构建、维护自动化系统,推动工业4.0进程的发展。成为一名优秀的PLC工程师需要经历不同境界的发展阶段,每个阶段都对应着不同的技能要求和责任。以下是PLC工程师的六种级别…

ffmpeg中AVCodec是否需要手动销毁?

在开发到退出一个视频播放功能时,看到对AVCodec*这个指针做了初始化,但是突然有一个好奇的疑问,这个AVCodec到底是否需要人工手动销毁? 我在初始化的时候这样用的: const AVCodec *v_codec NULL; AVCodecContext *v…

从零到一建设数据中台 - 应用场景及实施路径

从零到一建设数据中台 - 应用场景及实施路径 一、数据中台技术场景 异构数据源集成、交换场景:实现异构数据源的整合集中和交换共享数据治理场景:从元数据角度实现企业级数据目录管理、保证数据质量、数据安全,提供数据血缘、数据服务数仓、…

记录centos中操作(查找、结束、批量)进程以及crontab定时写法的知识

环境:vps,centos7,python3。 近期写了个python程序,用青龙面板在centos上运行。程序中有while无限循环,但是我在青龙中设置了定时任务(每隔半小时运行一次),于是造成了进程中有多个…

宁波财经学院第十三周李倩教学检查第一节课

好奇和满足好奇心的 0.简单的介绍额 1.李倩提到了如何导入jar包,这应该如何去导入呢? 2.波哥防区只获取了一个request的字段 获得文件内容和保存文件

[IMX6ULL驱动开发]-Linux对中断的处理(一)

目录 中断概念的引入 ARM架构中断的流程 异常向量表 Linux系统对中断的处理 ARM对程序和中断的处理 Linux进程中断处理 中断概念的引入 如何理解中断,我们可以进行如下抽象。把CPU看做一个母亲,当它正在执行任务的时候,可以看为是一个母…

运维出现的问题 --集成

运维出现的问题 集成 macos 本地打的镜像,推到线上出现 images platform (linux/arm64) does not match the detected解决办法 macos 本地打的镜像,推到线上出现 image’s platform (linux/arm64) does not match the detected WARNING: The requested …

Nacos 进阶篇---Nacos服务端怎么维护不健康的微服务实例 ?(七)

一、引言 在 Nacos 后台管理服务列表中,我们可以看到微服务列表,其中有一栏叫“健康实例数” (如下图),表示对应的客户端实例信息是否可用状态。 那Nacos服务端是怎么感知客户端的状态是否可用呢 ? 本章…

Go-zero(api部分)

目录 api的语法: type:用于定义请求/响应体 service:定义HTTP服务 server:控制生成HTTP服务时候的meta信息 根据api文档生成最小HTTP服务 目录结构 api响应封装 api的语法: 首先定义一个api文档 type&#xff…

nginx+nginx-http-flv-module在Linux服务器搭建

需求 在服务器搭建点播/视频平台的话需要在服务器搭建nginx和rtmp模块 rtmp模块 rtmp 模块有 nginx-rtmp-module ,但是我们这里使用 nginx-http-flv-module 来替代。因为后者是基于前者开发的,前者拥有的功能后者都有,后者是国内的开发开…

资源回收:从冷门到热门,未来的智慧与潜力不可小觑|中联环保圈

近年来,资源回收成为了越来越热门的话题。今年的工作报告中明确提出,2024 年要大力推动废弃物循环利用。这意味着资源回收领域将迎来更多商机,逐渐成为环保产业中的重要一员。 回首过去,十年前的资源回收业务相对简单,…

中国医学健康管理数字化发展风向标——专家共话未来趋势

随着科技的飞速发展,数字化已经成为中国医学健康管理领域的重要发展方向。 2024年5月20日由中国管理科学研究院智联网研究所、中国民族医药协会医养教育委员会、国家卫健委基层健康服务站、中国老龄事业发展基金会、中国智联网健康管理系统平台、中国医学健康管理数…

自动化测试--利用pytest实现整条业务链路测试

​ 概述 前面一章讲解了单个接口的测试,但是实际项目中,因为权限和登录状态的限制,大部分接口没办法直接访问到,这时候我们想访问到一个系统的接口,就需要模拟用户登录拿到用户的token和所拥有的权限之后再将这些信息…

微软AI版的语音自动操作助手来了;免费部署私人 Gemini 应用的开源项目TalkWithGemini;开源自动化测试Cover-Agent

✨ 1: Microsoft Power Automate Microsoft Power Automate利用自动化和AI来革新工作方式,提高生产力。 微软发布了新版 Power Automate,带来了全新的AI驱动自动化体验。 用户只需通过屏幕分享和语音描述操作步骤,AI便能自动学习并生成工作…

FreeRTOS_事件组_学习笔记

事件组 原文链接 事件组是一个整数,其中的高8位留给内核,只能用其他位来表示时间 每一位代表一个事件,且每个时间的含义由程序员决定 1为发生,0为未发生 一个/多个任务或ISR都能读写这些位 可以等待某一位,也可以等待…

网络的基础理解

文章目录 网络的基础认识 网络协议协议分层OSI七层模型TCP/IP 五层/四层 模型 网络的基础认识 先来看下面几个问题 什么是网络? 网络就是有许多台设备包括计算机单不仅限于计算机,这些设备通过相互通信所组成起来系统,我们称之为网络所以如…

CAD2023 2024 2025以上版本出现无法运行 AutoCAD,原因可能如下1) 此版本的 AutoCAD 安装不正确

错误提示如下 此版本的 AutoCAD 安装不正确 缺少依赖组件Microsoft Edge webview2 Runtime 缺少依赖组件 Microsoft.NET跟You must install .NET Desktop Runtime 打开autoremove,点击扩展,输入 无法运行,点击搜索 你的软件属于什么版本…