适用于音视频的弱网测试整理
一、什么是弱网环境
对于弱网的定义,不同的应用对弱网的定义是有一定的差别的,不仅要考虑各类型网络最低速率,还要结合业务场景和应用类型去划分。按照移动的特性来说,一般应用低于2G速率的都属于弱网,也可以将3G划分为弱网。除此之外,弱信号的Wifi通常也会被纳入到弱网测试场景中。随着国内移动端迅猛发展,大大增加用户碎片化使用移动端的概率,用户可能会在地铁上,高铁上,巴士上,甚至是电梯,电梯间,楼梯间,隧道,车库,大型活动现场等空间使用互联网应用。

二、音视频受网络限制的原理
Q1:当请求从客户端发出,最后服务器响应请求并返回,看似简单的流程,中间经过了些什么呢,又是有哪些流程会受到弱网情况的影响呢?

首先,简要介绍一下传输层协议,TCP/IP协议族是一个四层协议系统。
- 从下到上分别为 数据链路层、网络层、传输层、应用层,每一层都通过若干协议实现完成不同的功能。
- 其中数据链路层实现了网卡接口的网络驱动程序,处理数据在物理媒介上的传输,并隐藏了各个物理媒介之间的区别,为上层协议提供了统一的接口;网络层 通常网络上的两台主机之间不是直接相连接的,两种之间存在多个中间节点(路由器)。它的的作用就是在众多的节点中选择中间节点,使两台主机能够通信,确定两台主机的的地址管理和路由选择;传输层为两台主机上的应用提供端到端(end to end)的通信。与网络层不同的是,传输层只关心通信的起始端和目的端的可靠数据传输,而不在乎数据包的中转过程;应用层负责处理应用程序的逻辑(比如文件传输、名称查询和网络管理等)作用于用户层。而数据链路层、网络层和传输层负责处理网络通信细节,这部分必须稳定而高效,因此它们都在内核空间中实现。
- 而刚提到的数据通信,从应用层发送一段数据时,需要将该数据通过协议栈从上往下依次传递,同时每一层协议都会在上一层数据的基础上加上自己的头部信息 (比如我们常见的TCP/UDP协议,在接收到我们要发送的数据时,就会在我们要发送的数据前面加上自己的头部信息)。完成所有数据封装后,当帧达到目的主机后,重新沿着协议栈自低而上依次传递,各层协议依次处理帧中本层负责的头部,获取到所需信息,并最终将处理后的数据分用交给应用程序。由此底层经过繁琐的数据处理后,完成一次数据的直接通信,而不同阶段客户端和服务器处于不同网络环境,每一层协议均会受网络状况的影响。

Q2:已知数据在网络层、数据传输层、应用层等都会受到网络影响,那具体会存在哪些网络问题呢?又是如何去对抗解决这些网络问题呢?
1、影响网络传输质量有很多原因,比如目标网站所在的服务器带宽不足或负载过大、网线问题导致网速变慢、防火墙的过多使用、系统资源不足等都会影响网络质量,其中最主要的是 网络拥塞、网络丢包、网络抖动 等问题,这些问题会是造成音视频卡顿、实时性不佳的主要原因。
2、解决这些核心网络问题,主要由上层 网络层(部分网络层无法解决,也会由 应用层 参与解决)。
其中,网络传输层主要协议有 TCP 和 UDP ,传输层协议在 TCP/IP 分层协议中位于应用层之下,一般在操作系统内部提供实现。其中,TCP 是面向连接的可靠传输协议,为数据传输的完整性和有序性提供了保障;UDP 是无连接的不可靠传输协议,数据传输的可靠性完全交由应用层处理。

