WebRTC之丢包重传协议

丢包处理可以使用FEC前向纠错、NACK丢包重传。上一篇文章咱们介绍过前向纠错,现在来探讨丢包重传。首先是接收端发送基于RTCP反馈的请求,发送端收到请求后重传指定packet包。

1、重传包格式

重传包的格式由RTP头、OSN、原始payload数据组成。OSN表示原始序列号,如下图所示:

2、重传包RTP头

重传包的时间戳必须与原始包保持一致。如果原始包的RTP头有扩展字段,那么重传包也必须携带相同的扩展字段。如果原始包包含padding填充数据,那么重传包应该移除padding填充数据或者把padding标志位置为1。

3、重传与原始stream关系

在session多路复用的场景,重传stream和原始stream共享同一个session会话。另外,重传stream和原始stream共享同一个CNAME。

4、重传请求

NACK通过rtcp-fb反馈消息,由接收端发起的重传请求。发送重传请求之前,接收端应该考虑带宽、延时、媒体包类型等因素。除了重传请求,接收端还应该发送RR(Receiver Report)来报告RTT延时。接收端在检测到丢包时不应该马上发送丢包重传请求,而是加上延时来补偿重排序的包。

丢包重传的类型如下(不仅限于):

  • FIR:请求关键帧,对应PT=192;
  • NACK:否定应答,对应PT=193;
  • RTPFB:rtp丢包重传,对应PT=205;
  • PSFB:指定payload重传,对应PT=206;

其中,PSFB又包括PLI、SLI、RPLI,具体如下:

PLI:Picture Loss Indication,视频帧丢失标识;

SLI:Slice Loss Indication,片段丢失标识;

RPSI:Reference Picture Selection Indication,参考帧选择标识;

对应的rtcp报文格式如下,PT表示载荷类型,FCI表示反馈控制信息:

不同PT的报文有不同的FCI。以NACK报文为例,包含PID和BLP。其中PID为丢包序号,BLP为连续16个包的丢失状态。描述如下:

5、拥塞控制

RTP重传包会增加网络拥塞的风险。因此,重传包应该在原始包基础上降低码率。另外,发送端可以选择性重传,对重要的packet包进行重传,对优先级高的优先重传,不重要的packet包可以忽略NACK消息。

6、SDP协议映射

丢包重传使用到SDP的协议说明如下:

  • MIME类型:video、audio、text、application,在SDP中用"m="作为媒体名称;
  • MIME子类型"rtx",在SDP的"a=rtpmap"进行描述;
  • AVPF特定参数ack和nack,在SDP的"a=rtcp-fb"进行描述;
  • 重传包的参数apt和rtx-time,在SDP的"a=fmtp"进行描述,以键值对的形式出现;

以MPEG-4码流为例,对应的重传会话如下:

7、缓存控制

重传包不应该进行缓存 。在session多路复用的场景,"Cache-Control"应该设为"no-cache"。

### WebRTC 协议详解 #### 一、WebRTC 的传输层协议选择 WebRTC 主要依赖于 UDP 而不是 TCP 来实现实时音视频通信。这是因为虽然 TCP 提供了可靠的传输服务并确保数据的完整性和顺序性[^1],但在遇到网络拥塞或丢包的情况下,TCP 的重传机制会显著增加延迟,这对于实时应用来说是不可接受的。 相比之下,UDP 不提供可靠性保障,也不保证数据包按序到达,但这正是其优势所在——低延迟特性使得 UDP 更适合处理对时间敏感的数据流,如语音和视频通话中的媒体流[^3]。 #### 二、信令机制概述 值得注意的是,WebRTC 自身并不规定具体的信令协议;相反,它允许开发人员根据应用场景灵活选用不同的信令方案。常见的选项包括 WebSocket、HTTP 长轮询/SSE (Server-Sent Events),以及 SIP 和 XMPP 这样的专用通讯协议[^2]。这些信令方法主要用于交换必要的元数据信息,比如 SDP(Session Description Protocol),以便两端设备能够协商一致建立连接。 #### 三、RTP/RTCP 在 WebRTC 中的作用 为了有效地管理和优化多媒体流量,在 WebRTC 架构内部采用了 RTP(Real-time Transport Protocol)及其控制协议 RTCP (RTP Control Protocol)。其中,RTP 承担着实际承载音频视频编码后的比特流的任务,并通过特定字段标记每帧的时间戳、序列号等重要属性,从而支持接收端完成解码播放操作。与此同时,RTCP 则定期发送反馈报告给发送方,帮助监测当前链路质量状况,进而调整参数以维持最佳用户体验[^4]。 ```cpp // 示例:定义一个简单的 RTP 头部结构体 struct RtpHeader { uint8_t version : 2; // 版本号 uint8_t padding : 1; uint8_t extension : 1; uint8_t csrc_count : 4; uint8_t marker : 1; uint8_t payload_type : 7; uint16_t sequence_number; uint32_t timestamp; uint32_t ssrc; // 同步源标识符 }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐福记456

您的鼓励和肯定是我创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值