xjs.xjtu

LearningWebRTC: NACK(Negative ACKnowledgement)

Overview

NACK(Negative ACKnowledgement)在RTT较小时,非常有效的抗丢包策略。

由于本文涉及很多包的往复,因此用编码端代表RTP发送方,解码端代表RTP接收方。

nack_overview

NACK Request是Payload Type为PT_RTPFB=205的RTCP包,一般与其他RTCP包打在一起,称为一个RTCP compound包。

    enum RTCPPT
    {
        PT_IJ    = 195,
        PT_SR    = 200,
        PT_RR    = 201,
        PT_SDES  = 202,
        PT_BYE   = 203,
        PT_APP   = 204,
        PT_RTPFB = 205,
        PT_PSFB  = 206,
        PT_XR    = 207
    };

一个只包含NACK Request的RTCP包的格式如下,PID表示丢包的SN,BLP为SN之后16个RTP包丢包的bit mask。 其他字段的含义参考RFC4588 6.2.1. Generic NACK

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |V=2|P|  FMT=1  | PT=205(RTPFB) |          length in 32bit - 1  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                  SSRC of this packet sender                   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                  SSRC of media source                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            PID1               |            BLP1               |
   |            PID2               |            BLP2               |
   : ....                                                          :

NACK Response为重发的RTP包,可以与原来的RTP一模一样,但这样会影响接收端丢包率的计算、以及拥塞控制的带宽估计,因此,一般会按照RFC4588,增加一个RTX Header。

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         RTP Header                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | OSN(original sequence number) |                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
   |                  Original RTP Packet Payload                  |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

编码端实现细节

细节:RTP History保留多久的历史包?

细节:FEC包是否会缓存重发?

解码端实现细节

细节:哪种包算丢了,应该insert到NACK list里?

细节:多久发一次NACK Request?

细节:某个包在Encoder可能就没有(Encoder可能是中转服务器),怎么防止NACK Request一直包含这个包?

细节:如何防止NACK Response导致Encoder上行拥塞,从而导致更加恶劣的丢包?

细节:NACK对音视频同步、视频render time的影响?

参考


xjs.xjtu@gmail.com

2017-07-16