实时音视频应用场景下,UDP 会作为优先选择已经是广泛共识。原因主要包括以下几点:
1、TCP 协议并非为音视频实时应用场景设计,其内部的拥塞控制和差错控制等机制为了可靠性和高吞吐量而导致延时的增加,在弱网环境下延时的恶化更为明显。ITU StandardG.114 对延时的定义是,端到端延时大于 400ms 时,用户的交互体验将受到明显的影响。
2、TCP 的拥塞控制机制和差错控制机制 位于操作系统内部实现,应用层无法优化,无法应对不同场景需求进行调整,严重 缺乏灵活性。
3、UDP 协议本身开销比 TCP 小,传输控制策略完全交由应用层来实现,具有足够的灵活性。
拥塞问题:
当网络中传输的数据流量超过网络瓶颈容量,就会产生拥塞问题。
拥塞的直接影响是突发丢包或者突发抖动,如果不及时预测拥塞的发生,及时降低发送数据量,接收端将会出现卡顿、延时大、画质差等等问题。
拥塞产生的原因有两点:
接收方容量不够
网络内部有瓶颈
那作为测试,我们一是 需要快速准确地进行网络拥塞探测;二是 观测是否可以 避免拥塞以及尽可能快地从拥塞状态恢复。
拥塞探测 根据观测数据的差异可用分为两类:
基于丢包的算法(Loss-based):通过丢包事件来检测网络拥塞。
基于延时的算法(Delay-based):通过对延时的测量来判断网络拥塞。
丢包问题:
如上所述,实时交互式媒体传输基于 RTP/UDP 协议,丢包问题由应用层处理。
网络传输方面的对抗丢包技术手段主要包括 重传(ARQ)、前向纠错(FEC)。
信源编码方面根据数据以及编码方的不同也可以提供某些特定的抗丢包能力,比如视频编码中采用 B 帧降低丢包的影响。
抖动问题:
概括而言,抖动问题就是 网络传输延时变化问题,抖动越大表示网络传输延时变化越大。
抖动问题会造成接收端卡顿、播放快进等严重影响音视频沟通体验的问题。造成抖动问题的原因是多方面的,比如新的流加入造成网络资源竞争加剧、源端数据发送速率本身不平稳以及其他网络原因。
目前处理抖动的通用策略是 接收端建立抖动缓冲区(JitterBuffer)来消除抖动。接收端通过增加抖动延时来吸收不均匀的延时,达到均匀播放的目的。
三、弱网测试保障适用场景
- 弱网测试对 直播应用 和 音视频应用 都是刚需,他们所面对的网络环境具有较强的 复杂性、异构型,用户可能会在任何地方任何网络条件下进行直播或者视频会议。特别是视频直播,用户可能会在地铁里观看直播,可能在高铁上观看直播,主播有可能在户外信号弱的地方进行推流,也有可能在大型活动的现场进行推流。而视频会议的员工可能在全球的任何地方,有可能当地的网络条件较差。
- 但是直播和视频会议等实时音视频应用,对视频的 连续性、图像质量、音频质量、连接的稳定性 要求都是非常高的,在不同环境下的严重程度也存在很大差异,任何一方面做得不尽人意都可能影响到用户对产品的使用感受,可能会导致用户流失。因此非常有必要针对各种可能遇到的弱网环境,对应用的各方面进行优化和调整。这样一来,如何检测复杂网络下音视频的体验,是音视频测试关注的重点问题。
四、弱网测试工具分享
- 通过对市面上8种测试工具进行调研,考虑到平台兼容性、最终选中Charles/Qnet两种弱网检测工具。

其中包括 charles、Qnet 两种弱网检测工具的使用,测试工具弱网场景的模拟原理了话,就是通过实时将系统接受和发出的网络数据包拦截下来,人工的造成延迟、掉包和篡改操作后再进行发送。无论是要复现网络异常造成的程序错误,还是评估应用程序在不良网络状况下的表现,都可以在不需额外搭建环境的情况下,在系统层次达到想要的效果。
五、弱网参数设置参考值
- 在各种各样的弱网环境中,网络对应用的影响因素大致分为:可用带宽、丢包、时延、时延抖动等。
- 通过对实地网络参数进行测速,如电梯、地铁场景等,参照运营商输出的14种弱网场景,给出大家对于不同弱网场景,参数设定的一个参考值,下面附件中也提供了可直接用于charles导入的网络参数文件。
ps:实地测速使用app端的网络测速工具:appstore 测网速

