WebRTC服务质量(01)- Qos概述
WebRTC服务质量(02)- RTP协议
WebRTC服务质量(03)- RTCP协议
WebRTC服务质量(04)- 重传机制(01) RTX NACK概述
WebRTC服务质量(05)- 重传机制(02) NACK判断丢包
WebRTC服务质量(06)- 重传机制(03) NACK找到真正的丢包
WebRTC服务质量(07)- 重传机制(04) 接收NACK消息
WebRTC服务质量(08)- 重传机制(05) RTX机制
WebRTC服务质量(09)- Pacer机制(01) 流程概述
WebRTC服务质量(10)- Pacer机制(02) RoundRobinPacketQueue
WebRTC服务质量(11)- Pacer机制(03) IntervalBudget
WebRTC服务质量(12)- Pacer机制(04) 向Pacer中插入数据
一、前言:
RTX协议(Retransmission,即重传协议)是 WebRTC 中用于处理丢包恢复的一部分。由于网络通信中的丢包不可避免,WebRTC RTP协议栈支持多种丢包恢复机制,其中之一便是通过RTX协议实现的重传机制。
RTX协议会根据 RTP 丢包检测机制(具体由 RTCP 的 NACK 包触发),将数据包重传给接收端。RTX 的核心思想是发送端将丢失的数据包重新封装并发送,而接收端根据识别重新封装的数据包进行补偿处理,从而还原完整的流媒体内容。
二、RTX协议的工作原理:
RTX 的工作紧密依赖于 RTP 和 RTCP 协议。以下是 RTX 的通信流程:
- 发送端发送数据包: 发送端按照 RTP 协议发送音视频流,每个 RTP 数据包都有唯一的序列号(
sequence number
),用于接收端检测是否丢包。 - 接收端检测丢包: 接收端通过接收 RTP 包的序列号,以及 RTP/RTCP 的统计信息,检测数据是否丢失。一旦丢包,接收端会发送 RTCP NACK(Negative Acknowledgment)反馈包给发送端,并指定丢失数据包的序列号。
- 发送端重新发送丢失的数据包: 发送端根据接收到的 RTCP NACK 请求,使用 RTX 流重传对应的丢失数据包。RTX 流不同于主流(primary stream),通常会有独立的 SSRC(Synchronization Source Identifier)用于区分两者。
- 接收端合并重传包: 接收端接收到 RTX 包后,根据 RTX 的特殊封装格式提取出原始 Payload(数据载荷)并通过序列号将其合并到主流中。
RTX 的核心点在于:
- 独立的 SSRC:RTX 使用独立的 SSRC,和主流区分开,这样可以识别重传流。
- 修改过的 RTP 包头:RTX 包在 RTP 层修改了一些元信息,用于兼容重传流和主流的处理。
- RTX包有自己的payload type
- RTX包是按照自己的Sequence Number进行排序的。
三、如何找到RTX包:
- 找到Offer/Answer这种SDP信息。
- 从SDP中找到RTX的SSRC。
- 然后抓包,根据SSRC过滤出RTX包。
四、RTX协议格式:
- RTP Header:和前面介绍协议时候的RTP Header是一样的;
- OSN:重传的是哪个原始数据的序列包,注意我们RTX属于RTP协议,这儿的Original指的是RTP包;
- 可以看出RTX就是普通的RTP协议加了2字节的OSN,注意不是RTCP;
五、抓取RTX包:
5.1、获取本机的RTX流:
看看RTX的seq:
seq独立可以更好的统计出丢包。
5.2、看看原始流哪些包丢失了:
BLP是0x0001。知道BLP是什么吗?
1)NACK PID和NACK BLP:
1)概念:
在 NACK 中,NACK PID 和 NACK BLP 是两个关键的字段,用于标识和管理需要重传的数据包。
- NACK PID:NACK PID(Packet ID)是 NACK 报文中的一个字段,用于指示需要重传的丢失数据包的序列号。当接收端检测到数据包丢失时,会发送 NACK 报文,其中 NACK PID 指示了具体丢失的数据包的序列号。
- NACK BLP:NACK BLP(Bitmask of Lost Packets)是 NACK 报文中的另一个字段,用于指示一连串连续丢失的数据包。NACK BLP 是一个比特掩码,每个比特位对应一个数据包序列号,用于表示一段连续的丢失数据包范围。
2)举个例子:
假设在一个 WebRTC 实时通信会话中,发送端发送了一系列 RTP 数据包给接收端,序列号分别为 10、11、12、13、14、15。接收端在接收过程中发现数据包 11 和 13 丢失了。接收端会发送 NACK 报文给发送端,请求重传这两个丢失的数据包。
在这个例子中,NACK 报文中的 NACK PID 和 NACK BLP 可能会被设置如下:
- NACK PID:11, 13
- NACK PID 指示需要重传的具体丢失数据包的序列号,即数据包 11 和数据包 13。
- NACK BLP:010010
- 在这个二进制掩码中,每个比特位对应一个数据包序列号。接收端标记了丢失的数据包范围,从 10 到 15 中的第 2 和第 4 个数据包丢失。
- 这表示数据包