Linux tc 使用
tc模拟延时丢包等网络故障依赖的内核驱动
/lib/modules/5.15.0-52-generic/kernel/net/sched/sch_netem.ko
有些系统并不是默认就安装上该驱动的,如果没有安装该驱动,构造网络故障时会报错。
root@:curtis# tc qdisc change dev enp4s0 root netem delay 10ms reorder 25% 50%
Error: Qdisc not found. To create specify NLM_F_CREATE flag.
安装驱动
insmod /lib/modules/5.15.0-52-generic/kernel/net/sched/sch_netem.ko
可是为什么安装好内核驱动之后还是会报错??
curtis@:linux$ sudo tc qdisc change dev enp4s0 root netem delay 10ms reorder 25% 50%
Error: Qdisc not found. To create specify NLM_F_CREATE flag.
内核驱动源码路径
./net/sched/sch_netem.c
尝试自己编译下这个内核驱动? - - 自己编译了之后,发现是同样的情况??
root@:sch_netem# tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc fq_codel 0: dev enp4s0 root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
qdisc noqueue 0: dev wlp5s0 root refcnt 2
qdisc noqueue 0: dev docker0 root refcnt 2
qdisc noqueue 0: dev vethf5e645e root refcnt 2
尝试用其他命令尝试注入网络时延故障 - - 发现做网络延时是没有问题的,这就有理由怀疑是命令格式问题?
root@:sch_netem# tc qdisc add dev enp4s0 root netem delay 15ms
root@:sch_netem# tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc netem 8002: dev enp4s0 root refcnt 2 limit 1000 delay 15.0ms
qdisc noqueue 0: dev wlp5s0 root refcnt 2
qdisc noqueue 0: dev docker0 root refcnt 2
qdisc noqueue 0: dev vethf5e645e root refcnt 2
最后还是自己去翻了以下man手册,最终找到了答案,change是用来修改某个网卡网络规则的(无脑拷贝他人命令的结果),add是给某个网口添加规则,没有添加相关规则,肯定就不能修改。
tc-netem man 手册
root@:sch_netem# tc qdisc add dev enp4s0 root netem delay 10ms reorder 25% 50%
root@:sch_netem# tc qdisc
qdisc noqueue 0: dev lo root refcnt 2
qdisc netem 8004: dev enp4s0 root refcnt 2 limit 1000 delay 10.0ms reorder 25% 50% gap 1
qdisc noqueue 0: dev wlp5s0 root refcnt 2
qdisc noqueue 0: dev docker0 root refcnt 2
qdisc noqueue 0: dev vethf5e645e root refcnt 2
root@:sch_netem#
root@:sch_netem# tc qdisc change dev enp4s0 root netem delay 10ms reorder 50% 50%
root@:sch_netem# tc qdisc
qdisc noqueue 0: dev lo root refcnt 2
qdisc netem 8004: dev enp4s0 root refcnt 2 limit 1000 delay 10.0ms reorder 50% 50% gap 1
qdisc noqueue 0: dev wlp5s0 root refcnt 2
qdisc noqueue 0: dev docker0 root refcnt 2
qdisc noqueue 0: dev vethf5e645e root refcnt 2
使用wireshark抓包,ping是icmp类型的报文。

