RFC3550学习记录

tech2022-09-25  106

RFC3550学习记录一

参考链接:

1. TCP、UDP、RTP详解 2. RFC3550英文原文

本文主要从OSI和 TCP/IP模型入手,一步一步理解RTP在模型中的位置和功能

一、相关背景介绍

OSI层次功能TCP/IP协议族应用层文件传输,电子邮件,文件服务,虚拟终端TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet表示层数据格式化,代码转换,数据加密–会话层解除或建立与别的接点的联系–传输层提供端对端的接口TCP,UDP (RTP)网络层为数据包选择路由IP,ICMP,RIP,OSPF,BGP,IGMP数据链路层传输有地址的帧以及错误检测功能SLIP,CSLIP,PPP,ARP,RARP,MTU物理层以二进制数据形式在物理媒体上传输数据ISO2110,IEEE802,IEEE802.2 TCP/IP层次主要设备应用层–传输层四层交换机、也有工作在四层的路由器四层交换机、也有工作在四层的路由器网络层路由器、三层交换机数据链路层网桥(现已很少使用)、以太网交换机(二层交换机)、网卡(其实网卡是一半工作在物理层、一半工作在数据链路层)物理层中继器、集线器、还有我们通常说的双绞线也工作在物理层

二、RFC3550学习

2.1 RTP和RTCP

  RTP标准定义了两个子协议,RTP和RTCP:

数据传输协议RTP:用于实时传输数据。该协议提供的信息包括:时间戳(用于同步)、序列号(用于丢包和重排序检测)、以及负载格式(用于说明数据的编码格式); 控制协议RTCP:用于QoS反馈和同步媒体流。相对于RTP来说,RTCP所占的带宽非常小,通常只有5%。

Q1:为什么要用RTP?   一提到流媒体传输、一谈到什么视频监控、视频会议、语音电话(VOIP),都离不开RTP协议的应用,但当大家都根据经验或者别人的应用而选择RTP协议的时候,你可曾想过,为什么我们要使用RTP来进行流媒体的传输呢?为什么我们一定要用RTP?难道TCP、UDP或者其他的网络协议不能达到我们的要求么? A1:像TCP这样的可靠传输协议,通过超时和重传机制来保证传输数据流中的每一个bit的正确性,但这样会使得无论从协议的实现还是传输的过程都变得非常的复杂。而且,当传输过程中有数据丢失的时候,由于对数据丢失的检测(超时检测)和重传,会数据流的传输被迫暂停和延时。 A1 : 或许你会说,我们可以利用客户端构造一个足够大的缓冲区来保证显示的正常,这种方法对于从网络播放音视频来说是可以接受的,但是对于一些需要实时交互的场合(如视频聊天、视频会议等),如果这种缓冲超过了200ms,将会产生难以接受的实时性体验。

Q2:那为什么RTP可以解决上述问题呢? A2:RTP协议是一种基于UDP的传输协议,RTP本身并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。这样,对于那些丢失的数据包,不存在由于超时检测而带来的延时,同时,对于那些丢弃的包,也可以由上层根据其重要性来选择性的重传。比如,对于I帧、P帧、B帧数据,由于其重要性依次降低,故在网络状况不好的情况下,可以考虑在B帧丢失甚至P帧丢失的情况下不进行重传,这样,在客户端方面,虽然可能会有短暂的不清晰画面,但却保证了实时性的体验和要求。

 

2.2 RTP的工作机制:

  当应用程序建立一个RTP会话时,应用程序将确定一对目的传输地址。目的传输地址由一个网络地址和一对端口组成,有两个端口:一个给RTP包,一个给RTCP包,使得RTP/RTCP数据能够正确发送。RTP数据发向偶数的UDP端口,而对应的控制信号RTCP数据发向相邻的奇数UDP端口(偶数的UDP端口+1),这样就构成一个UDP端口对。 RTP的发送过程如下,接收过程则相反。

RTP协议从上层接收流媒体信息码流(如H.263),封装成RTP数据包;RTCP从上层接收控制信息,封装成RTCP控制包.

