webrtc的丢包重传rtcp包的解析

    webrtc的丢包重传的核心实现在nack.cc中,其实现的原理为rfc 4585协议。rfc 4585协议定义了 Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/AVPF),即实时的rtcp的反馈,来反映丢包信息,而其中的PID和BLP信息,可以充分的利用rtp的sequence号是short的信息,将17个连续包的丢包信息反映出来。

例如以下的rtcp的nack报文:

   Real-time Transport Control Protocol (Generic RTP Feedback): NACK: 2 frames lost: NACK: 2 frames lost: NACK: 1 frames lost
    10.. .... = Version: RFC 1889 Version (2)
    ..0. .... = Padding: False
    ...0 0001 = RTCP Feedback message type (FMT): Generic negative acknowledgement (NACK) (1)
    Packet type: Generic RTP Feedback (205)
    Length: 5 (24 bytes)
    Sender SSRC: 0x00123456 (1193046)
    Media source SSRC: 0x00c0ffed (12648429)
    RTCP Transport Feedback NACK PID: 10
    RTCP Transport Feedback NACK BLP: 0x0200 (Frames 20 lost)
    RTCP Transport Feedback NACK PID: 30
    RTCP Transport Feedback NACK BLP: 0x0200 (Frames 40 lost)
    RTCP Transport Feedback NACK PID: 50
    RTCP Transport Feedback NACK BLP: 0x0000 (No additional frames lost)

其中,丢包为10,20,30,40,50。用3个int可以表示清楚,用rfc 4585的通用协议表示如下:

  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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            PID                |             BLP               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

以上面的例子说明,PID为10,表示sequence为10的包,BLP的第10位为1,表示10之后第10个包,即sequence num为20的包,所以一个int可以表示17个连续包的丢包情况。


你可能感兴趣的