WebRTC关于UPD丢包、乱序和抖动等问题解决策略
hyr editou esta página 4 months atrás
  • WebRTC 优先使用 UDP 进行音频、视频和数据的传输,因为它具有较低的延迟和较高的传输效率。
  • 在某些网络环境中,如果 UDP 不可用,WebRTC 可以回退到使用 TCP 进行传输。
  • WebRTC 使用 ICE 框架来收集候选地址、进行连接检查,并选择最佳的传输路径和协议。

UDP延时比TCP低的原因:

  1. 无连接性:UDP是无连接的协议,这意味着在发送数据之前不需要建立连接。TCP在发送数据之前需要进行三次握手来建立连接,这增加了初始延时。
  2. 无状态性:UDP不维护连接状态,也不需要进行流量控制和拥塞控制。TCP需要维护连接状态、进行流量控制和拥塞控制,这些操作会增加处理时间和延时。
  3. 头部开销小:UDP的头部较小,只有8字节,而TCP的头部至少有20字节。较小的头部意味着更少的数据需要处理和传输,从而减少了延时。
  4. 无确认机制:UDP不提供确认机制,不需要等待接收方的确认包。TCP需要等待接收方的确认包来确保数据已经成功接收,这会增加延时。

由于UDP的设计特点,会面临丢包和乱序的问题:

丢包:UDP不提供重传机制,如果数据包在传输过程中丢失,发送方不会重传这个数据包。应用层需要自己处理丢包问题。 乱序:UDP不保证数据包的顺序,数据包可能会以不同的顺序到达接收方。应用层需要自己处理数据包的排序问题。

WebRTC 使用多种技术和协议来处理 UDP 传输中的丢包和乱序问题,确保音频和视频数据的可靠传输和高质量的实时通信体验。以下是 WebRTC 处理丢包和乱序的主要机制:

1. RTP/RTCP(Real-time Transport Protocol / RTP Control Protocol)

  • RTP:WebRTC 使用 RTP 协议来传输音频和视频数据。RTP 是一种专为实时传输设计的协议,具有以下特性:

    • 序列号:每个 RTP 数据包都有一个序列号,用于检测和重排乱序的数据包。
    • 时间戳:每个 RTP 数据包都有一个时间戳,用于同步音频和视频流。
  • RTCP:RTCP 是 RTP 的控制协议,用于监控数据传输的质量和统计信息。RTCP 提供以下功能:

    • 接收报告:接收端定期发送接收报告,包含丢包率、抖动和往返时间等信息。
    • 发送报告:发送端定期发送发送报告,包含发送的数据包数量和字节数等信息。

2. FEC(Forward Error Correction)

  • 前向纠错:WebRTC 使用 FEC 技术来处理丢包问题。FEC 通过在数据流中添加冗余信息,使接收端能够在一定程度上恢复丢失的数据包。
  • 冗余编码:常见的 FEC 技术包括 Reed-Solomon 编码和 XOR 编码,这些技术可以在不需要重传的情况下恢复丢失的数据。

可以通俗理解下FEC工作原理:

2.1.数据分块: 假设你有一段数据需要传输,比如一组字母 A, B, C, D。 这些字母可以看作是数据块。

2.2.生成冗余数据:

在发送数据之前,发送端会生成一些冗余数据。冗余数据是根据原始数据计算出来的。 比如,发送端可以生成一个冗余块 E,这个冗余块是 A, B, C, D 的某种组合。 发送数据和冗余数据:

发送端会将原始数据块 A, B, C, D 和冗余数据块 E 一起发送给接收端。

2.3.接收和修复数据:

接收端收到数据后,如果某个数据块丢失或损坏,比如 C 丢失了,接收端可以使用剩余的原始数据块 A, B, D 和冗余数据块 E 来恢复丢失的 C。 具体的恢复方法取决于冗余数据的生成方式,但基本思想是利用冗余信息来推算出丢失的数据。

3. NACK(Negative Acknowledgement)

  • 负确认:WebRTC 使用 NACK 机制来请求重传丢失的数据包。当接收端检测到数据包丢失时,会发送 NACK 请求,要求发送端重传丢失的数据包。
  • 重传机制:发送端在接收到 NACK 请求后,会重传丢失的数据包,以确保数据的完整性。

4. Jitter Buffer

  • 抖动缓冲区:WebRTC 使用抖动缓冲区来处理乱序和抖动问题。抖动缓冲区是一个临时存储区,用于重新排序乱序的数据包,并平滑网络抖动。
  • 动态调整:抖动缓冲区的大小可以动态调整,以适应不同的网络条件和延迟要求。

Jitter Buffer 的基本原理:

4.1. 接收数据包:

数据包从发送端传输到接收端,可能会因为网络原因出现乱序和抖动。 乱序:数据包到达的顺序与发送的顺序不一致。 抖动:数据包到达的时间间隔不均匀,有时快有时慢。

4.2.存储在缓冲区:

接收端将接收到的数据包存储在 Jitter Buffer 中。 Jitter Buffer 就像是一个临时存储区,可以容纳一定数量的数据包。

4.3.重新排序和调整时间间隔:

Jitter Buffer 会根据数据包的序列号或时间戳,将乱序的数据包重新排序。 Jitter Buffer 还会根据预设的时间间隔,平滑输出数据包,消除抖动的影响。

4.4.输出数据包:

经过重新排序和时间间隔调整后,Jitter Buffer 按照正确的顺序和均匀的时间间隔输出数据包。 这样,接收端可以平稳地处理和播放音频或视频数据。

5. SRTP(Secure Real-time Transport Protocol)

  • 安全传输:WebRTC 使用 SRTP 来加密和保护 RTP 数据包,确保数据的机密性和完整性。
  • 消息认证:SRTP 提供消息认证功能,防止数据包被篡改。

6. 带宽适应和拥塞控制

  • 带宽适应:WebRTC 使用带宽适应算法,根据网络条件动态调整音频和视频的编码比特率,以减少丢包和抖动。
  • 拥塞控制:WebRTC 实现了多种拥塞控制算法,如 Google Congestion Control (GCC),用于检测和缓解网络拥塞,确保数据的平稳传输。

总结

WebRTC 通过以下机制来处理 UDP 传输中的丢包和乱序问题:

  • RTP/RTCP:使用序列号和时间戳检测和重排乱序的数据包,使用接收报告和发送报告监控传输质量。
  • FEC:通过前向纠错技术恢复丢失的数据包。
  • NACK:使用负确认机制请求重传丢失的数据包。
  • Jitter Buffer:使用抖动缓冲区重新排序乱序的数据包,并平滑网络抖动。
  • SRTP:使用加密和消息认证保护数据的机密性和完整性。
  • 带宽适应和拥塞控制:动态调整编码比特率和检测网络拥塞,确保数据的平稳传输。

通过这些机制,WebRTC 能够在不可靠的 UDP 传输环境中实现高质量的实时音频和视频通信。