RTP将RTP数据包发往UDP端口对中偶数端口;RTCP将RTCP控制包发往UDP端口对中的奇数端口

  RTP分组只包含RTP数据,而控制是由RTCP协议提供。RTP在1025到65535之间选择一个未使用的偶数UDP端口号,而在同一次会话中的RTCP则使用下一个奇数UDP端口号。端口号5004和5005分别用作RTP和RTCP的默认端口号。RTP分组的首部格式如图2所示,其中前12个字节是必须的。

 

2.3 RFC3550文档说明

下面给出一些常见的定义,帮助我们更好地理解之后RTP协议。

①RTP负载(RTP payload) 通过RTP传输的包中的数据——例如,音频样本或压缩好的视频数据

②RTP包 一种数据包——由固定RTP报头,一个可能为空的CSRC列表以及负载数据组成。

③RTP媒体类型 是一个单独RTP会话所载有的负载类型的集合

④多媒体会话 在一个参与者公共组中,并发的RTP会话的集合。——例如,一个视频会议可能含音频和视频部分的RTP会话

⑤RTP会话 一群参与者通过RTP进行通信时所产生的关联。一个参与者可能同时参与多个RTP会话。除非音频和视频多路复用到单一数据流中,否则每种媒体都将使用各自的RTCP包,通过独立的RTP会话进行传送。

⑥混频器 一个中间系统,它从一个或者多个源中接受RTP包,可能改变其数据格式,再按某种方式把这些包组合成一个新的包,然后转发出去。【对各个流计时器做出调整】

⑦同步源 SSRC RTP包流的源【发送方】。麦克风,摄像机,混频器都是同步源。

SSRC标识符特点 a.在特定的RTP会话中是唯一的 b.同一个流在所有的RTP会话中可以不同 c.在一个RTP会话中的不同流必须不同

⑧作用源 CSRC

若一个RTP包流的源,对混频器的合成起了作用,那么他是一个作用源。例如对于音视频,混频器组合所有声音,生产一个较大的包,这个包有一个SSRC标识符【混频器的】,在维护一个CSRC表,表中每一项由起作用的【谁在说话】源的SSRC标识符组成。

此外还有以下内容,这里不再赘述。

1.RTCP包 2.端口 3.传输地址 4.终端系统 5.转换器 6. 监视器 7.非RTP途径

 

2.4 RTP包头格式

 其中,前12个字节(B)即前3行 【12*8/32 = 3】,出现在每一个RTP包中,CSRC仅在混合器插入时才有。

【1】版本V: 2bit

本协议定义版本是2。

【2】填充P: 1bit 若P被设置,则此包包含一个或多个附加在末端的填充bit,这些bit不算做负载的一部分。P的最后一个字节指明可以忽略多少个填充比特。P可用作固定block size的加密算法,或者用于底层数据单元中来传输多个RTP包。

【3】 扩展X: 1bit 若X被设置,固定头后面must跟随一个头扩展

【4】CSRC计数 CC:4bit CC表示CSRC标识符的个数

【5】标志M: 1bit M的解释由具体协议定义。例,可以用来允许在比特流中标记重要的事件,如帧边界。

【6】负载类型PT:7bit 定义了负载的格式,由应用决定。协议可以规定负载类型和负载格式之间的一个默认的匹配。

【7】序列号(seq number): 16bit 每发送一个RTP数据包,seq number 加1。接收端可以据此检测丢包和重建包序列。为了安全,序列号初始值是随机的。

【8】时间戳(timestamp): 32bit 反应了RTP数据包中第一个字节数据的采样时间。可以依赖系统时钟,采样时钟和参考时钟。(profile 描述文件) 采样时钟,对于固定速率的音频,每个周期加1。如果一个音频从输入设备中读取含有160个采样周期的块,那么对于么个块,时间戳的值增加160。 参考时钟,为了不同每日流保证同步。类似于相对时钟,解决了偏移量的问题。

【9】同步源SSRC 用以识别同步源。标识符identifier是随机生成的,即使概论很低也要检测和解决冲突。若源本身改变传输地址,必须选择新的标识符,以避免当做一个环路源。

【10】作用源CSRC 最多有0-15项。由混合器插入(Mix),并列出所有贡献源的SSRC标识符。

 