tc 使用示例
查看所有已经设定的规则
root@rlk:/home# tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc netem 8001: dev ens33 root refcnt 2 limit 1000 delay 100.0ms
qdisc noqueue 0: dev docker0 root refcnt 2
延时
# tc qdisc add dev eth0 root netem delay 100msAdd fixed amount of delay to all packets going out on deviceeth0(为设备eth0上传出的所有数据包添加固定的延迟量). Each packet will have added delay of 100ms ± 10ms. - - tc延时也非准确?# tc qdisc change dev eth0 root netem delay 100ms 10ms100ms±10ms延时时间随机变化。# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%This causes the added delay of 100ms ± 10ms and the nextpacket delay value will be biased by 25% on the most recentdelay. This isn't a true statistical correlation, but anapproximation.uniform variation with correlation value -- 具有相关值的均匀变化。使振幅根据uniform variation with correlation value发生变化。这会导致增加 100ms ± 10ms 的延迟,并且下一个数据包延迟值将比最近的延迟偏差25%。这不是真正的统计相关性,而是近似值。从测试的情况来看,10ms为offset,ping实际延迟时间为90~110之间。如果将比例设置为100%,则ping实际延迟时间为108,这个百分比比较晦涩?# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normalThis delays packets according to a normal distribution (Bellcurve) over a range of 100ms ± 20ms.
验证方法,ping目标主机。
PS C:\Users\94805> ping -t 192.168.0.130正在 Ping 192.168.0.130 具有 32 字节的数据:
来自 192.168.0.130 的回复: 字节=32 时间=100ms TTL=64
来自 192.168.0.130 的回复: 字节=32 时间=101ms TTL=64
来自 192.168.0.130 的回复: 字节=32 时间=100ms TTL=64
来自 192.168.0.130 的回复: 字节=32 时间=101ms TTL=64192.168.0.130 的 Ping 统计信息:数据包: 已发送 = 9,已接收 = 9,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):最短 = 100ms,最长 = 202ms,平均 = 112ms
丢包
# tc qdisc change dev eth0 root netem loss 0.1%This causes 1/10th of a percent (i.e 1 out of 1000) packetsto be randomly dropped.An optional correlation may also be added. This causes therandom number generator to be less random and can be used toemulate packet burst losses.
重复包
# tc qdisc change dev eth0 root netem duplicate 1%This causes one percent of the packets sent on eth0 to beduplicated.
# tc qdisc change dev eth0 root netem loss 0.3% 25%This will cause 0.3% of packets to be lost, and eachsuccessive probability depends is biased by 25% of theprevious one.There are two different ways to specify reordering. The gapmethod uses a fixed sequence and reorders every Nth packet.# tc qdisc change dev eth0 root netem gap 5 delay 10msThis causes every 5th (10th, 15th, …) packet to go to be sentimmediately and every other packet to be delayed by 10ms.This is predictable and useful for base protocol testing likereassembly.The reorder form uses a percentage of the packets to getmisordered.# tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%In this example, 25% of packets (with a correlation of 50%) willget sent immediately, others will be delayed by 10ms.Packets will also get reordered if jitter is large enough.# tc qdisc change dev eth0 root netem delay 100ms 75msIf the first packet gets a random delay of 100ms (100ms base- 0ms jitter) and the second packet is sent 1ms later andgets a delay of 50ms (100ms base - 50ms jitter); the secondpacket will be sent first. This is because the queuediscipline tfifo inside netem, keeps packets in order by timeto send.If you don't want this behavior then replace the internal queuediscipline tfifo with a simple FIFO queue discipline.# tc qdisc add dev eth0 root handle 1: netem delay 10ms 100ms# tc qdisc add dev eth0 parent 1:1 pfifo limit 1000Example of using rate control and cells size.# tc qdisc add dev eth0 root netem rate 5kbit 20 100 5Delay all outgoing packets on device eth0 with a rate of5kbit, a per packet overhead of 20 byte, a cellsize of 100byte and a per celloverhead of 5 bytes.
高级用法
It is possible to selectively(有选择的) apply impairment(损伤) using traffic
classification.
# tc qdisc add dev eth0 root handle 1: prio
# tc qdisc add dev eth0 parent 1:3 handle 30: tbf rate 20kbit buffer 1600 limit 3000
# tc qdisc add dev eth0 parent 30:1 handle 31: netem delay 200ms 10ms distribution normal
# tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match ip dst 65.172.181.4/32 flowid 1:3This eample uses a priority(优先级) queueing discipline(规则); a TBF isadded to do rate control; and a simple netem delay. A filterclassifies all packets going to 65.172.181.4 as beingpriority 3.
从上述命令来看,可以根据实际使用需求设定包过滤器。
tc qdisc add dev $(net) root handle 1:0 prio bands 4
tc qdisc add dev $(net) parent 1:4 handle 40: netem delay "$dvalue"
tc filter add dev $(net) protocol ip parent 1:0 prio 4 u32 match ip dst $(ip) match ip dport $(port) 0xffff flowid 1:4
根root qdisc的handle为默认为1:0,因为root qdisc为 classless pfifo_fast qdisc。
pfifo_fast 有三个所谓的 “band”(可理解为三个队列),编号分别为 0、1、2:(默认是三个,在指定bands个数最少为3)
否则报错如下所示:
root@:~# tc qdisc add dev ens19 root handle 1: prio bands 1
RTNETLINK answers: Invalid argument
root@:~# tc qdisc add dev ens19 root handle 1: prio bands 2
RTNETLINK answers: Invalid argument
疑问:可以根据需求自定义添加pfifo_fast qdisc的band? - - 从实现结果来看确实可以按需配置。
每个 band 上分别执行 FIFO 规则。
如果 band 0 有数据,就不会处理 band 1;同理,band 1 有数据时,不会去处理 band 2。
内核会检查数据包的 TOS 字段,将“最小延迟”的包放到 band 0。
tc qdisc add dev $(net) root handle 1:0 prio bands 4
- handle 队列规则句柄,可以理解为网络流量流经的路径上的一个标识,默认
1:0为根节点,也可以自定义 ,比如说为10:0。 - root handle 1:0 表示创建一个根队列,并将其标识为1:0。
- prio 表示使用优先级调度算法,如果不指定具体的值,如
tc qdisc del dev ens19 root handle 1:0 prio,则默认prio的值为1,如果不指定该参数,如tc qdisc del dev ens19 root handle 1:0不指定prio将会报错,Error: Specified qdisc kind is unknown.。 - bands 4 表示创建4个子队列,如果不指定该值
root handle默认为3个bands。
树形结构
1: root qdisc/ | \/ | \/ | \1:1 1:2 1:3 classes| | |10: 20: 30: qdiscs qdiscssfq tbf sfq
band 0 1 2
tc qdisc add dev $(net) parent 1:4 handle 40: netem delay "$dvalue"
- handle 40 指定
qdisc子class句柄为40:0,这个值也是可以根据需求去指定的。 - netem 参数可以理解为指定包的排队规则,还有其他排队规则,如
pfifo_fast TBF SFQ FQ,Netem是Linux 2.6及以上内核版本提供的一个网络模拟功能模块,这就是为什么需要单独加载sch_netem内核模块的原因,该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,注入低带宽,传输延迟,丢包等故障。
tc filter add dev $(net) protocol ip parent 1:0 prio 4 u32 match ip dst $(ip) match ip dport $(port) 0xffff flowid 1:4
- protocol ip 匹配 ip protocol,也可以使用
/etc/protocols里面的协议号。 - u32 一种匹配规则,特点是能匹配包的任何部分。
- match ip dst $(ip) match ip dport $(port) 0xffff 目的
dst_ip/port的所有ip协议的所有包。u32 match ip sport 80 0xffff``IP头中的源端口号是一个16位的字段,范围从0到65535。使用0xffff作为掩码意味着我们希望匹配所有的源端口号,因为0xffff的二进制表示为16个1,它与任何16位的源端口号进行逻辑与操作时都会匹配,所以上述命令已经制定了dst_ip/dport是不是不需要指定0xffff?,实际使用如果要匹配端口,不接0xffff会报错Illegal "match",也就是必须输入的参数。 - flowid 1:4 将特定的流量流向标识为1:4的子队列,以便对该流量应用特定的规则和限制。
查看某个interface的filter 规则。
tc filter show dev ens18
查看某个interface的class。
tc class show dev ens18
仅仅匹配sport是生效的,ssh到目标主机有明显的延迟。
tc filter add dev ens18 protocol ip parent 1:0 prio 4 u32 match ip sport 22 0xffff flowid 1:4
为什么match规则为source ip存在问题???,将src替换为dst是生效的???
tc filter add dev ens18 protocol ip parent 1:0 prio 4 u32 match ip src 192.168.0.207 flowid 1:4
- 指定本地网卡,只匹配
srcip地址是不生效 - 指定本地网卡,只匹配
src port是生效 - 匹配
src ip + src port不生效 - 只匹配
dst ip地址生效 - 只匹配
dst port生效 - 匹配
dst ip + dst port生效
原因分析:
子网掩码255.255.255.0 - - 24
子网掩码255.255.240.0 - - 20
在指定本地网卡为src ip时,需要指定子网掩码,指定子网掩码之后,延迟效果是存在的,默认的子网掩码为255.255.255.0,可以通过ifconfig或者ip addr show来查看网卡配置的子网掩码。
特别注意:
设定规则之后,如果对应网卡被移除,对应的规则也将会丢失。
相关文章:
Linux tc 使用
tc模拟延时丢包等网络故障依赖的内核驱动 /lib/modules/5.15.0-52-generic/kernel/net/sched/sch_netem.ko有些系统并不是默认就安装上该驱动的,如果没有安装该驱动,构造网络故障时会报错。 root:curtis# tc qdisc change dev enp4s0 root netem delay…...
从0开始学习JavaScript--JavaScript 数字与日期
JavaScript中的数字和日期是处理数值计算和时间相关任务的核心。本文将深入研究JavaScript中数字的表示、常见运算,以及日期对象的创建、格式化等操作,并通过丰富的示例代码,可以更全面地了解和应用这些概念。 JavaScript数字基础 JavaScri…...
从关键新闻和最新技术看AI行业发展(2023.11.6-11.19第十期) |【WeThinkIn老实人报】
Rocky Ding 公众号:WeThinkIn 写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术,同时Rocky会对这些关键信息进行解读,力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议,一起交流学习&…...
计算机硬件的基本组成
一、冯诺依曼结构 存储程序: “存储程序”的概念是指将指令以二进制代码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。 冯诺依曼计…...
【算法-哈希表3】四数相加2 和 赎金信
今天,带来哈希表相关算法的讲解。文中不足错漏之处望请斧正! 理论基础点这里 1. 四数相加2 分析题意 求符合条件的四元组的出现次数,条件: nums1nums2nums3nums4 从四个数组中的每一个数组取一个数 num1, num2, num3, num4&am…...
wpf devexpress自定义编辑器
打开前一个例子 步骤1-自定义FirstName和LastName编辑器字段 如果运行程序,会通知编辑器是空。对于例子,这两个未命名编辑器在第一个LayoutItem(Name)。和最终用户有一个访客左右编辑器查阅到First Name和Last Name字段,分别。如果你看到Go…...
文档向量化工具(一):Apache Tika介绍
Apache Tika是什么?能干什么? Apache Tika是一个内容分析工具包。 该工具包可以从一千多种不同的文件类型(如PPT、XLS和PDF)中检测并提取元数据和文本。 所有这些文件类型都可以通过同一个接口进行解析,这使得Tika在…...
学习c#的第二十一天
目录 C# 泛型(Generic) 泛型类型参数 类型参数的约束 约束多个参数 未绑定的类型参数 类型参数作为约束 notnull 约束 class 约束 default 约束 非托管约束 委托约束 枚举约束 类型参数实现声明的接口 泛型类 泛型方法 泛型和数组 泛型…...
Michael Jordan最新报告:去中心化机器学习中的契约、不确定性和激励
导读 11月3日,智源研究院学术顾问委员会委员、机器学习泰斗Michael Jordan在以“新一代人工智能前沿”为主题的2023北京论坛 新工科专题论坛上,发表了题为Contracts, Uncertainty, and Incentives in Decentralized Machine Learning(去…...
3ds Max渲染用专业显卡还是游戏显卡?
使用3dsmax建模时,会面临诸多选择,除了用vr还是cr的决策,硬件选择上也存在着疑问,比如用专业显卡还是消费级游戏显卡?一般来说,除非是特别专业的大型项目和软件,且预算在5位数以上,常…...
airlearning-ue4安装的踩坑记录
最近要安装airlearning-ue4,用于实现无人机仿真环境,该项目地址为:GitHub - harvard-edge/airlearning-ue4: Environment Generator for Air Learning Project. This version is build on top of UE4 game engine 由于这个项目已经完成好几年…...
uniapp优化h5项目-摇树优化,gzip压缩和删除console.log
1.摇树优化 勾选摇树优化,打包删除死代码 2.gzip压缩和删除console.log 安装插件webpack和compression-webpack-plugin webpack插件 npm install webpack4.46.0 --save-devcompression-webpack-plugin插件 npm install compression-webpack-plugin6.1.1 --save-devconst Com…...
Pycharm之配置python虚拟环境
最近给身边的人写了脚本,在自己电脑可以正常运行。分享给我身边的人,却运行不起来,然后把报错的截图给我看了,所以难道不会利用pycharm搭建虚拟的环境?记录一下配置的过程。 第一步:右键要打开的python的代…...
如何使用MybatisPlus进行数据分页显示
如何使用MybatisPlus进行数据的分页呢? 使用Mybatis Plus提供的分页插件来简化开发,在MybatisPlusInterceptor的拦截器中添加自动分页的PaginationInnerInterceptor拦截器,当前配置需要交给spring的bean管理,类上添加注解Configu…...
代码随想录 Day49 单调栈01 LeetCode LeetCodeT739每日温度 T496 下一个最大元素I
前言 折磨的死去活来的动态规划终于结束啦,今天秋秋给大家带来两题非常经典的单调栈问题,可能你不清楚单调栈是什么,可以用来解决什么问题,今天我们就来一步一步的逐渐了解单调栈,到能够灵活使用单调栈.注意以下讲解中,顺序的描述为 从栈头到栈底的顺序 什么时候用单…...
高可用--限流熔断降级
熔断 熔断是应对微服务雪崩效应的一种链路保护机制。 场景 服务端出现问题 服务指标:响应时间、错误率、连续错误数等,超过阈值出发熔断。硬件指标:CPU、网络IO、内存 目的 服务端恢复需要时间、服务端需要休息避免全调用链路崩溃&…...
win10电脑无法联网,设置IPv4,点击属性无法打开,闪退
win10设置IPv4,点击属性无法打开,闪退 问题:win10设置IPv4,点击属性无法打开,闪退 问题:win10设置IPv4,点击属性无法打开,闪退 第1步:用管理员打开cmd命令窗口,然后输入下面的命令&…...
【数据结构】邻接表与邻接矩阵的转换
一.基本思想 1.邻接矩阵转换为邻接表: 先设置一个空的邻接表,然后查找邻接矩阵的值不为零元素,找到后在邻接表的单链表对应位置加入表边节点。 2.邻接表转换为邻接矩阵: 在邻接表上顺序取出每个表边结点,将邻接矩阵…...
VR智慧景区:VR赋能文旅产业,激活消费潜能
随着国家数字化战略的不断深入实施,文旅产业数字化转型的步伐也在逐渐加快,以VR技术赋能文旅产业,让文旅景区线上线下双渠道融合,进一步呈现文化底蕴、激活消费潜能。 VR智慧景区以沉浸式、互动式、科技感的方式,将景区…...
Spring Boot EasyPOI 使用指定模板导出Excel
相信大家都遇到过,用户提出要把界面上的数据导成一个Excel,还得是用户指定的Excel格式,用原生的POI,需要自己去实现,相信是比较麻烦的,所以我们可以使用开源的EasyPOI. 先上个图,看看是不是大家…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
