首页 > WebRTC > WebRTC研究:包组时间差计算-InterArrival
2019
11-12

WebRTC研究:包组时间差计算-InterArrival

在GCC(Google Congestion Control)中,包含两种拥塞控制算法。一种是基于丢包的,一种是基于延迟的。GCC最后综合这两种算法得到一个目标码率。

基于延迟的拥塞控制算法主要由四部分组成:预处理(pre-filtering), 到达时间滤波器(arrival-time filter), 过载检测器(over-use detector),码率控制器(and a rate controller)。

到达时间模型

A Google Congestion Control Algorithm for Real-Time Communication定义了一种到达时间模型(Arrival-time model),属于到达时间滤波器的内容,在这里我们定义几个概念。

两个包组(包组概念下一小节介绍)的到达时间差:inter-arrival时间:

两个包组离开(发送)时间差:inter-departure时间:

包组i与包组i-1的延迟变化:

这个延迟变化将在后续评估网络延迟增长趋势的滤波器中用到,用于判断网络拥塞状况,这里就先不展开讨论,本文主要介绍这些时间差如何计算。

包组

在WebRTC中计算延迟不是一个个包计算的,而是通过将包分组,然后计算这些包组间的延迟,这样做可以减少计算次数,同时减少误差。如何对包进行分组呢?

主要是通过计算发送时间差值来分组。在包组中,除了第一个包外,后面的包距离包组第一个包的发送时间差小于5ms。假设每个包都有一个发送时间t,第一个包的发送时间为t0,如果后续的包发送时间与t0时间差△t = t -to <= 5ms,那么这些包都可以与t0发送时间的包归为一组,如果某个包得到的△t > 5ms,那么该包就作为下一个包组的第一个包,接着后面的包就跟该包继续比较时间差,判断能否归为一组。下面我们盗个图举个例子说明下。
WebRTC研究:包组时间差计算-InterArrival - 第1张  | 剑痴乎

上图中有两个包组G1和G2, 其中第100号包与103号包的时间差小于5毫秒,那么100 ~ 103被划作一个包组。104与100之间时间超过5毫秒,那么104就是G2的第一个包,它与105、106、107划作一个包组。

在后续评估延迟增长趋势的滤波器需要三个主要参数:发送时刻差值(timestamp_delta)、到达时刻差值(arrival_time_delta)和包组数据大小差值(packet_size_delta)。由上图可知:

源码导读

ComputeDeltas函数

前面说到的时间差值计算以及包组判断代码主要由InterArrival类实现。下面我们结合代码说明下,相关代码位于src\modules\remote_bitrate_estimator目录下。InterArrival类主要就一个接口:ComputeDeltas。传入每个包时间、包大小等参数,计算包组时间间隔,包组大小差值,得到新的包组相关差值后返回true。

下面解释下各个参数:

  • timestamp:包发送时间
  • arrival_time_ms:包到达时间
  • timestamp_delta(output):包组发送时间差
  • arrival_time_delta_ms(output): 包组到达时间差
  • packet_size_delta(output) :包组大小差值

timestamp_deltaarrival_time_delta_ms计算如下:

packet_size_delta计算如下:

NewTimestampGroup函数

WebRTC新包组判断代码。

  • 若是第一个包,得作为后续包对比基准,不认为是新包组
  • 若是突发数据(burst),不认为是新包组
  • 与第一个包发送时间间隔大于kMaxBurstDurationMs(值为5),认为该包属于新包组

BelongsToBurst函数

这里我们也介绍下上一小节说到的突发数据。有些客户端发送数据时,没用使用pacing平滑发送模块,一股脑往网络塞入大量数据,导致突发流量。我们看下WebRTC中如何判断突发数据的。

总结

本篇文章主要讲了到达时间模型以及在WebRTC中的源码实现:InterArrival。后面文章我们将研究下trendline滤波器。前面计算得到的相关差值我们将传递给trendline滤波器,进行网络拥塞情况判断。

WebRTC研究:Trendline滤波器-TrendlineEstimator

最后编辑:
作者:Jeff
Avatar
管理员——代码为剑,如痴如醉

8 Responses to WebRTC研究:包组时间差计算-InterArrival

  1. Avatar holden says:
    Google Chrome 78.0.3904.108 Google Chrome 78.0.3904.108 Windows 10 x64 Edition Windows 10 x64 Edition

    请问这个值是怎么得出的,为什么不是直接写5ms,而是用了下面这个公式
    (kTimestampGroupLengthMs << 26) / 1000

    • Avatar Jeff says:
      Google Chrome 78.0.3904.87 Google Chrome 78.0.3904.87 Windows 10 x64 Edition Windows 10 x64 Edition

      这个是内部不同时间单位的转换,kTimestampGroupLengthMs经过这个公式转换后就变为kTimestampGroupLengthTicks,你看下Ms与Ticks后缀,就明白具体单位含义了,一个是以毫秒为单位,一个是以采样频率为单位。

      • Avatar Holden says:
        Google Chrome 79.0.3945.79 Google Chrome 79.0.3945.79 Windows 10 x64 Edition Windows 10 x64 Edition

        再请教一下,我再win10上编译好了webRTC的文件,该怎么调式goog_cc的那个模块,我试着启了example中的peerconnection.exe,但是好像没调到congestion controller 模块

        • Avatar Jeff says:
          Google Chrome 78.0.3904.87 Google Chrome 78.0.3904.87 Windows 10 x64 Edition Windows 10 x64 Edition

          WebRTC本身是P2P传输,所以你还得跑P2P服务器,example也带有stun,turn服务器,因为是P2P,所以得跑两个peerconnection.exe。嫌麻烦,可以调试自带的gcc单元测试代码。

          • Avatar Holden says:
            Google Chrome 79.0.3945.88 Google Chrome 79.0.3945.88 Windows 10 x64 Edition Windows 10 x64 Edition

            请问怎么才能调试自带的gcc测试代码。。。我现在只能调试example里面的代码,其他路径下的文件都没有设为启动项这个选项

            • Avatar Jeff says:
              Google Chrome 78.0.3904.87 Google Chrome 78.0.3904.87 Windows 10 x64 Edition Windows 10 x64 Edition

              我是自己在WebRTC里新建一个工程,把单元测试代码拷贝过来,然后调试

  2. Avatar Holden says:
    Google Chrome 79.0.3945.88 Google Chrome 79.0.3945.88 Windows 10 x64 Edition Windows 10 x64 Edition

    大佬可不可以解释下这个公式:
    uint32_t send_time_24bits =
    static_cast(
    ((static_cast(info.send_time_ms) << kAbsSendTimeFraction) +
    500) /
    1000) &
    0x00FFFFFF;
    ——————————–
    我看文档上NTP转ABS的公式是:abs_send_time_24 = (ntp_timestamp_64 » 14) & 0x00ffffff
    那开头的那个公式是怎么得出来的?
    而且后18位是数据为,左移18是做什么用的?
    +500/1000是在做向上圆整吗?
    最新的算法不是不适用abs时间了吗,为啥代码中还有使用?

    问题比较多,望大佬答疑解惑!

    • Avatar Jeff says:
      Google Chrome 78.0.3904.70 Google Chrome 78.0.3904.70 Windows 10 x64 Edition Windows 10 x64 Edition

      抱歉,这个新转换公式我也无法解释,查了下,没看到相关文档说明。

留下一个回复

你的email不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.