模拟网络丢包常用方法以及工具
文章目录
- 背景
- 常用方法
- 代码实现
- 使用方法
- 测试代码
- 使用网络流量控制工具
- 常用工具
- Clumsy
背景
在软件开发过程中,经常需要模拟不同的网络环境来测试应用在不同条件下的表现。
这些模拟可以采用多种方式进行,包括在代码中实现随机丢包、随机延时、乱序;
使用专门的工具或调用系统接口。
模拟网络丢包是测试网络性能和稳定性的关键手段之一,它帮助开发人员和测试人员了解应用在不同网络条件下的表现,从而确保应用在实际部署时能够应对各种网络挑战。
常用方法
代码实现
- 自定义网络层:在应用程序内部实现自定义的网络层或代理,用于模拟特定的网络条件。
- 用库函数:利用编程语言提供的库函数来模拟网络丢包等条件。例如,在 Python 中可以使用 scapy 库来模拟数据包的丢失
Scapy 是一个强大的 Python库,用于创建、发送、接收和解析网络数据包。它可以用于网络研究、测试、教学以及安全审计等多种场景。
- Scapy 通过 Python 的底层网络接口(如 socket 模块)来发送和接收数据包
- Scapy 提供了一种面向对象的方式来构建网络数据包。
- Scapy 为每种协议提供了对应的类,例如 IP, TCP, UDP, ICMP 等
- Scapy 在构建数据包时会自动填充必要的字段。例如,如果你创建了一个 TCP 数据包,但没有指定某些字段,Scapy 会根据上下文自动填充这些字段
- Scapy 提供了强大的解析功能,可以解析接收到的数据包
Scapy 的主要功能
- 创建数据包:可以创建各种类型的网络数据包(如 TCP、UDP、ICMP 等)。
- 发送数据包:可以直接发送数据包到网络中。
- 接收数据包:可以从网络中接收数据包,并对其进行处理。
- 解析数据包:可以解析接收到的数据包,提取出有用的信息。
- 修改数据包:可以修改数据包的内容,如 IP 地址、端口号等。
安装 Scapy
pip install scapy
使用方法
from scapy.all import *
# 创建一个 IP 数据包
ip = IP(src="192.168.1.1", dst="192.168.1.2")
# 创建一个 TCP 数据包
tcp = TCP(sport=1234, dport=80, flags="S")
# 将 IP 和 TCP 数据包组合起来
packet = ip/tcp
# 发送一个简单的 ICMP 回显请求(ping)数据包
response = sr1(IP(dst="www.example.com")/ICMP())
# 输出响应结果
print(response)
# 捕获指定数量的数据包
packets = sniff(count=10)
# 打印捕获的数据包
packets.show()
解析数据包
# 捕获数据包
packets = sniff(filter="tcp", count=10)# 遍历每个数据包并打印详细信息
for packet in packets:print(packet.summary())
测试代码
测试从本地机器(IP 地址为 192.168.1.2)到 Web 服务器(IP 地址为 192.168.1.100)的数据包在丢包环境下的表现
from scapy.all import *
import random
from selenium import webdriver
import timedef simulate_packet_loss(pkt, loss_rate=0.05):if random.random() < loss_rate:print("Packet dropped")else:sendp(pkt, iface="eth0")# 捕获数据包
pkts = sniff(filter=f"tcp and port 80 and host 192.168.1.2", count=100)# 模拟丢包
for pkt in pkts:simulate_packet_loss(pkt)# 启动 WebDriver
driver = webdriver.Chrome()# 模拟 Web 服务器 此处需要替换为具体的业务逻辑
url = "http://192.168.1.100/"
driver.get(url)# 等待一段时间
time.sleep(5)# 关闭 WebDriver
driver.quit()
使用网络流量控制工具
- tc (Traffic Control):tc是Linux内核自带的一个网络流量控制工具,可以用来设置网络延迟、丢包率等参数。
例如
使用tc qdisc add dev eth0 root netem loss 10%命令可以设置eth0网卡的传输随机丢掉10%的数据包。
- 编写脚本或程序:
通过编写脚本或程序,可以在网络传输过程中随机丢弃数据包,以模拟网络丢包。这种方法需要一定的编程技能,但可以实现更复杂的模拟场景。
tc命令的主要组成部分包括qdisc(排队规则)、class(类别)和filter(过滤器),它们共同协作以控制网络流量。
- qdisc(排队规则)
是流量控制的基础,定义了网络数据包在网络接口上的排队和调度方式。常见的qdisc类型包括pfifo_fast(先进先出快速队列)、tbf(令牌桶过滤器)、htb(层次令牌桶)等。
例如,
tc qdisc add dev eth0 root tbf rate 1mbit burst 10kb latency 50ms
解释:
tc qdisc add:这个命令用于添加一个队列规则(qdisc)。
dev eth0:指定要添加队列规则的网络接口是eth0。
root:指定这是一个根队列规则。
tbf rate 1mbit burst 10kb latency 50ms:指定队列规则的具体类型为令牌桶过滤器(TBF),并设置相关的参数。其中,rate 1mbit表示带宽限制为1Mbps,burst 10kb表示突发大小为10KB,latency 50ms表示延迟为50毫秒。
// root 代表:
root关键字用于指定这是一个根队列规则,它作为eth0接口上所有流量的入口点,并根据TBF算法对流量进行初步的带宽限制、突发控制和延迟处理。这是网络流量控制中非常重要的一步,它确保了所有流量都能按照预设的规则进行管理和调度。
命令会在eth0接口上添加一个令牌桶过滤器,限制其传输速度为1Mbps,突发大小为10KB,延迟为50ms。
- class(类别)
为什么有类别
因为有精细化控制 比如层次化 优先级等需求,Class可以为每个类别分配带宽和优先级。
每个类别都有一个唯一的classid,用于标识该类别。
举例 :实现下面需求
总带宽:1 Mbps。
分配:
子类 1:最小保证带宽为 500 kbps,最大带宽为 1 Mbps。
子类 2:最小保证带宽为 250 kbps,最大带宽为 500 kbps。
子类 3:最小保证带宽为 100 kbps,最大带宽为 250 kbps。
# 创建根节点
tc class add dev eth0 parent 1:1 classid 1:1 htb rate 1mbit ceil 1mbit# 创建子类 1
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 500kbit ceil 1mbit# 创建子类 2
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 250kbit ceil 500kbit# 创建子类 3
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 100kbit ceil 250kbit
通过 tc filter 命令将特定的流量分配到不同的子类中
# 将来自 192.168.1.100 的流量分配到子类 1
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.100 flowid 1:10# 将来自 192.168.1.101 的流量分配到子类 2
tc filter add dev eth0 protocol ip parent 1:0 prio 2 u32 match ip src 192.168.1.101 flowid 1:20# 将来自 192.168.1.102 的流量分配到子类 3
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 match ip src 192.168.1.102 flowid 1:30解释
parent:指定父节点
prio 1:表示优先级
u32:表示使用通用分类(Universal Classifier)
match ip src 192.168.1.100 匹配源 IP 地址为 192.168.1.100 的数据包
flowid:指定将匹配的数据包分配到哪个类。
具体解释
`tc class add dev eth0 parent 1:1 classid 1:10 htb rate 500kbit ceil 1mbit`
解释
class add:添加一个新的流量控制类。
dev eth0:指定在 eth0 网络接口上应用此规则
parent:指定父节点,即该类属于哪个类的子类。
classid:指定当前类的唯一标识符
htb:Hierarchical Token Bucket(HTB)算法,是一种用于网络流量控制的算法,可以实现多层次的带宽分配和控制
rate:指定该类的最小保证带宽 500 kbps
ceil:指定该类的最大带宽上限 1M
命令会在eth0接口上添加一个类别规则,将classid为1:10的流量限制为500Kbps,峰值速率为1Mbps。
- filter(过滤器)
Filter用于根据特定的规则过滤网络流量,并将其分配到不同的类别中。
过滤器可以基于IP地址、端口号、协议类型等多种条件进行匹配。
例如,
`tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.2 flowid 1:10`
命令会创建一个过滤器规则,将源IP地址为192.168.1.2的流量分配到类别1:10中。
tc其他常用操作
查看当前配置:
- 使用tc qdisc show、tc class show dev 网卡 和tc filter show dev 网卡 命令可以分别查看当前系统中的队列规则、类别和过滤器配置。
- 添加/删除规则:使用add、del、change、replace等动作可以添加、删除或修改队列规则、类别和过滤器。
常用工具
Clumsy
Clumsy 是一个用于模拟弱网环境的工具,可以帮助开发者在不同的网络条件下测试他们的应用程序或服务。Clumsy 实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。
- 易于使用:Clumsy 提供了一个图形界面,使得设置和管理网络条件变得简单
- 多功能:除了模拟弱网环境外,Clumsy 还可以用来拦截 HTTP 请求,查看和修改请求内容。
- 跨平台:Clumsy 支持 Windows、macOS 和 Linux 等操作系统
相关文章:

