xuuhan / BandWidthTool

主要应用在流媒体传输中,估计当前带宽、预估下一段带宽。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

BandWidthTool

实现方法的权衡

  • 通常来说,带宽预测的实现方式是通过下载数据量除以消耗时间的方式来计算。用这种方法计算的带宽是响应时间内的平均带宽,当段长较长时,该方法不能很好的捕捉到实际带宽的快速变化,造成预估带宽和实际带宽不匹配。

  • 基于传输层参数,如往返时延 RTT、丢包率等来计算可用带宽,该方法可以较为精准的检测到当前网络环境,但需要深入传输层做控制,实现复杂。

  • 为了平衡平均带宽方法与传输层参数方法,有一种基于抽样带宽的估测方法,通过对下载数据等长时间抽样,在段内采用平均带宽方法计算多个带宽抽样值,然后通过这些抽样值序列进行带宽预估。但该方法对细小的网络波动敏感,会造成不必要的带宽预估值波动。

  • 为了解决这些问题,参考这篇文章中的方法。该方法包括段内估测和段间估测与段内估测。段内估测通过指数平均方法平滑段内抽样带宽序列求得该段的即时带宽; 通过逻辑斯谛方程预测即时带宽的变化值来求得下一段的估测带宽。文章中有详细的实现思路。

实现应保持的原则

  • 应迅速的捕捉到网络环境的变化,并弱化较小的网络波动时的预估,快速跟随较大的网络波动迅速响应。

实现

  1. 段内估测当前带宽 步骤:
  • 当资源段时长 < videoDurationThreshold(自定义) 时,当前带宽 = 资源总大小 / 下载总时长;
  • 当资源段时长 > videoDurationThreshold 时,对下载数据等长时间采样(videoIntervalValue 采样间隔),在段内采用平均带宽方法计算多个带宽抽样值,并用指数平均方法来平滑段内抽样带宽序列。抽样序列的最后一个指数平均值作为当前可用带宽。既:当前带宽 = (当前段落上一次采样次数 * 上一次的平均带宽 + 2 * 上一次采样的指数带宽)/ 下一次采样次数。
  1. 段间估测下一段资源的带宽
  • 在当前即时带宽的基础上增加一个,网络波动的预估值。既:下一段预估带宽 = 当前即时带宽 + 变化值;
  • 即时带宽是已知的,波动值 = (本段预估带宽 - 本段即时带宽), 变化值 = 波动值 * 修正值;
  • 修正值的取值范围为 0~1 之间,为了快速跟随较大的网络波动,修正值应该更趋向 0,为了平滑较小的网络波动,修正值应该更趋向1。修正值依赖于波动值,这里使用逻辑斯谛方程来建立波动值与修正值间的控制函数: image
  • m 是陡峭函数, ρ0 是中心值,ρ 是 网络波动 Di 的归一化因子,Tnor 是控制平滑边界的归一化因子。当 m = -21 ,ρ0 = 0.167 时,修正值 和 ρ 的关系如图所示: image
  • 如果Tnor 很小,即使是一个小的波动,也会得到一个大的 ρ 值,而一个大的 ρ 值会产生一个小的 δ 值。由上分析可知, 如果 δ 值小,那么估测带宽将更接近即时带宽,即估测带宽对小波动很敏感。所以,当 Tnor 很小时,会得到一个小的平滑边界。同理,当 Tnor 比较大时,即使是一个大的波动,通过控制函数,也会产生一个平滑的估测带宽 。此种情况下,得到一个较大的平滑边界。控制函数中,参数 m 控制 δ 的变化速度,即平滑估测( δ 值较大)和快速跟随估测( δ 值较小)之间的转换速度。

模拟场景

  • 模拟网络波动较为频繁且无规则的下载资源场景与结果:

image

  • 模拟网络波动较小的下载资源场景与结果:

image

  • 模拟网络完全平稳的下载资源场景与结果:

image

总结

  • 段内实时带宽预估更能反应当下的网络状况。

  • 段间预估在网络状态稳定的情况下更能给出一个较为均衡、平滑的预估值,就算出现了大的网络波动也可以参考上一次的预估值与可调整的权重,产生一个均衡值。但仅局限在网络状态没发生改变的情况下。相反,5G -> 4G,5G -> 无网,无网 -> 5G 等网络状态发生改变的时候应该使用段内实时预估,因为状态改变前的预估值并不能拿来参考。

  • 应用在实际项目中的思路应该如下:

  1. 监听网络状态的变更;
  2. 没发生网络状态变更则使用段间预估值为预估带宽;
  3. 网络状态发生变更后使用段内实时带宽做为预估带宽,且观察段内实时带宽的波动平稳后,改为段间预估带宽。 (如果段内实时带宽仅用在网络状态发生变化时,完全可以不使用指数平均值,使用普通平均值更能体现当时的网络真实带宽。)

License

BandWidthTool is available under the MIT license.

About

主要应用在流媒体传输中,估计当前带宽、预估下一段带宽。


Languages

Language:Objective-C 100.0%