webrtc代码走读二十四(RTT延时计算)

本文详细介绍了WebRTC中计算往返时延(RTT)的两种方法:基于媒体流发送端和接收端的计算。发送端通过SenderReport(SR)和ReceiverReport(RR)协议来计算,而接收端则利用ReceiverReferenceTimeReportBlock和DLRRReportBlock。在某些场景下,接收端不发送SR,因此引入了基于RTCP XR的计算方式。RTT计算涉及的关键参数包括NTP时间戳、lastSR和DLSR。通过接收端的RR报文和发送端的SR报文,可以精确地获取RTT值。

一、概述

WebRTC中有两种方式计算RTT:
基于媒体流发送端的计算。通过Sender Report(SR)和Receiver Report(RR)携带的信息计算。
基于媒体流接收端的计算。通过RTCP Extended ReportsRTCP(XR)携带Receiver Reference Time Report Block和DLRR Report Block的信息。
两种方式计算RTT的原理一样。引入XR计算方式,因为在一些场景,两个端点间一个只发媒体数据,一个只接收,这种场景下接收端不会发送SR,导致无法计算RTT。于是扩展了RTCP XR在接收端计算这种方式。

WebRTC是在RTCPReceiver::OnPeriodicRttUpdate获取RTT延时参数的。当该侧客户端在发送数据的时候,获取根据基于媒体流发送端计算的值。当该客户端仅接收媒体数据,才获取基于媒体流接收端计算的值。

 二、基于媒体流发送端的计算 

delay Since Last SR = T22 - T21

RTT = T12 - T11 - (T22 - T21)

RTT = T12 - T11 - Delay Since Last SR

发送端需要打包Sender Report(SR),解析处理Receiver Report(RR)协议。

1、Sender Report(SR)协议

NTP timestamp:64bits。记录着发送该SR的NTP时间戳。

wireshark示例如下:

这里发送端发送的SR报文中NTP时间是:0xe9f144e7 0x0d601cd3 

RTCPSender::BuildSR代码实现如下: 

 

 2、Receiver Report(RR)协议

last SR(LSR): 32 bits。64位NTP时间戳中间的32bit(NTP时间戳指绝对时间,相对1900年1月1日00:00:00经历的时间,单位为秒。完整NTP时间戳用64bits表示,左半32bits表示整数,右半32bits表示小数,一般为了紧凑,取中间32bits表示即可,这时整数与小数分别16bits表示)。记录着上次源SSRC_n发送SR的NTP时间,从收到的SR记录的NTP时间戳获取。如果没有收到SR,值为0。

如上面发送端发送的SR报文中NTP时间是:0xe9f144e7 0x0d601cd3,那么接收端发送的RR报文的last SR就应该是0x44e70d60


delay since last SR (DLSR): 32 bits。以1/65536(2^16)秒为单位。记录着上次接收到源SSRC_n发送的SR到当前发送RR的间隔时间。如果没有收到SR,值为0。 

wireshark示例如下:

  •   媒体接收端封装RR报文
PlatformThread::StartThread(void * param) 
->PlatformThread::Run() 
->ProcessThreadImpl2::Run(void * obj)
->ProcessThreadImpl2::Process() 
->ModuleRtpRtcpImpl2::Process() //配置周期发送RTCP的RR报文TimeToSendRTCPReport&SendRTCP
->RTCPSender::SendRTCP
->RTCPSender::ComputeCompoundRTCPPacket
->RTCPSender::BuildRR
->RTCPSender::CreateReportBlocks

接收端发送RTCP的RR报文,是周期发送。 last SR为接收端收到的最后一次RTCP SR报文的NTP时间戳。

 

  •  媒体发送端解析计算RTT值
ModuleRtpRtcpImpl2::IncomingRtcpPacket
->RTCPReceiver::IncomingPacket
->RTCPReceiver::IncomingPacket
->RTCPReceiver::ParseCompoundPacket
->RTCPReceiver::HandleReceiverReport
->RTCPReceiver::HandleReportBlock

RTCPReceiver::HandleReportBlock函数获取发送端的当前NTP时间,然后再从RR报文中提取出last_sr、delay_since_last_sr就可以计算出RTT延时时间。

三、基于媒体流接收端的计算

1、Receiver Reference Time Report Block 

 

wireshark示例:

  2、DLRR Report Block

wireshark示例:

接收端在RTCPReceiver::HandleXrDlrrReportBlock函数计算RTT延时。 

 

 参考:

WebRTC研究:统计参数之往返时延 - 剑痴乎

### WebRTC 中的 RTT 计算方法 WebRTC 中的往返时间(Round-Trip Time, RTT计算主要依赖于 RTCP 协议中的接收端报告(Receiver Report, RR)和发送端报告(Sender Report, SR)机制。RTT 是通过在 SR 中记录 NTP 时间戳,并在 RR 中记录接收 SR 的时间戳计算的。发送端通过比较 SR 的发送时间与 RR 的接收时间,可以准确估算出 RTTRTT 计算的核心思想是将 SR 数据包中的 NTP 时间戳与 RR 数据包中对应的接收时间戳进行比较。具体而言,SR 数据包中包含了一个 64 位的 NTP 时间戳,表示该 SR 数据包的发送时间;RR 数据包则包含了一个 32 位的接收时间戳,表示接收 SR 数据包的时间。发送端收到 RR 后,将当前时间与 SR 中的 NTP 时间戳进行差值计算,从而得到 RTT 估计值[^2]。 以下是一个简化的 RTT 计算逻辑示例: ```cpp void RtcpRttStats::OnFeedbackTimestamp(uint32_t received_ntp_time, uint32_t send_ntp_time) { // 计算 RTT,即当前时间与 SR 中 NTP 时间戳的差值 int64_t rtt = (received_ntp_time - send_ntp_time); // 更新最小 RTT 和平均 RTT min_rtt_ = std::min(min_rtt_, rtt); total_rtt_ += rtt; rtt_samples_.push_back(rtt); } ``` 在实际应用中,WebRTC 会对 RTT 进行平滑处理,以减少网络抖动带来的影响。通常采用指数加权移动平均(EWMA)算法来平滑 RTT 测量值。这种方法可以有效降低 RTT 波动对拥塞控制的影响,提高网络稳定性。 RTT计算还涉及到一些额外的优化策略,例如维护最小 RTT(min_rtt)和 RTT 变化趋势(rtt_delta)。最小 RTT 通常用于 BBR 拥塞控制算法中,作为估算带宽的基准值。RTT 变化趋势则用于检测网络拥塞状态,当 RTT 显著增加时,可能表示网络出现拥塞[^4]。 此外,RTT 计算不仅用于拥塞控制,还广泛应用于 QoS 调整、FEC 冗余控制以及码率估计等模块。例如,在 FEC 控制器中,RTT 用于决定 FEC 冗余包的生成比例,以适应不同的网络延迟特性[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值