名词解释:
上行速率:上行速率是指移动终端给基站发送信息时的数据传输速率,
下载速度:比如手机、笔记本等无线终端给基站传输数据速率;下行速率是指基站向移动终端发送信息时的传输速率,比如手机或笔记本等无线终端从基站或者网络下载数据的速率。
丢包率:丢包率(Loss Tolerance或Packet Loss Rate)是指测试中所丢失数据包数量占所发送数据组的比率。
时延:是指一个报文或分组从一个网络的一端传送到另一个端所需要的时间。它包括了发送时延,传播时延,处理时延,排队时延。(时延=发送时延+传播时延+处理时延+排队时延)一般,发送时延与传播时延是我们主要考虑的。
EDGE:由于EDGE是一种介于现有的第二代移动网络与第三代移动网络之间的过渡技术,因此也有人称它为"二代半"技术。
网络时延参考自百度百科:
上述数据参考自:https://blog.csdn.net/mao834099514/article/details/79456881
六、音视频的极限网络
通过对线上音视频的竞品调研,探索应用于不同场景下音视频的极限网络网端。
快剪辑平台【抖音,快手,秒剪】
编辑器功能平台【剪映,快影,度咔,必剪(参考)】
智能成片【秒剪,抖音,快手,度咔,畅片】
1、常规UI展示:通过对 抖音,快手,秒剪 APP进行弱网检测,【2G弱网】是极端网段。
2、智能成片:通过对 秒剪,抖音,快手,度咔,畅片、粉APP 六种APP 进行弱网检测,【3G弱网】是智能成片功能的极限网段;低于该弱网限制,对应功能的高、中、低端机型,业务功能无法正常应用。
3、ASR 语音识别+导出等操作:通过对 剪映,快影,度咔,必剪(参考)、粉 六种APP 进行弱网检测,【3G弱网】是ASR功能/导出操作的极限网段,低于该弱网限制,对应功能的高、中、低端机型,业务功能无法正常应用。
七、弱网用例场景设计
实际需要进行弱网场景覆盖场景,需根据业务 P0 核心场景划分,以及 新增/产品关注 业务场景进行弱网的覆盖。
八、弱网经典问题分享
针对直播、剪辑视频场景,遇到的客户端弱网问题、以及对应的弱网解决方案进行分享:

3、串行接口请求失败,一个接口失败导致全部失败
1、根据业务进行排查 / 性能调优
2、根据素材进行素材瘦身
3、拆分减少串行处理的接口,数据异步返回后针对性刷新
持续更新…
九、单位换算分享
冷知识:bps kbps mbps 换算规则
Mbps 即 百万位每秒,Kbps 即 千位每秒,bps 位每秒
速度单位,bit即比特,通常用b(小写)表示,指一位二进制位,1Mbps=1000Kbps=1000000bps;
所以1Mbps=1000 000bps;
这是通常用来衡量带宽的单位,指每秒钟传输的二进制位数
MB即百万字节也称兆字节;
KB即千字节;
B即字节;
之间关系为1MB=1024KB=1024*1024B;
1B=8b
附:charles网络设置xml文件(可直接导入)
十、Q & A

