丢包重传NACK与RTX - 概述

372 阅读1分钟

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, 如何做到, 待续...