基于 tc 指令的网速限制工具
前言
最近有一个需求,需要限制网卡速度进行一些测试。在朋友推荐下阅读了这篇文章 TC简单粗暴限制网速。
经过尝试,简单有效,整理成脚本放在正文,留作参考。
正文
指令解析(chatgpt 分析)
您提供的命令序列是用于在Linux系统中使用tc(traffic control)工具对网络流量进行管理和控制的示例。下面是每个命令的作用和一些解释:modprobe ifb numifbs=1- 加载
ifb(Intermediate Functional Block)模块,创建一个新的ifb设备实例。numifbs=1参数表示创建一个虚拟的网络接口,用于流量控制。
- 加载
ip link set dev ifb0 up- 激活(启用)名为
ifb0的网络接口。
- 激活(启用)名为
tc qdisc add dev ens18 handle ffff: ingress- 在网络接口
ens18上添加一个ingress队列规则,处理进入的流量。
- 在网络接口
tc filter add dev ens18 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0- 在
ens18接口上添加一个过滤器,匹配所有进入的IPv4流量并将其镜像(重定向)到ifb0设备。
- 在
tc qdisc add dev ifb0 root handle 1: htb default 10- 在
ifb0上添加一个根队列规则,使用HTB(Hierarchical Token Bucket)算法来管理和限制流量。
- 在
tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 1Mbps- 添加一个限制类,将
ifb0的流量限制到1Mbps。
- 添加一个限制类,将
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 1Mbps- 在前面创建的类
1:1下添加一个子类1:10,限制率同样是1Mbps。
- 在前面创建的类
以下是修改类的命令,用于变更流量限制:
tc class change dev ifb0 parent 1:0 classid 1:1 htb rate 2Mbps- 将类
1:1的速率改为2Mbps。注意这里最后的单位使用的是大写的B,代表Bytes,这可能是个错误,因为通常限制速率使用的是小写的b,代表bits。
- 将类
tc class change dev ifb0 parent 1:1 classid 1:10 htb rate 2Mbps- 将子类
1:10的速率改为2Mbps。同样的单位问题。
- 将子类
tc class change dev ifb0 parent 1:0 classid 1:1 htb rate 20Mbit- 将类
1:1的速率改为20Mbps。
- 将类
tc class change dev ifb0 parent 1:1 classid 1:10 htb rate 20Mbit- 将子类
1:10的速率改为20Mbps。
- 将子类
tc class show dev ifb0- 显示
ifb0接口上的类信息。
- 显示
最后,以下命令用于清理前面创建的队列规则:
tc qdisc del dev ens18 ingress- 删除
eth0接口上的ingress队列规则。
- 删除
tc qdisc del dev ifb0 root- 删除
ifb0接口上的根队列规则。
- 删除
modprobe -r ifb- 卸载
ifb模块。
- 卸载
请注意,使用tc进行流量控制时,确保你使用正确的流量单位非常重要。通常流量速率以bit为单位(即Mbit或Mbps),而不是Byte(即MBps)。这里的速率控制指令中的"B"应该是小写的"b",除非实际环境有特别规定使用了Bytes作为单位。
脚本:limit_net_speed.sh, 这个脚本实现了简单增删改查,但细节方面还需要打磨,还有一定局限性。
#!/bin/bash
action=$1
network_card=$2
limit=$3
function Usage()
{
echo -e "${0} [action] [network_card] [speed_limit]"
echo -e "------"
echo -e "action: show/add/change/delete"
echo -e "network_card: you network card name"
echo -e "speed_limit: network speed limit num (Mbps), only number, default 100"
echo -e "------"
exit 0
}
function show_network_cards()
{
echo -e "------ NETWORK ------\n"
echo -e "NAME IPADDRESS"
ip -o -4 addr show | awk '{print $2, $4}' | column -t
echo -e "---------------------\n"
}
function show_ip_ifb_info()
{
echo -e "------ IP IFPS ------\n"
ip link show type ifb
echo -e "---------------------\n"
}
function show_tc_info()
{
echo -e "------ TC INFO ------"
echo -e "\n- qdisc show -\n"
tc qdisc show
echo -e "\n- class show -\n"
tc class show dev ifb0
echo -e "---------------------\n"
}
if [[ ${action} == "show" ]];then
echo -e "start show all info"
show_network_cards
show_ip_ifb_info
show_tc_info
elif [[ ${action} == "add" ]];then
echo -e "start add"
if [[ ${network_card} == "" ]];then
echo -e "Error: network_card is None, select one from below:"
show_network_cards
Usage
fi
ip -o -4 addr show | grep -qw "${network_card}"
if [[ $? == 1 ]];then
echo "Error:${network_card} not in below:"
show_network_cards
Usage
fi
has_ip_ifp=`ip link show type ifb`
if [[ ${has_ip_ifp} != "" ]];then
echo -e "ifp has exists:"
echo ${has_ip_ifp}
Usage
fi
modprobe ifb numifbs=1
ip link set dev ifb0 up
tc qdisc add dev ${network_card} handle ffff: ingress
tc filter add dev ${network_card} parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
tc qdisc add dev ifb0 root handle 1: htb default 10
limit_speed=100
if [[ ${limit} != "" ]];then
limit_speed=${limit}
fi
echo -e "add ${network_card} limit:${limit_speed}Mbps"
tc class add dev ifb0 parent 1:0 classid 1:1 htb rate ${limit_speed}Mbit
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate ${limit_speed}Mbit
show_ip_ifb_info
show_tc_info
echo "finished"
elif [[ ${action} == "change" ]];then
echo -e "start change"
if [[ ${network_card} == "" ]];then
echo -e "Error: network_card is None, select one from below:"
show_network_cards
Usage
fi
ip -o -4 addr show | grep -qw "${network_card}"
if [[ $? == 1 ]];then
echo "Error:${network_card} not in below:"
show_network_cards
Usage
fi
has_ip_ifp=`ip link show type ifb`
if [[ ${has_ip_ifp} == "" ]];then
echo -e "ifp not exists:"
Usage
fi
if [[ ${limit} == "" ]];then
echo -e "Error: limit is None"
Usage
fi
echo -e "change ${network_card} speed:${limit}Mbps"
tc class change dev ifb0 parent 1:0 classid 1:1 htb rate ${limit}Mbit
tc class change dev ifb0 parent 1:1 classid 1:10 htb rate ${limit}Mbit
show_ip_ifb_info
show_tc_info
echo "finished"
elif [[ ${action} == "delete" ]];then
echo -e "start delete"
if [[ ${network_card} == "" ]];then
echo -e "Error: network_card is None, select one from below:"
show_network_cards
Usage
fi
ip -o -4 addr show | grep -qw "${network_card}"
if [[ $? == 1 ]];then
echo "Error:${network_card} not in below:"
show_network_cards
Usage
fi
has_ip_ifp=`ip link show type ifb`
if [[ ${has_ip_ifp} == "" ]];then
echo -e "ifp not exists:"
Usage
fi
echo "delete ${network_card} speed limit"
tc qdisc del dev ${network_card} ingress
tc qdisc del dev ifb0 root
modprobe -r ifb
show_ip_ifb_info
show_tc_info
echo "finished"
else
echo -e "Error:action: ${action} not supported"
show_network_cards
Usage
fi
参考
[1]. TC简单粗暴限制网速
[2]. chatgpt
基于 tc 指令的网速限制工具的更多相关文章
- Android中获取实时网速(2)
一.实现思路: 1.Android提供有获取当前总流量的方法 2.上一秒 减去 下一面的流量差便是网速 3.注意计算 二.计算网速的工具类: package imcs.cb.com.viewappli ...
- 网速测试利器-iperf3
网速测试利器-iperf3 使用工具 简介 iperf3是一个网络速度测试工具,支持IPv4与IPv6,支持TCP.UDP.SCTP传输协议,可在Windows.Mac OS X.Linux.Fr ...
- 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目
自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...
- linux环境下,利用tc限制两台服务器间的网速,非常简单。
最近再搞postgres的数据同步,需要模拟异地机房有带宽限制时的同步效果,所以想要限制一下两台机器之间的网速. ts命令功能很强,同时也好难理解和使用,经常浪费了好半天还是搞不定. 这里分享一个简单 ...
- iOS 仿看了吗应用、指南针测网速等常用工具、自定义弹出视图框架、图片裁剪、内容扩展等源码
iOS精选源码 扩展内容的cell - folding-cell 一个近乎完整的可识别中国身份证信息的Demo 可自动快速... JPImageresizerView 仿微信的图片裁剪 带年月和至今以 ...
- Python安装第三方包(模块/工具)出现链接超时,网速慢,安装不上的问题如何解决
之前我的电脑重新装了系统以后,发现安装完Python后, 使用pip linstall 安装第三方包的时候,网速慢的一匹 有时候只有几百b/s ,而且还动不动就会出现无法安装,链接超时等问题. 今天我 ...
- linux上限值网速、限值带宽
Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制. Linux流量控制的基本原理如下图所示. 接收包 ...
- 提升网速的路由器优化方法(UPnP、QoS、MTU、交换机模式、无线中继)
在上一篇<为什么房间的 Wi-Fi 信号这么差>中,猫哥从微波炉.相对论.人存原理出发,介绍了影响 Wi-Fi 信号强弱的几大因素,接下来猫哥再给大家介绍几种不用升级带宽套餐也能提升网速的 ...
- [转]使用Linux命令行测试网速
装speedtest-cli speedtest-cli是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.4版本下均可运行.它基于Speedtest.net的基础架构来测 ...
- 使用Linux命令行测试网速
安装speedtest speedtest是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.4版本下均可运行.它基于Speedtest.net的基础架构来测量网络的上/下 ...
随机推荐
- vim简明文档
替换 替换当前行第一个 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky 从当前行替换到最后一行 :%s/vivian/sky/g 替换所有行中 vivian 为 sky 查找 ...
- WebKit Inside: CSS 样式表的解析
CSS 全称为层叠样式表(Cascading Style Sheet),用来定义 HTML 文件最终显示的外观. 为了理解 CSS 的加载与解析,需要对 CSS 样式表的组成,尤其是 CSS Sele ...
- 1.简单的C语言程序
简单的C语言程序 什么是计算机程序? 什么是计算机语言? 所谓程序,就是一组计算机能识别和执行的指令. 什么是计算机语言? 机器语言(0,1 '低级语言'),汇编语言(符号化 '低级语言'),高级语言 ...
- SQLServer统计监控SQL执行计划突变的方法
使用动态管理视图(DMVs)来检测SQL执行计划的突变,你需要关注那些能够提供查询执行统计和计划信息的视图.以下是一些可以用于此目的的DMVs以及相应的查询示例: sys.dm_exec_query_ ...
- 密码学—Kasiski测试法Python程序
Kasiski Kasiski是辅助破解Vigenere的前提工作,Kasiski是猜测加密者使用Vigenere密码体系的密钥的长度,Kasiski只是猜测长度而已,所以说是辅助破解Vigenere ...
- angular路由跳转并传值的多种方式
Angular的学习使用过程中,路由跳转支撑了项目的全过程,所以路由跳转是一个很常见也是一个很容易忽略的点,,对于页面之间的跳转有着很多的问题,跳转的方式/如何携带参数跳转,下面是自己在学习过程中对a ...
- 【漏洞复现】CVE-2023-27372 RCE漏洞
产品介绍 SPIP是一个互联网发布系统,其中非常重视协作工作,多语言环境和Web作者的易用性.它是自由软件,在GNU/GPL许可证下分发.这意味着它可以用于任何互联网站点,无论是个人的还是机构的,非营 ...
- PHP 中使用 ElasticSearch 的最佳实践 (下)
引言 上一篇文章,我们使用同步的方式将数据,同步写入到 ElasticSearch 中.接下来的这篇文章,主要介绍使用 RabbitMQ 的方式,异步的将数据同步到 ElasticSearch . 部 ...
- C# fastreport 实现各个报表指定各自的默认打印机
1.业务需求 工作室有多个报表需要打印,如果在报表模板里设置默认打印机的话,每个人电脑上安装的打印机是不相同的,所以就需要设定各自的默认打印机实现打印功能. 2.xml模板设计(PrinterSett ...
- 开源一站式敏捷测试管理,极简项目管理平台 itest(爱测试) 6.6.2 发布,便捷迫切功能增强
(一)itest 简介及更新说明 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行 ...