模拟网络丢包常用方法以及工具
文章目录 背景常用方法代码实现使用方法测试代码 使用网络流量控制工具 常用工具Clumsy 背景 在软件开发过程中,经常需要模拟不同的网络环境来测试应用在不同条件下的表现。 这些模拟可以采用多种方式进行,包括在代码中实现随机丢包、随机延时、乱序&am…...
ABC 370 E - Avoid K Partition
原题链接:E - Avoid K Partition 题意:给长度为n的数组,将数组划分成任意份,但是每一份的总和都不能是k,问有多少种分割方法。 思路:dp,f[i],代表前i个元素满足题意的划分的总和&a…...

C++: set与map容器的介绍与使用
本文索引 前言1. 二叉搜索树1.1 概念1.2 二叉搜索树操作1.2.1 查找与插入1.2.2 删除1.2.3 二叉搜索树实现代码 2. 树形结构的关联式容器2.1 set的介绍与使用2.1.1 set的构造函数2.1.2 set的迭代器2.1.3 set的容量2.1.4 set的修改操作 2.2 map的介绍与使用2.2.1 map的构造函数2.…...

单片机-STM32 看门狗(八)
目录 一、看门狗概念 1、定义: 二、单片机中的看门狗 1、功能描述: 2、看门狗设置部分 预分频寄存器(IWDG_PR) 3、窗口看门狗 特性: 4、看门狗配置: 一、看门狗概念 看门狗--定时器(不属于基本定时器、通用定…...

iOS 18.1将上线新功能,可惜这波国内的小伙伴无缘了
在科技巨头苹果持续推动其生态系统全球化的进程中,最新的iOS 18.1、iPadOS 18.1及macOS 15.1开发者测试版发布,不仅为开发者们带来了新功能的预览,还悄然间对Apple智能功能的地区限制进行了微妙而重要的调整。 这一变化,虽看似细…...
MySQL中DML操作(二)
默认值处理(DEFAULT) 在MySQL中可以使用DEFAULT为列设定一个默认值。如果在插入数据时并未指定该列的值,那么MySQL将默认值添加到该列中。 创建表时指定列的默认值 CREATE TABLE 表名(列名 类型 default 默认值......); 示例:…...

LLMs技术 | 整合Ollama实现本地LLMs调用
前言 近两年AIGC发展的非常迅速,从刚开始的只有ChatGPT到现在的很百家争鸣。从开始的大参数模型,再到后来的小参数模型,从一开始单一的文本模型到现在的多模态模型等等。随着一起进步的不仅仅是模型的多样化,还有模型的使用方式。…...
【C-实践】文件服务器(3.0)
文件服务器1.0文件服务器2.0文件服务器4.0 概述 使用了 tcp epoll 线程池 生产者消费者模型,实现文件服务器 有两个进程,主进程负责接收退出信号用来退出整个程序;子进程负责管理线程池、客户端连接以及线程池的退出 子进程中的主线程生…...

LeetCode 2181.合并零之间的节点
题目描述 给你一个链表的头节点 head ,该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val 0 。 对于每两个相邻的 0 ,请你将它们之间的所有节点合并成一个节点,其值是所有已合并节点的值之和。然后将所有 0 …...
千益畅行,共享旅游卡,引领旅游新潮流
千益畅行旅游卡是一款专为旅游爱好者打造的超值卡片。它就像一把神奇的钥匙,为您打开国内丰富多彩的旅游世界。 我们的旅游卡拥有众多令人惊喜的特点。首先,它涵盖了国内 40 多条精心策划的旅游线路,无论您是向往历史文化名城的厚重底蕴&…...

K均值聚类
根据到给点样本的距离,来聚类。 1.曼哈顿距离、 2.欧几里得距离 直线距离 3.切比雪夫距离 4.闵氏距离 5.余弦相似度 对数据大小/长度等不关注,只关注相似度。 6.汉明距离 二进制距离 二、密度聚类 DBSCAN 前提是样本是根据紧密程度分布的。 先用超参…...
【Ubuntu】安装常用软件包
安装java 直接输入java,如果没有安装的话会提醒你输入命令安装,类似 Command java not found, but can be installed with: sudo apt install jdkxxxxxxxxxxxxxx然后选一个版本安装就好,我这里选的jdk17,安装完确认一下 ubuntuVM-4-13-ubu…...

探索全光网技术 | 全光网产品解决方案整理-(宇洪科技)
探索全光网技术 |全光网产品解决方案整理-宇洪科技 目录 一、数据中心场景1、方案概述2、方案需求3、相关产品4、产品推荐5、方案价值 二、教育场景1、方案概述2、方案需求3、相关产品4、方案价值 三、医疗场景1、方案概述2、方案需求3、相关产品4、方案价值 注:本文…...

资料分析(2)
C B 增长量不变就是1002020 上面是利滚利:按照20%当利息 本题:涨跌幅度的意思就是增长率,本题是按照增长率不变的情况下进行计算D B 7551400X>1.2*100000 B B B 总体增量部分增量之和 先进行计算固定通信业务收入的增长量移动通信业务实现收入的增长量 增长量现期…...

百元以下蓝牙耳机性价比之王品牌?四大高能性价比机型推荐
面对市场上琳琅满目的蓝牙耳机品牌和型号,消费者往往难以抉择,特别是当预算限定在百元以下时,找到一款既满足基本功能又具备一定品质的蓝牙耳机变得尤其困难,那么百元以下蓝牙耳机性价比之王品牌?尽管价格是一个重要的…...

考场考生行为检测数据集 7000张 带标注 voc yolo
数据集名称: 考场考生行为检测数据集 数据集规模: 图像数量:7000张标注类型:行为检测(例如:作弊、玩手机、睡觉等)格式兼容性:支持VOC和YOLO标注格式 数据集内容: 该…...

深度学习算法,该如何深入,举例说明
深度学习算法的深入学习可以从理论和实践两个方面进行。理论上,深入理解深度学习需要掌握数学基础(如线性代数、概率论、微积分)、机器学习基础和深度学习框架原理。实践上,可以通过实现和优化深度学习模型来提升技能。 理论深入…...
舵机的原理及应用
舵机是一种位置(角度)伺服的驱动器,主要由外壳、电机、减速齿轮组、位置传感器和控制电路等部分组成。一、工作原理 舵机的工作原理是控制电路接收信号源的控制信号,并将其转换为电流信号,驱动电机转动。电机通过减速齿轮组带动输出轴…...
Nacos与Eureka--微服务注册中心
Nacos与Eureka Nacos和Eureka都是微服务架构中常用的服务发现和注册中心解决方案,它们帮助微服务架构中的各个服务实例进行互相发现和通信。 Nacos 是由阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。它支持服务的注册与发现,并且提供了配…...
Android 调试桥——ADB
文章目录 前言ADB 的主要功能设备连接与管理应用安装与卸载文件传输日志查看设备重启 常用命令连接方式有线无线注意点 前言 ADB(Android Debug Bridge,安卓调试桥)是 Android SDK 提供的一种命令行工具,用于在开发者的计算机和 …...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...