博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebRTC 中RTT实现方法
阅读量:4363 次
发布时间:2019-06-07

本文共 2434 字,大约阅读时间需要 8 分钟。

RTT(Round-Trip Time): 往返时延。在计算机网络中它是一个重要的性能指标,表示从发送端发送数据开始,到发送端收到来自接收端的确认(接收端收到数据后便立即发送确认),总共经历的时延。

一般认为单向时延=传输时延t1+传播时延t2+排队时延t3

t1是数据从进入节点到传输媒体所需要的时间,通常等于数据块长度/信道带宽

t2是信号在信道中需要传播一定距离而花费的时间,等于信道长度/传播速率(光纤中电磁波的传播速率约为2*10^5 km/s,铜缆中2.3*10^5 km/s)

t3可笼统归纳为随机噪声,由途径的每一跳设备及收发两端负荷情况及吞吐排队情况决定(包含互联网设备和传输设备时延)

综上:时延并无标准值只有经验值。某运营商规定网内路由器间时延1000公里之内<=40ms,2000公里之内<=60ms,3000公里之内<=80ms


如果我们自己来设计一个计算网络时延的算法的话,我们可以这样处理。


大写S代表发送时间,R代表接收时间,D代表延时

                             S(a0)

A------------------------------------------------------ > B  R( b0)


                        S(a0)  D(b0)

A<--------------------------------------------------------B   D(b0) = S(b0) - R(b0)


1,A先发一个数据包,在本地记录下发送时间 S(a0),并把 S(a0)放在数据包中发给B

2,B收到数据包,在本地记录下数据接收时间R( b0),并把数据包发回A,发送时把本地处理延时时间

   D(b0)也记录到数据包中,D(b0) = S(b0) - R(b0)

3,A收到B的回应后,记录到数据接收时间R(a0)

4, rtt = R(a0)  - S(a0) - D0


RTCP中如何计算Rtt


rtcp协议中计算rtt主要依赖发送者报告(SR)和接收者报告(RR)

原理和上面我们自己设计的协议一样。

A先发一个发送者报告给B,上图中的S(a0)在发送者报告中用NTP TimeStamp表示,占用8个字节

B再给A回一个接收者报告,数据包中带上S(a0)和D(b0),在接收者报告中分别用 LSR和DLSR表示

LSR和DLSR都是四个字节。

在这里有一个要注意的地方,SR中时间是8个字节,RR中LSR是四个字节,哪他们如何对应起来呢?

在WebRTC代码中处理如下:


bool ModuleRtpRtcpImpl:
astReceivedNTP(

    uint32_t* rtcp_arrival_time_secs,  // When we got the last report.

    uint32_t* rtcp_arrival_time_frac,

    uint32_t* remote_sr) const {

  // Remote SR: NTP inside the last received (mid 16 bits from sec and frac).

  uint32_t ntp_secs = 0;

  uint32_t ntp_frac = 0;

  //部rtcp接收方要最新的发送者报告时间

  if (!rtcp_receiver_.NTP(&ntp_secs,

                          &ntp_frac,

                          rtcp_arrival_time_secs,

                          rtcp_arrival_time_frac,

                          NULL)) {

    return false;

  }

  //因为计算Rtt精确度到毫秒级别就够了,这里把ntp_secs年,月,日这些时间都去掉了,因为rtt不可能达到小时级别的延时,把ntp_frac中毫秒精度以下的也全去掉了

  *remote_sr =

      ((ntp_secs & 0x0000ffff) << 16) + ((ntp_frac & 0xffff0000) >> 16);

  return true;

}


WebRTC中如何计算Rtt

//初始化rtt为0

  int64_t rtt_ms = 0;

  //上一次发送者报告时间

  uint32_t send_time = report_block.last_sr();

  if (!receiver_only_ && send_time != 0) {

   //接收方处理延时

    uint32_t delay = report_block.delay_since_last_sr();

   //当前时间,转换成四字节

    uint32_t receive_time = CompactNtp(NtpTime(*_clock));


    // RTT in 1/(2^16) seconds.

    uint32_t rtt_ntp = receive_time - delay - send_time;

    // 转换成毫秒级别的时间

    rtt_ms = CompactNtpRttToMs(rtt_ntp);

    if (rtt_ms > report_block_info->max_rtt_ms)

      report_block_info->max_rtt_ms = rtt_ms;


    if (report_block_info->num_rtts == 0 ||

        rtt_ms < report_block_info->min_rtt_ms)

      report_block_info->min_rtt_ms = rtt_ms;


    report_block_info->last_rtt_ms = rtt_ms;

    report_block_info->sum_rtt_ms += rtt_ms;

    ++report_block_info->num_rtts;

  }

转载于:https://www.cnblogs.com/onlycoder/p/7297351.html

你可能感兴趣的文章
前端进阶路线图
查看>>
血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息
查看>>
CMS垃圾收集器
查看>>
数学之路-python计算实战(14)-机器视觉-图像增强(直方图均衡化)
查看>>
cocos2d-x3.0 相对布局(一)
查看>>
python socket编程实现的简单tcp迭代server
查看>>
Bdsyn百度手机助手是何物,它是怎样神不知鬼不觉地安装到你的电脑里的?
查看>>
再谈angularjs DI(Dependency Injection)
查看>>
python 多文件知识
查看>>
转载:glut.h 与 stdlib.h中 的exit()重定义问题的解决
查看>>
UVA 10004 - Bicoloring
查看>>
数据值、列类型和数据字段属性
查看>>
职业规划
查看>>
JavaScript设计模式 Item 3 --封装
查看>>
一段个性化stringgrid的代码
查看>>
wx.ScrolledWindow wx.PseudoDC
查看>>
莫比乌斯反演
查看>>
【BZOJ】【1041】【HAOI2008】圆周上的点
查看>>
高并发常见面试题
查看>>
java面向对象中的抽象,类与对象
查看>>