NACK用于通知丢了哪些包, 通讯双方的接收方通过NACK将没有接收到的包的sequence Number发送给发送方.
RTX用于重传丢失的包, 发送方收到对方发来的NACK消息后就会在自己的发送记录中找到丢失包, 使用新的payload type、新的SSRC、新的seqNumber重新发送一遍.
没有RTX, 同样可以实现重传丢失的包.
NACK/RTX的工作机制
-
NACK和RTX的使用与否是在媒体协商的时候确定的
-
SDP中会包含编解码的payloadtype, 以及关联RTX的payload type
-
payload type是96
-
支持NACK、RTX
-
RTX97 是payload type96 的重传流
-
接收端收到Seq number不连续 有两种情况
-
没有丢包, 只是UDP特性导致包乱序了
-
发生了丢包
-
丢包后, 接收端会通过RTCP的RTPFB nack消息将一段时间内的丢包seqnumber发给发送端
-
发送端收到NACK消息会在自己的发送历史中找到对应的包, 通过RTX类型的RTP发送给对端
-
接收端收到RTX数据后, 首先到丢包队列里判断收到的是否丢失的包, 是的话将丢失的包的seq Number从丢失队列中移除
NACK / RTX涉及到的几个问题
-
如何判断是否发生了丢包?
-
通过seqnumber是否连续来判断
-
NACK什么时候发送?
-
NACK的格式是怎样的, 发送端收到NACK时如何处理?
-
RTX格式是怎样的, RTX与NACK如何配合?
-
没有RTX能否实现丢包重传?
-
可以, 很多流媒体服务器不支持RTX, 如何做到, 待续...