实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务, RTP 本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于底层服务去实现这一过程。 RTP 并不保证传送或防止无序传送,也不确定底层网络的可靠性。
RTP标准定义了两个子协议,RTP和RTCP。
数据传输协议RTP,用于实时传输数据。该协议提供的信息包括:时间戳(用于同步)、序列号(用于丢包和重排序检测)、以及负载格式(用于说明数据的编码格式)。
控制协议RTCP,用于QoS反馈和同步媒体流。相对于RTP来说,RTCP所占的带宽非常小,通常只有5%。
RTP/RTCP在协议栈中的位置
RTP的传输
-
RTP与UDP的传输方式类似, 都是一个包一个包的传输
-
只不过RTP在每个包里加了个RTP头
-
RTP头中有一个重要的字段:seqNumber, 以标明包的顺序
-
UDP传输是不能保证数据顺序地到达对端的, 所以seqNumber是用来控制数据的有序性关键属性
RTP Header
-
V : 版本号
-
P : 当前数据包中是否有填充数据, “1”代表有补充数据, 反之用“0”表示
-
X : 有无扩展头, 用 “1” 或者“0”表示
-
CC : Contributing source, 数据源的个数, 例如接收到的声音是由两个同时说话的人的声音的混合数据, 那么CC = 2.
-
M : 用来标记一个视频帧分包之后的最后一个数据包, “1” 表示该包为视频帧拆包后的最后一个数据包, 否则M = 0.
-
PT : payload type 数据负载类型, 例如音频Opus 111
-
SequenceNumber : 线性增长的顺序编号, 用于将乱序的包重新排序.
-
timestamp : 该包产生的时间, 例如:一个视频帧需要拆成多个包进行传输, 那么被拆出来的这些包的时间戳都是相同的.
-
SSRC : 同步源标识符, 例如: 同时发送音频数据和视频数据, 除了可以用payload type区分两个数据之外,还可以用SSRC区分这两个数据源, 但是当既有摄像头数据又有桌面共享数据的时候, PT都是video, 此时只能用SSRC来区分.
-
CSRC : 当前接收的数据是由几个贡献者贡献的.
SSRC作用
通过上图可以得出:
-
可以用SSRC区分数据包属于哪个数据流/数据源
-
可以通过PT知道该数据包对应哪个编解码器
Sequence作用
通过上图可以得出:
-
可以通过SeqNumber重新对包进行排序
-
可以通过SeqNumber得知哪个包丢失了, 缓存了一定的包之后返现某个包一直没有接收到, 此时接收端通过RTCP将丢包信息反馈给发送端, 发送端通过反馈信息重新发送指定的数据包, 这也是NACK的工作的基本原理.
视频帧分包
通过上图可以得出:
-
一个视频帧可以分成个数不等的多个数据包进行传输
-
对于H264数据, 一帧数据的一组包会用“S”和“E”来分别标明组头和组尾
组帧
- M : 表示该帧数据的结束
- 100 - 104可以组成一帧数据, 会逐个将收到的包放入缓冲区 进行排序
- 在等待一段很小的时延后, 103号包接收到了,此时可以组成一帧完整的视频帧
- 在等待一段很小的时延后, 仍然没有收到缺失的数据包, 那么就会将缓冲区内的数据包全部丢掉, 重新接收下一帧数据的数据包