1. 概述
WebRTC使用SR/RR
包来计算rtt的
SR
报文格式:
RR
报文格式:
2. 相关代码
RTCPSender::BuildSR
RTCPSender::BuildRR
RTCPSender::SendCompoundRTCP
RTCPReceiver::HandleReceiverReport
RTCPReceiver::HandleReportBlock
3. 探测流程
主要流程如下图所示:
名词解释:
- LSR: 最近一次SR包的NTP时间戳(remote_sender_ntp_time_);LSR由NTP秒(second)低16位和毫秒(fraction)高16位组合而成;
- DLSR: 最近一次收到SR包到打包Report Block包的间隔.
探测流程:
- 发送端构造和发送SR包,携带发送时间戳
LSR
; - 接收端接收到最新的SR之后,使用
last_received_sr_ntp_
字段记录当前ntp时间戳; - 接收端构造RR包,设置DLSR字段为
当前ntp时间戳 - last_received_sr_ntp_
,之后发出RR包; - 发送端在接收到RR包之后,记录RR包到达时间
now_ntp
; - 计算rtt:
now_ntp - LSR - DLSR
SR和RR包的数量并不需要完全相同,它们之间并不是一一对应的关系,而是相互独立发送的,各自按照自己的发送节奏发送数据.
即使SR或者RR丢失了一部分,只要发送端接收到过RR,它总能计算出rtt,因为发送端只需要一次RR包中的LSR和DLSR字段就能够算出一次rtt.
4. 更新流程
由上一步得到的rtt值会被传递到CallStats
中进行定时更新操作(CallStats::Process
), 时间间隔为1s(kUpdateIntervalMs
).
一次处理流程CallStats::Process
为:
RemoveOldReports
移除1.5s之前的旧的rtt数据;- 计算最近1.5s之内的rtt平均值和最大值;
- 如果最大值和平均值都是非负数,那么便认为rtt合法;
- 以平均rtt值和之前的旧的值做一个加权(3:7)作为最终的rtt计算值,通知所有观察者.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2021-07-13 FFmpeg 框架详解
2020-07-13 SOAP协议和基于SOAP的开发流程详述
2020-07-13 linux中export与source的作用
2020-07-13 如何让bat文件已管理员身份运行
2017-07-13 用实例分析H264 RTP payload
2017-07-13 H264(NAL简介与I帧判断)
2017-07-13 H264的RTP负载打包的数据包格式,分组,分片