相关文章:
适用于音视频的弱网测试整理
一、什么是弱网环境 对于弱网的定义,不同的应用对弱网的定义是有一定的差别的,不仅要考虑各类型网络最低速率,还要结合业务场景和应用类型去划分。按照移动的特性来说,一般应用低于2G速率的都属于弱网,也可以将3G划分…...
【Spring MVC研究】DispatcherServlet如何处理请求(doDispatcher方法)
文章目录 1. 最经典的MVC的使用情况2. 经典情况相关的组件3. 执行3.1. 先看DispatcherServlet的总体过程3.2. 再看RequestMappingHandlerAdapter的总体过程3.2.1. RequestParamMethodArgumentResolver3.2.2. 反射调用 Controller 的方法3.2.3. RequestResponseBodyMethodProces…...
解决github加载过慢问题
github打不开怎么办?看到这篇文章,一切都稳了! DNS被污染,一句话,修改系统hosts文件! 1.hosts文件在哪?C:\Windows\System32\drivers\etc 2.用记事本打开hosts,在最后加入以下两行…...
利用python批量处理nc数据
参考自:用Python批处理指定数据-以WRF输出结果为例演示按照指定维度合并(附示例代码)-腾讯云开发者社区-腾讯云 #下面将分别展示选择单个变量进行合并以及将所有变量按照指定维度进行合并。 #1.以单个变量P为例,可以根据需求更改,按照时间顺…...
popen() 获取 ping 命令结果解析
ref: Linux:popen() 获取 ping 命令结果 用C/C代码检测ip能否ping通(配合awk和system可以做到批量检测)_c 验证网卡能拼同-CSDN博客 Android中调用Ping操作及结果分析 - 简书 2. Linux使用ping命令查看网络延迟 - 简书...
【pytorch】深度学习准备:基本配置
深度学习中常用包 import os import numpy as np import torch import torch.nn as nn from torch.utils.data import Dataset, DataLoader import torch.optim as optimizer超参数设置 2种设置方式:将超参数直接设置在训练的代码中;用yaml、json&…...
etcd随笔
大集群 大集群主要问题有 btree重平衡和分解过程中超过20Gi的性能瓶颈,是O(n)复杂度,启动耗时增大,放大expensive request的影响。 其中最重要的就是最大程度地减少 expensive request。 对几十万级别的对象数量来说…...
0基础学习VR全景平台篇 第107篇:全景图调色和细节处理(上,地拍)
上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 今天教给大家的课程是地拍全景图调色和细节处理,下面我们就开始吧! 1.把照片快速导入LR软件 选择【图库】模块 打开软件后,点击【导入】按…...
Verilog功能模块——同步FIFO
前言 FIFO功能模块分两篇文章,本篇为同步FIFO,另一篇为异步FIFO,传送门: Verilog功能模块——异步FIFO-CSDN博客 同步FIFO实现起来是异步FIFO的简化版,所以,本博文不再介绍FIFO实现原理,感兴趣…...
Unity ToLua热更框架使用教程(1)
从本篇开始将为大家讲解ToLua在unity当中的使用教程。 Tolua的框架叫LuaFramework,首先附上下载链接: https://github.com/jarjin/LuaFramework_UGUI_V2 这个地址的是UGUI的。 下载完之后导入项目,首先,我们要先让这个项目跑起…...
车载相关名词--车载数据中心方案
车载数据中心方案 参考链接:https://zhuanlan.zhihu.com/p/600031042?utm_id=0 下面这张图是小鹏汽车嵌入式系统高级专家 唐黾 在同ARM一起的一个演讲稿中发布的,是一张未来车载数据中心单芯片方案构想图。主要针对的是智驾域和座舱域融合方案,下面对如上图的内外部组件及…...
helm使用
前言 类似于 Linux 的 YUM、APT,Helm 是 K8S 的包管理工具。 Helm, 一个二进制工具,用来安装、升级、卸载 K8S 中的应用程序。 Helm Chart,一个 tgz 包,类似安卓的 APK。 K8S 应用打包成 Chart,通过 He…...
Python in Visual Studio Code 2023年10月发布
排版:Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展于 2023 年 10 月发布! 此版本包括以下公告: Python 调试器扩展更新弃用 Python 3.7 支持Pylint 扩展更换时的 Lint 选项Mypy 扩展报告的范围和守护程序模式G…...
Webmin远程命令执行漏洞复现报告
漏洞编号 CVE-2019-15107 漏洞描述 Webmin是一个基于Web的系统配置工具,用于类Unix系统。密码重置页面中存在此漏洞,允许未经身份验证的用户通过简单的 POST 请求执行任意命令。 影响版本 Webmin<1.920 漏洞评级 严重 利用方法(利…...
webstorm自定义文件模板(Vue + Scss)
最终效果如下: 具体配置如下: 新增文件代码如下: <!--* Description: ${COMPONENT_NAME} 页面* Author: mhf* Date: ${DATE} --> <template><div>${COMPONENT_NAME} </div> </template><script&g…...
楔子-写在之前
最近一年都在忙着一个项目,并且需要学习另一个领域的知识,从单片机过渡到了LINUX嵌入式,倒静不下心去写点东西。看了下之前写的东西,感觉已经过去了很久很久。现在项目快忙完了,准备把最近的心得给大家分享下。 前言 …...
第 5 章 数组和广义表(稀疏矩阵的三元组顺序表存储实现)
1. 背景说明 为了节省存储空间,可以对这类矩阵进行压缩存储。所谓压缩存储是指:为多个值相同的元只分配一个存储空间,对零元不分配空间。 2. 示例代码 1)status.h /* DataStructure 预定义常量和类型头文件 */ #include <string.h>#i…...
【RabbitMQ 实战】11 队列的结构和惰性队列
一、 队列的结构 队列的组成: 队列由 rabbit_amgqueue_process 和 backing_queue两部分组成。rabbit_amqqueue_process负责协议相关的消息处理,即接收生产者发布的消息、向消费者交付消息、处理消息的确认 (包括生产端的 confirm 和消费端的 ack) 等。…...
Python3-批量重命名指定目录中的一组文件,更改其扩展名
Python3-批量重命名指定目录中的一组文件,更改其扩展名 1.argparse模块2.vars内置函数3.os.listdir(path)4.os.path.splitext(filepath)5.os.path.join6.os.rename7.os.path.isfile8.批量重命名指定目录中的一组文件,更改其扩展名 1.argparse模块 argpa…...
渗透测试KAILI系统的安装环境(第八课)
KAILI系统的安装环境(第八课) Kaili是一款基于PHP7的高性能微服务框架,其核心思想是面向服务的架构(SOA),支持http、websocket、tcp等多种通信协议,同时还提供了RPC、Service Mesh、OAuth2等功能。Kaili框架非常适合构…...
中药实验管理系统|基于springboot+vue的中药实验管理系统(源码+数据库+文档)
中药实验管理系统 目录 基于springbootvue的中药实验管理系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师,…...
从‘看不见’到‘毁不掉’:深入聊聊数字水印的鲁棒性到底怎么测(附常见攻击模拟方法)
数字水印鲁棒性测试实战指南:从理论到攻击模拟 数字水印技术已经从单纯的学术研究走向了广泛的商业应用,成为版权保护领域不可或缺的一环。但真正决定一个水印系统实用价值的,是其抵抗各种攻击的鲁棒性——这项指标直接关系到水印能否在现实…...
C++详解实现Stack方法
栈简介栈本着先进后出的原则,来存取数据。作为数据结构中的一种,这里不多介绍相关栈。仅以此文记录C中栈的实现,可帮助提升编程能力与对栈的理解。stack模拟stack是一种容器适配器,专门在具有后进先出的上下文环境中,其…...
TegraRcmGUI终极指南:Windows上最简单的Switch注入工具
TegraRcmGUI终极指南:Windows上最简单的Switch注入工具 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Nintendo Switch设…...
手把手教你用STM32CubeMX配置STM32F103的Modbus从站(FreeMODBUS移植指南)
基于STM32CubeMX与FreeMODBUS的工业通信从站开发实战 在工业自动化领域,Modbus协议因其简单可靠的特点,至今仍是设备间通信的黄金标准。对于STM32开发者而言,传统的外设库直接编程方式需要处理大量底层细节,而CubeMX工具链与成熟开…...
STM32F407 HAL库驱动42步进电机:从CubeMX配置到代码调试的完整避坑指南
STM32F407 HAL库驱动42步进电机:从CubeMX配置到代码调试的完整避坑指南 在嵌入式开发领域,步进电机控制一直是工业自动化、3D打印和机器人控制等应用中的核心技术。对于刚接触STM32系列微控制器的开发者来说,使用HAL库驱动42步进电机可能会遇…...
用51单片机和HC-SR04超声波模块,手把手教你做个倒车防撞提醒器(附完整代码和立创EDA原理图)
51单片机与超声波模块实战:打造高精度倒车防撞系统 引言 在智能交通与汽车电子领域,距离检测技术扮演着越来越重要的角色。对于电子爱好者而言,掌握超声波测距原理并实现实际应用,不仅能提升硬件开发能力,还能为日常生…...
九成中老年为之困扰:隐秘的足部护理刚需,正催生一条翻倍增长赛道
拆解银发足部经济的掘金逻辑作者 | AgeClub任子勋前言中老年足部护理,这个长期游离在大众视野之外的隐秘需求,正促成一桩热门生意。在城市商圈、社区街道上,路人经常能遇到大小不过10余平米的足部护理店。这些门店鲜有网络营销造势࿰…...
小白程序员必备:从零基础到大模型实战,这份学习路线图请收藏!
本文结合530名开发者的经验,为AI初学者提供从零基础到项目实战的完整学习路线。核心内容包括:Python编程、数学基础、机器学习、深度学习框架(PyTorch)、科学计算库(NumPy)等关键技能,并避开了常…...
嵌入式系统学习路线:从C语言到RTOS/Linux的四年规划
1. 项目概述:为什么需要一个清晰的嵌入式学习路线?如果你是一名刚踏入大学校门,对电子、计算机或者自动化感兴趣的新生,看到“嵌入式”这个词,可能会觉得它既神秘又遥远。它不像手机App开发那样触手可及,也…...
