webrtc代码走读二十四(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研究:统计参数之往返时延 - 剑痴乎

<think>好的,用户想了解如何使用Wireshark分析TCP RTT的IO图表。我需要先回忆一下Wireshark的相关功能,尤其是IO图形工具的使用。首先,IO Graphs是Wireshark的一个内置工具,位于Statistics菜单下。用户可以通过它生成各种流量相关的图表,比如每秒报文数、字节数或者特定的过滤条件的数据。 接下来,用户提到的TCP RTT,也就是往返时间,这通常涉及到tcp.analysis.ack_rtt这个过滤字段。根据引用[3],tcp.analysis.ack_rtt用于衡量抓取的TCP报文与相应ACK之间的时间间隔,如果时间较长可能表示网络延迟。因此,在IO图形中需要用到这个过滤条件。 然后,我需要一步步指导用户如何操作。首先,打开IO Graphs界面,设置正确的过滤表达式,比如使用“tcp.analysis.ack_rtt”作为过滤条件。然后调整Y轴的单位,可能需要选择“Advanced”来显示具体的RTT数值,单位通常是秒或者毫秒。 另外,引用[4]提到,默认的X轴是1秒间隔,Y轴是报文数,但这里需要的是RTT的值,所以用户需要更改Y轴的单位为“Sum”或者其他合适的统计方式。可能需要解释不同的统计方式,比如Avg、Max等,来帮助用户理解如何展示RTT的变化趋势。 还有,用户可能需要知道如何通过点击图表查看具体时间点的报文细节,这在引用[4]中也有提到。这部分需要提醒用户,方便他们深入分析特定时间点的网络问题。 最后,生成相关问题的时候,应该围绕TCP RTT分析的其他方面,比如如何识别延迟原因、其他相关过滤项以及如何导出数据等。需要确保问题与主题相关,帮助用户进一步探索。 检查是否有遗漏的步骤,比如是否需要在过滤器中正确应用显示过滤器,或者在调整Y轴时是否需要选择特定的统计方法。同时,确保引用的正确使用,每个步骤末尾添加对应的引用标记。</think>### 分步说明:使用 Wireshark 分析 TCP RTT 的 IO 图表 1. **打开 Wireshark 并加载抓包文件** - 启动 Wireshark,选择需要分析的抓包文件(`.pcap` 或 `.pcapng` 格式)。 - 确保抓包文件包含 TCP 流量(如文件传输、HTTP 下载等场景)[^4]。 2. **进入 IO Graphs 工具** - 点击菜单栏的 `Statistics` → `IO Graphs`,打开 IO 图形工具界面[^1]。 3. **配置 RTT 相关过滤条件** - **过滤器语法**:在图形界面下方的过滤栏中输入 `tcp.analysis.ack_rtt`,该字段表示 TCP 确认报文的往返时间[^3]。 - **单位设置**:点击右侧的 `Unit`,选择 `Y Axis` 为 `Advanced`,并在 `Calc` 中选择统计方式(如 `AVG(*)` 计算平均 RTT,`MAX(*)` 显示最大 RTT)。 - **示例配置**: ``` Filter: tcp.analysis.ack_rtt Unit: Y Axis=Advanced, Calc=AVG(*) ``` 4. **调整图表参数** - **时间范围**:通过修改 `X Axis` 的间隔(如 0.1 秒)细化时间粒度,更精准观察 RTT 波动[^4]。 - **多图形对比**:可添加多个过滤条件(如不同 TCP 流的 RTT),通过颜色区分,对比不同连接的延迟情况[^4]。 5. **分析图表特征** - **正常 RTT**:平稳低值(如几十毫秒)。 - **异常 RTT**:突增高值或持续波动,可能由网络拥塞、报文丢失引起。 - **关联报文**:双击图表中的峰值点,自动定位到对应报文,进一步分析具体原因(如重传、乱序)。 6. **导出数据(可选)** - 点击 `Save` 导出图表为 CSV/PNG 格式,用于报告或进一步分析。 --- ### 示例场景 若分析 HTTP 下载时的 RTT 突增: 1. 过滤 `tcp.analysis.ack_rtt` 并设置 `MAX(*)`。 2. 发现某时间点 RTT 超过 500ms,双击定位到该时间段的报文。 3. 检查对应报文是否出现 `TCP Retransmission` 或 `Duplicate ACK`,确认丢包原因[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值