• 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"。

  • 相关阅读:
    Linux系统tcp连接设置
    图论学习笔记 - 二分图的匹配
    卷积神经网络梯度消失,神经网络中梯度的概念
    刷题记录(NC202589 魔法数字,NC235247 Sramoc问题)
    "树形List"与"扁平List"互转(Java实现)
    电力电子转战数字IC20220819day64——uvm实战1A
    【C++】string类的介绍与使用
    112页5万字交通大数据服务平台建设方案(word)
    ZYNQ之FPGA学习----Vivado功能仿真
    c语言基础知识帮助理解(函数递归详解)
  • 原文地址:https://blog.csdn.net/u011686167/article/details/133218946