RTCP 反馈 · NACK / PLI / REMB

除了周期性报告,RTCP 还有一类主动的反馈报文:请求重传(NACK)、请求关键帧(PLI/FIR)、报告估计带宽(REMB)。这一章读 rtcp_packet/ 下的 Nack/Pli/TransportFeedback,讲清 RTPFB 与 PSFB 两大类反馈,它们是让接收端「指挥」发送端的通道。

作者 David更新于 第 39 篇(共 112 篇)

RTCP 反馈 · NACK / PLI / REMB

SR/RR 是周期性的统计报告,但 RTCP 还有一类更主动的报文——反馈(feedback):接收端用它实时指挥发送端「重发那个丢了的包」「给我一个关键帧」「你最多发这么快」。这一章看这些反馈报文,它们是接收端影响发送端行为的通道。

两大类:RTPFB 与 PSFB

RTCP 反馈报文分两大类(RFC 4585),modules/rtp_rtcp/source/rtcp_packet/ 下的类名直接体现了这个分类:

反馈分两类:传输层反馈(RTPFB)和负载相关反馈(PSFB)。

  • RTPFB(Transport-layer Feedback,Rtpfb 基类) —— 和传输有关,不关心媒体内容。典型:NACK(某些序号的包丢了,请重传)、Transport-CC 反馈(报告每个包的到达时间)。
  • PSFB(Payload-Specific Feedback,Psfb 基类) —— 和媒体负载有关,通常是视频特有。典型:PLI / FIR(请求一个关键帧)、REMB(报告接收端估计的最大码率)。

源码里看得清清楚楚(modules/rtp_rtcp/source/rtcp_packet/):

class Nack : public Rtpfb { ... };              // 传输层:请求重传
class TransportFeedback : public Rtpfb { ... }; // 传输层:到达时间反馈
class Pli : public Psfb { ... };                // 负载相关:请求关键帧

分类的意义:RTPFB 是拥塞控制、可靠性的通道,PSFB 是编解码器控制的通道。

三个最重要的反馈

具体到 WebRTC 天天在用的:

反馈类接收端想说发送端的反应
NACKNack(RTPFB)「序号 X 的包我没收到」从历史重传那个包
PLIPli(PSFB)「我解不了了,给个关键帧」让编码器立即产一个关键帧
Transport-CCTransportFeedback(RTPFB)「这些包我在这些时刻收到了」喂给拥塞控制估带宽
  • NACK(下一章细讲)是丢包重传的触发器:接收端发现序号缺了,发 NACK,发送端重发。
  • PLI(Picture Loss Indication) 是视频特有的救命稻草:视频靠帧间预测,一旦丢包导致后续帧解不出(参考帧没了),接收端发 PLI 请求一个不依赖任何历史的关键帧,从它开始重新解码。FIR(Full Intra Request)类似。
  • Transport-CC(第 5 部分详解)是现代拥塞控制的反馈通道,报告每个包的精确到达时间。

REMB 与 Transport-CC:两代带宽反馈

带宽反馈有过两代,读老代码会都见到:

  • REMB(Receiver Estimated Max Bitrate) —— 老方案。接收端自己估算「我这边看能收多快」,通过 REMB(一种 PSFB)把这个数字告诉发送端,发送端照着发。带宽估计在接收端做。
  • Transport-CC —— 新方案。接收端只报原始数据(每个包何时到达),把带宽估计的活儿挪到发送端做(第 5 部分)。发送端信息更全(它知道自己何时发的),估得更准。

从 REMB 到 Transport-CC,是 WebRTC 拥塞控制的一次重要演进:把「估带宽」从接收端搬到了发送端。 为什么?因为发送端同时掌握发送时间和(经反馈得到的)到达时间,能算出精确的单向延迟变化——这是延迟based 带宽估计的核心信号;而接收端只知道到达时间,信息不全。这个「让信息最全的一方做决策」的思路,是分布式系统设计的常见智慧。现代 WebRTC 默认 Transport-CC,REMB 仅作兼容退路。这也是为什么 transport-cc 序号那个头扩展如此关键——它是这套新反馈的载体。

小结与下一章

RTCP 反馈让接收端主动指挥发送端,分两类:RTPFB(传输层,Rtpfb 基类:NACK 请求重传、Transport-CC 报到达时间)和 PSFB(负载相关,Psfb 基类:PLI/FIR 请求关键帧、REMB 报码率)。三个最常用:NACK(重传)、PLI(要关键帧)、Transport-CC(带宽反馈)。带宽反馈从 REMB(接收端估)演进到 Transport-CC(发送端估,信息更全)。

NACK 是可靠性的核心——它触发的重传怎么做?为什么常走独立的 RTX 流?下一章专讲。👉 NACK 与 RTX 重传。

参考资料

  • [1] libwebrtc 源码.modules/rtp_rtcp/source/rtcp_packet/nack.h、pli.h、transport_feedback.h、remb.h(Rtpfb / Psfb 基类)。
  • [2] IETF RFC 4585「RTP/AVPF 反馈」、RFC 5104「Codec Control Messages(PLI/FIR)」。
  • [3] IETF「transport-wide-cc」草案、REMB 草案。

本页目录