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个连续包的丢包情况。