#1898·mediasoup

修复下行链路 FEC 速率计算因未恢复的上行链路包丢失而受到污染

作者: RTC-Kai创建于 2026年9月2日更新于 2026年9月17日
标签feature

背景

在 mediasoup 的 SFU 架构中,用于驱动 FEC 多余的下行链路丢失分数来自下行链路用户向服务器发送的 RTCP 接收器报告。该报告反映了 mediasoup 将数据包转发给用户后的数据包丢失情况。
然而,mediasoup 传输的数据包来自发布者发送的上行链路 RTP 流。如果上行链路上丢失了数据包且未恢复(例如,NACK 失败),mediasoup 根本没有数据包可传输 — 这些序列号从未发送到下行链路。

问题

下行链路 RR 的 fractionLost 和 totalLost 由用户根据接收到的序列号间隔计算。当 mediasoup 跳过一个序列号,因为上行链路的数据包从未收到时,用户会看到一个间隔并将其计为丢失 — 与真实的下行链路丢失无异。

这意味着,传递到 UpdateProtectionParameters() 在 RtpStreamSend 中的 fractionLost 会被上行链路丢失所扩大:

  • packetsLost = report->GetTotalLost();
  • fractionLost = report->GetFractionLost(); // ← 包含上行链路丢失污染

后果

  • 对于上行链路丢失,FEC 多余会被增加,而 FEC 在下行链路上无法修复
  • 下行链路 FEC 数据包消耗带宽,但对来自上行链路的间隔没有任何恢复效益

内容来源: versatica/mediasoup