2.5 RTP包头扩展

  如图所示,若X被设置,则可以增加长度可变的头扩展。其中16bit的length指示扩展项中32bit的个数,不包括4字节(B)的扩展头本身【因此0是有效的】。前16bit指示该头扩展的标识符。  

2.6 RTCP的4个功能

  RTCP向会议中的所有成员周期性地发送控制包。它使用与数据包相同的传输机制。底层协议必须提供数据包和控制包的复用,例如使用不同的UDP端口。RTCP有下4个功能:

1.基本功能:   提供数据传输质量的反馈(QoS) 便于“观察者”评估通讯中出现的问题是全局的还是局部的。也可以让第三方监视员来诊断网络故障。 2.CNAME规范名 :   用于关联同一系列相关RTP会话中来自同一个成员的多个数据流,如同步语音和图像。 3.控制RTCP包的发送速率来应对RTP会话中成员的增长 4.可选:传输最少的会议控制信息   在“松散会议”中,成员可以不经过资格控制和参数协商而加入或者退出会议。

2.7 RTCP包格式

  RTCP包有很多种,例如SR、RR、SDES、BYE和APP。分别是发送者报告、接受者报告、源描述项、表明参与者即将离开会话和应用描述功能。下文将详细介绍SR和RR。    复合RTCP包可以由多个RTCP包组成。每个RTP成员在一个报告间隔内应只发送一个RTCP复合包,以便正确估计每个成员的带宽,【除了上述限制2中的例外情况】。当数据源个数太多超过31个【最大传输单元, MTU】,则在第一个SR之和,应该加上附加的RR。

2.7.1 SR包

  SR包分为三个部分:1-6第一部分; 7-10第二部分;11-17第三部分

1) 版本V: 2bit 本协议定义版本是2。

2) 填充P: 1bit 若P被设置,则此包包含一个或多个附加在末端的填充bit,这些bit不算做负载的一部分。P的最后一个字节指明可以忽略多少个填充比特。P可用作固定block size的加密算法,或者用于底层数据单元中来传输多个RTP包。

3) 接受报告块计数RC(report blocks count): 5bit 可以为0。

4) 包类型PT(packet type):8位 当包位SR是,PT= SR=200

5) 长度: 16位 单位是32位。包括头和填充字节。Length = PacketSize/32-1,为了可以使得len=0。

6) SSRC:32bit SR包发送者的同步源

7) NTP 时间戳:64位 每发送一个RTP数据包,seq number 加1。接收端可以据此检测丢包和重建包序列。序列号初始值是随机的,为了安全。

8) RTP时间戳(timestamp): 32bit 与上述NTP时间戳对应同一时刻。与数据包中的RTP时间戳具有相同的单位和偏移量。

9) 发送者报文数 :32bit 从开始传输到此SR包产生时该发送者发的RTP包总数。若SSRC被改,需要重设。

10) 发送者字节数 :32bit 从开始传输到此SR包产生时该发送者在RTP包发送的字节总数。(不包括头和填充)。 若更改需要重设。

11) SSRC_n: 32bit

12) 丢包率: 8bit 丢包率 = 损失包数/期望包数

13) 累计丢包数: 24bit 累计丢包数 = 扩展的上一个接收序列号 - 最初接收序号 (可能为0)

14) 接收到的扩展最高序列号:32bit 低16位包含从源SSRC_n来的最高接收序列号,高16位用以相应的序列号周期计数器扩展改序列号。

15) 到达间隔抖动: 32bit

16) 上一个SR报文 【LSR】: 32bit 接收到来自源SSRC_n的最新RTCP[SR]包的64位NTP的中间32位。

17) 来自上一个SR的时间【DLSR】: 32bit 接收到来自源SSRC_n的最新RTCP[SR]包后到发送此接收报告块之间的延时。

  可以看到:Start_Time + delay1 + DLSR + delay2 = Arrive_Time。因为Arrive_Time取得是32位,所以Start_Time也要取32位。因此:           Total_Delay = A - DLSR - LSR (这个LSR是起始时间的表示)  

2.7.1 SR包

  可以看出,RR基本与SR相同,除了PT位值为201

最新回复(0)