首页 > 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
管理员——代码为剑,如痴如醉

9 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

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

  3. Pingback: WebRTC研究:Trendline滤波器-TrendlineEstimator | 剑痴乎

留下一个回复

你的email不会被公开。

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