3.1 RTP
RTP(Real-time Transport Protocol,实时传输协议)通过IP网络实时传输音频和视频。RTP常用于流媒体服务的通信系统,例如网络电话、WebRTC视频电话会议、电视服务等。RTP是由Internet工程任务组(IETF)的音视频传输工作组开发的,其标准规范RFC 1889于1996年发布,2003年更新为RFC 3550。
RTP是专为流媒体的端到端实时传输设计的,更关注信息的实时性,可以避免出现因网络传输丢失数据造成通话质量下降的情况。例如,音频应用程序中丢失数据包可能会导致音频数据丢失几分之一秒,而使用合适的纠错算法就可以实现用户无感知。
大多数RTP应用都是基于UDP构建的,并额外提供抖动补偿、包丢失检测和无序传递检测的功能。RTP也支持TCP,但是因为TCP更注重可靠性而不是实时性,所以在RTP应用中很少使用。
RTP的主要特点如下。
- 具有较低的延时。
- 数据包在网络传输的过程中可能会丢失,到达对等端的顺序也可能发生变化。对等端收到RTP数据包后,需要根据数据包的序列号和时间戳进行重新组合。
- 支持多播(multicast),尽管目前WebRTC还没有使用这个特性,但是在海量用户通话场景,这个特性就变得很重要。
- 可用于音视频通话之外的场景,如实时数据流、状态实时更新、控制信息传输等连续数据传输场景。
尽管RTP的定位是低延时场景数据传输,但它本身并没有提供服务质量保障功能(Quality of Service,QoS),所以在WebRTC中,RTP需要和RTCP结合使用。
RTP会为每个媒体流建立一个会话,即音频和视频流使用单独的RTP会话,这样接收端就能选择性地接收媒体流。RTP使用的端口号为偶数,每个关联的RTCP端口为下一个较高的奇数,端口号范围为1024~65535。
1. RTP配置文件与载荷
RTP在设计之初就考虑到了在不修改标准的情况下携带多种媒体格式并允许使用新格式,所以,RTP标头数据中不包含媒体格式信息,而是在单独的RTP配置文件(profile)和有效载荷(payload)格式中提供,这种方式提供了更好的可扩展性。RTP对每类应用(如音频或视频)都定义了一个配置文件和至少一个有效载荷格式。表3-1列出了几种特定应用的RTP载荷。
表3-1 特定应用的RTP载荷
载荷类型字段中定义了编解码的格式。每个配置文件都附带几种有效载荷格式规范,每个规范描述特定编码数据的传输。音频有效载荷格式包括G.711、G.723、G.726、G.729、GSM、opus、MP3和DTMF等,视频有效载荷格式包括H.263、H.264、H.265、VP8和VP9等。
RTP配置文件包括以下3种。
- 音频和视频会议的RTP配置文件(RFC 3551)。该配置文件定义了一组静态有效载荷类型分配以及使用会话描述协议(SDP)在有效载荷格式和PT值之间进行映射的动态机制。
- SRTP(RFC 3711)定义了一个RTP配置文件,该配置文件提供用于传输有效载荷数据的加密服务,WebRTC使用的就是SRTP。
- 用于机器对机器通信的RTP(RTP / CDP)实验性控制数据配置文件。
2. RTP数据包标头
在应用层创建RTP数据包并传递到传输层进行传输。应用层创建的RTP媒体数据的每个单元都以RTP数据包标头开始,标头结构如表3-2所示。
表3-2 RTP数据包标头域
RTP标头最小为12个字节。标头后面有可选的扩展头,随后是RTP有效载荷,其格式由特定应用类别确定。标头中各字段解释如下所示。
- 版本号(2位):表示协议的版本,当前版本是2。
- P(Padding,1位):表示RTP数据包末尾是否有额外的Padding字节。Padding字节用于填充一定大小的数据块,如加密算法,其最后一个字节表示Padding的字节数(包括自身)。
- X(扩展名,1位):表示在标头和有效载荷数据之间是否存在扩展标头。
- CC(CSRC计数,4位):表示包含CSRC标识符的数量。
- M(标记,1位):表示在应用程序级别使用的信令。对于视频,标记一帧的结束;对于音频,标记会话的开始。
- PT(有效载荷类型,7位):表示有效载荷的格式,从而确定应用程序对其的解释。值是特定于配置文件的,可以动态分配。
- 序列号(16位):RTP数据包的序列号。每发送一个RTP数据包,序列号都会递增,接收方将使用该序列号检测包丢失并适应无序交付。为了提升RTP的安全性,序列号的初始值应随机分配。
- 时间戳(32位):RTP数据包的时间标识。接收端以此在适当的时间播放接收到的样本。当存在几个媒体流时,每个流的时间戳都是独立的。时序的粒度特定于应用程序,如音频应用程序的常见采样率是每125μs对数据进行一次采样,换算成时钟频率为8kHz,而视频应用程序通常使用90 kHz时钟频率。时间戳反映了发送者采样RTP报文的时刻,接收者使用时间戳计算延迟和延迟抖动,并进行同步控制。
- SSRC(32位):表示RTP数据包的同步源,用于标识媒体源。同一RTP会话中的同步源是唯一的。
- CSRC(32位):表示RTP数据包的贡献源,同一RTP会话可以包含多个贡献源。
- 标头扩展名:可选项,由扩展名字段决定是否存在。第一个32位字包含一个特定于配置文件的标识符(16位)和一个长度说明符(16位)。