概述
0x00 前言
下面是 WebRTC 的 SDP 描述中的 m-line 的一个示例:
m=audio 58779 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
m=video 60372 UDP/TLS/RTP/SAVPF 100 101 116 117 96
可以看出 audio 和 video 的传输都是基于 RTP 已经定义的几种 Profile (AVP/SAVP/AVPF/SAVPF) 中最复杂的 SAVPF,这些机制里面最复杂的部分要数 Feedback,而 RTCP 是整个 Feedback 机制实现的重要组成部分(还有一部分可以通过 RTP Header Extention 实现)。本文主要介绍和分析 WebRTC 中与 RTCP 相关的内容。
对于基于 UDP 的 RTP 并不能为按顺序传送数据包提供可靠的机制,也不提供流量控制或拥塞控制,所以需要依靠 RTCP 提供这些服务。通常 RTP 算法并不作为一个独立的网络层来实现,在 RTP 会话期间,通常会配备一些 发现/安全/反馈 机制来保证基于 RTP 的应用完整实现。
在语音通信中 RTCP 主要用于传递状态和发送统计数据。而视频通信中的 RTCP 被赋予了控制功能,比如关键帧请求,重传请求,码率控制等。
0x01 RTCP 介绍
WebRTC 中的 RTCP 常见类型有:
Sequence | Represent | Subtype |
---|---|---|
200 | SR (Sender Report) | - |
201 | RR (Receiver Report) | - |
202 | SDES (Source Description) | - |
203 | BYE | - |
204 | APP | - |
205 | RTPFB (Generic RTP Feedback) | NACK/TransportFeedback |
206 | PSFB (Payload-Specific Feedback) | PLI/FIR/REMB |
207 | XR (Extended Reports) | LRLE/DRLE/PRT/RRT/DLRR/SS/VM |
更多类型定义可以参考 https://www.ietf.org/assignments/rtp-parameters/rtp-parameters.xml#rtp-parameters-4
RTCP 主要涉及到 3 个 RFC 文档
- RFC3550 → SR/RR/BYE/APP/SDES
- RFC4585 → RTPFB/PSFB
- RFC3611 → XR
和下面几个补充文档
- RFC3551 - RTP Profile for Audio and Video Conferences with Minimal Control
- RFC5104 - Codec Control Messages in the RTP Audio-Visual Profile with Feedback (AVPF)
- RFC5124 - Extended Secure RTP Profile for Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/SAVPF)
- RFC5450 - Transmission Time Offsets in RTP Streams
0x02 RTCP 类型分析
① SR/RR/SDES/BYE/APP
SR
https://tools.ietf.org/html/rfc3550#section-6.4.1
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P| RC | PT=SR=200 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of sender |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
sender | NTP timestamp, most significant word |
info +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NTP timestamp, least significant word |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| RTP timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sender's packet count |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| sender's octet count |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report | SSRC_1 (SSRC of first source) |
block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1 | fraction lost | cumulative number of packets lost |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| extended highest sequence number received |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| interarrival jitter |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| last SR (LSR) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| delay since last SR (DLSR) |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report | SSRC_2 (SSRC of second source) |
block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2 : ... :
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| profile-specific extensions |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
RR
https://tools.ietf.org/html/rfc3550#section-6.4.2
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P| RC | PT=RR=201 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC of packet sender |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report | SSRC_1 (SSRC of first source) |
block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1 | fraction lost | cumulative number of packets lost |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| extended highest sequence number received |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| interarrival jitter |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| last SR (LSR) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| delay since last SR (DLSR) |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
report | SSRC_2 (SSRC of second source) |
block +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2 : ... :
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| profile-specific extensions |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
SR 和 RR 的唯一区别是 SR 多了 20 字节的 Sender Info,用于描述发送者的信息。
SDES
https://tools.ietf.org/html/rfc3550#section-6.5
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
header |V=2|P| SC | PT=SDES=202 | length |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
chunk | SSRC/CSRC_1 |
1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES items |
| ... |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
chunk | SSRC/CSRC_2 |
2 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SDES items |
| ... |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
BYE
https://tools.ietf.org/html/rfc3550#section-6.6
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P| SC | PT=BYE=203 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: ... :
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
(opt) | length | reason for leaving ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
APP
https://datatracker.ietf.org/doc/html/rfc3550#section-6.7
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P| subtype | PT=APP=204 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC/CSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| name (ASCII) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| application-dependent data ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
② RTPFB/PSFB
常规的 SR/RR 是一种定时报告机制,对于因为事件引起的反馈并不是很友好,例如关键帧丢失。RTPFB/PSFB 提供了这样的保证机制,其中 RTPFB 是在 RTP Stream 层面的 Feedback,PSFB 是 RTP 所携带的负载信息的反馈机制。这种 Feedback 机制主要目的为:关键帧请求、重传请求、码率控制等。
参考 https://www.ietf.org/assignments/rtp-parameters/rtp-parameters.xml,常见 RTPFB/PSFB 类型如下表。
RTPFB
Value | Name | Long Name | Reference |
---|---|---|---|
1 | NACK | Generic negative acknowledgement | RFC4585 |
2 | Reserved | RFC5104 | |
3 | TMMBR | Temporary Maximum Media Stream Bit Rate Request | RFC5104 |
4 | TMMBN | Temporary Maximum Media Stream Bit Rate Notification | RFC5104 |
5 | SR_REQ | RTCP Rapid Resynchronisation Request | RFC6051 |
6 | RAMS | Rapid Acquisition of Multicast Sessions | RFC6285 |
7 | TLLEI | Transport-Layer Third-Party Loss Early Indication | RFC6642 |
8 | ECN | RTCP ECN Feedback | RFC6679 |
9 | PS | Media Pause/Resume | RFC7728 |
10 | DBI Delay | Budget Information (DBI) | [3GPP TS 26.114 v16.3.0][Ozgur_Oyman] |
15 | TCC | Transport Wide Congestion Control | https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01 |
31 | EXT | Reserved for future extensions | RFC4585 |
PSFB
Value | Name | Long Name | Reference |
---|---|---|---|
1 | PLI | Picture Loss Indication | RFC4585 |
2 | SLI | Slice Loss Indication | RFC4585 |
3 | RPSI | Reference Picture Selection Indication | RFC4585 |
4 | FIR | Full Intra Request Command | RFC5104 |
5 | TSTR | Temporal-Spatial Trade-off Request | RFC5104 |
6 | TSTN | Temporal-Spatial Trade-off Notification | RFC5104 |
7 | VBCM | Video Back Channel Message | RFC5104 |
8 | PSLEI | Payload-Specific Third-Party Loss Early Indication | RFC6642 |
9 | ROI | Video region-of-interest (ROI) | [3GPP TS 26.114 v16.3.0][Ozgur_Oyman] |
10 | LRR | Layer Refresh Request Command | RFC-ietf-avtext-lrr-07 |
15 | AFB(REMB) | Application Layer Feedback (Receiver Estimated Maximum Bitrate) | https://tools.ietf.org/html/draft-alvestrand-rmcat-remb-03 |
31 | EXT | Reserved for future extensions | RFC4585 |
另外,除了关键帧请求和重传,Webrtc还支持RED/FEC等冗余编码和前向纠错手段来保证视频质量。
③ XR
RTCP XR 的目的是补充传递 RTCP SR 和 RTCP RR 包含的六个统计信息。
共定义了 7 种类型的 BT (Block Type),见下表。
Value | Name | Long Name | Reference |
---|---|---|---|
1 | LRLE | Loss RLE (Run-Length Encoding) | rfc3611#section-4.1 |
2 | DRLE | Duplicate RLE (Run-Length Encoding) | rfc3611#section-4.2 |
3 | PRT | Packet Receipt Times | rfc3611#section-4.3 |
4 | RRT | Receiver Reference Time | rfc3611#section-4.4 |
5 | DLRR | Delay since the Last Receiver Reference | rfc3611#section-4.5 |
6 | SS | Statistics Summary | rfc3611#section-4.6 |
7 | VM | VoIP Metrics | rfc3611#section-4.7 |
定义的报表块类型分为三类。
- 第一类包括收到或丢失RTP Packet 的逐包报告。
- LRLE
- DRLE
- PRT
- 第二类报告在 RTP 参与者之间传递参考时间信息。
- RRT
- DLRR
- 第三类报告传递与包接收相关的度量,这些度量在本质上是摘要,但比现有 RTCP 包中传递的度量更详细,或者具有不同的类型。
- SS
- VM
XR 类型 RTCP 的头部信息为:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|reserved | PT=XR=207 | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SSRC |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: report blocks :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
report blocks 格式为:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| BT | type-specific | block length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: type-specific block contents :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
在 WebRTC 中比较常用的为 RRT 和 DLRR,接收⽅发送 RTCP-XR RRT 后,发送⽅在下次的 RTCP 中携带 RTCP-XR DLRR,可以使接收方估算出网络的 RTT 参数。
参考文档
- https://www.ietf.org/assignments/rtp-parameters/rtp-parameters.xml
- 超越RFC3550 - RTP/RTCP协议族分析
- WebRTC之RTCP
- WebRTC之RTT计算
- 网络抖动(jitter)的计算
最后
以上就是粗心火为你收集整理的WebRTC RTCP 分析的全部内容,希望文章能够帮你解决WebRTC RTCP 分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复