服务于流媒体的实时传输协议RTP_rtp用于交换多媒体数据-程序员宅基地

技术标签: 扩展  extension  网络  服务器  流媒体服务器  internet  

服务于流媒体的实时传输协议RTP

作者:清华大学信息学院多媒体中心 赵勇 曾珂 戴琼海
【提 要】流媒体作为新的网络应用主流发展极为迅速,本文从应用的角度描述了服务于流媒体的实时传输协议RTP协议,并介绍了RTP协议的典型实现方式。
【关键字】RTP 协议 RTCP 流媒体
1
.背景
  随着Internet的迅速增长和普及,人们对网络多媒体信息的需求也越来越大,为了适应网络多媒体化的发展趋势,流媒体技术应运而生,流媒体是指采用流式传输的方式在InternetIntranet播放的媒体格式,流媒体的互动性使其广泛应用于视频点播、互动游戏、远程培训等。同时,新的算法、压缩技术、高性能存储设备以及宽带网络技术又给基于网络的流媒体技术提供了新的机遇和挑战。各路IT英豪纷纷预言,流媒体将成为未来互联网应用的主流,并将推动互联网整体架构的革新。
另一方面,通过网络传输实时流媒体面临着许多的问题,例如:带宽限制,时间延迟,拥塞控制等。目前,流媒体技术已经受到学术界和业界的广泛关注,流媒体所涉及的许多领域,如存储技术、压缩技术已经成为学术界的热点,而流媒体实现的关键技术是流式传输,因此,流媒体传输协议无疑成为流媒体技术的重中之重,流媒体协议的设计和制定是为了实现流媒体服务器和客户端的通讯。实时传输协议RTP是最典型、最广泛的服务于流媒体的传输层协议,RTP协议本身非常庞大,本文仅从应用的角度对RTP协议进行综述。
2
RTP协议概述
  RTPRealtime Transport Protocol)是用于Internet上针对多媒体数据流的一种传输协议。RTP被定义为在一对一或一对多的传输情况下工作,其目的是提供时间信息和实现流同步。RTP通常使用UDP来传送数据,但RTP也可以在TCPATM等其他协议之上工作。当RTP工作于一对多的传输情况下时,依靠底层网络实现组播,利用RTP over UDP模式实现组播的传输就是其典型应用。RTP传输协议有如下一些特点:
1)协议灵活性
RTP
协议不具备运输层协议的完整功能,其本身也不提供任何机制来保证实时地传输数据,不支持资源预留,也不保证服务质量。RTP报文甚至不包括长度和报文边界的描述,而是依靠下层协议提供长度标识和长度限制。另外,RTP协议将部分运输层协议功能(比如流量控制)上移到应用层完成,简化了运输层处理,提高了该层效率。
2)数据流和控制流分离
RTP
协议的数据报文和控制报文使用相邻的不同端口,这样大大提高了协议的灵活性和处理的简单性。
3)协议的可扩展性和适用性
RTP
协议通常为一个具体的应用来提供服务,通过一个具体的应用进程实现,而不作为OSI体系结构中单独的一层来实现,RTP只提供协议框架,开发者可以根据应用的具体要求对协议进行充分的扩展。
虽然RTP协议是为多媒体数据流传输而设计的,但是其用途不仅限于此,RTP协议还可以用于连续数据的存储,交互式分布仿真和一些控制、测量的应用中。
3.RTP
数据传输协议与RTCP传输控制协议
RTP
协议本身包括两部分:RTP数据传输协议和RTCP传输控制协议。为了可靠、高效地传送实时数据,RTPRTCP必须配合使用,通常RTCP包的数量占所有传输量的5%。
RTP
实时传输协议主要用于负载多媒体数据,并通过包头时间参数的配置使其具有实时的特征。RTCP传输控制协议主要用于周期的传送RTCP包,监视RTP传输的服务质量。在RTCP包中,含有已发送的数据包的数量、丢失的数据包的数量等统计资料。因此,服务器可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型,实现流量控制和拥塞控制服务。下文将对RTP传输协议和RTCP传输控制协议分别进行描述。

 

3.1 RTP数据传输协议
  RTP提供端对端网络传输功能,适合通过组播和点播传送实时数据,如视频、音频和仿真数据。RTP没有涉及资源预订和质量保证等实时服务。
  RTP报文格式中包括固定的RTP报文头,可选用的作用标识(CSRC)和负载数据。如果RTP所依赖的底层协议对RTP报文的格式有所要求,RTP报文的格式必须进行修改或重新定义。通常,单一的底层数据报文仅包含单一的RTP报文。
  下图为一个典型的负载MPEG4视频流的RTP报文。


RTP
数据报文格式


  RTP报文头部分各个参数的意义如下:
1)负载类型(PT):对音频或视频等数据类型予以说明,并说明数据的编码方式。
2)填充(P):如果设置了填充位,表示在该RTP包的末尾含有并非有效负载数据的填充位。
3)扩展位(ExtensionX):由使用的RTP框架定义。
4)序列号(Sequence Number):为了安全,服务器从一个随
机初始化值开始,每发送一个RTP数据包序列号增加1。客户端可以根据序列号重新排列数据包的顺序,并对丢失、损坏和重复的数据包进行检测。
5)标志位(MarkerM):标志位由具体的应用框架定义。例如,RTPMPEG4负载格式中,标志位设为1标志这是VOP的最后一个(或仅有一个)RTP包。
6)时间戳(Timestamp):RTP时间戳为同步不同的媒体流提供采样时间,用于重新建立原始音频或视频的时序。另外,它还可以帮助接收方确定数据到达时间的一致性或变化(有时被称为抖动)。
7)同步源标识(SSRC):帮助接收方利用发送方生成的唯一的数值来区分多个同时的数据流。SSRC必须是一个严格的随机数。
8)作用标识(CSRC):网络中使用混合器时,混合器会在RTP报文头部之后插入新的同步源标识,其作用仍是区分多个同时的数据流。在所有RTP报文中,开始12个字节的格式完全按照图1中定义的格式,而CSRC标识列表仅出现在混合器插入时。
标准的RTP数据报文头部参数对RTP支持的所有应用类的共同需要是完整的。然而,为了维持ALF设计原则,报文头部还可以通过改变、增加参数实现优化,或适应特殊应用的需要。由子标志位和负载类型段携带特定设置信息,所以很多应用都需要它们,否则要容纳它们,就要增加另外32位字,因此,标志位和负载类型允许分配在固定头中。包含这些段的八进制可通过设置重新定义以适应不同要求,例如采用更多或更少标志位。如果有标志位,既然设置无关监控器能观察报文丢失模式和标志位间关系,我们就可以定位八进制中最重要的位。
如果RTP协议需要负载其它特殊格式(如视频编码)的音视频数据,所要求的信息应该携带在报文的数据负载部分。所需信息也可以出现在报文头部,但必须总是在载荷部分开始处,或在数据模式的保留值中指出。如果特殊应用类需要独立负载格式的附加功能,应用运行设置应该在现存固定报文头部的SSRC参数之后,定义附加固定段。这些设置能使客户端迅速而直接访问附加段,同时,与监控器和记录器无关设置仍能通过仅解释开始12个八进制处理RTP报文。
3.2 RTCP
传输控制协议
RTP
本身并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠RTCPRealtime Control Potocol)传输控制协议提供这些服务。
RTP
的控制协议RTCP通过在会话用户之间周期性地递交控制报文来完成监听服务质量和交换会话用户信息等功能。根据用户间的数据传输反馈信息,可以制定流量控制的策略,而会话用户信息的交互,可以制定会话控制的策略。
RTCP
协议将控制包周期发送给所有连接者,应用与数据报文相同的分布机制。底层协议提供数据与控制包的复用,如使用单独的UDP端口号。

 

RTCP执行下列四大功能
  (1)提供数据发布的质量反馈,这是RTCP最主要的功能。作为RTP传输协议的一部分,与其他传输协议的流和阻塞控制有关。反馈对自适应编码控制直接起作用。反馈功能由RTCP发送者和接收者报告执行。
  (2)发送带有称作规范名字(CNAME)的RTP源持久传输层标识。如发现冲突,或程序重新启动,既然SSRC标识可改变,接收者需要CNAME跟踪参加者。接收者也需要CNAME与相关RTP连接中给定的几个数据流联系。
  (3)用于控制RTCP包数量的数量用语。前两种功能要求所有参加者发送RTCP包,因此,为了RTP扩展到大规模数量,速率必须受到控制。
  (4)传送最小连接控制信息。如参加者辨识。最可能用在松散控制连接,那里参加者自由进入或离开,没有成员控制或参数协调,RTCP充当通往所有参加者的方便通道,但不必支持应用的所有控制通讯要求。
RTCP
报文格式与RTP报文类似,包括固定的报文头部分和可变长结构元素,结构元素的意义由RTCP报文的类型决定,因为通常RTCP包非常小,一般把多个RTCP包合并为一个RTCP包,然后利用一个底层协议所定义的报文格式进行发送。
RTCP
报文头部参数首先要区别携带不同控制信息的RTCP报文的类型,RTCP报文的类型主要有以下几种:(1SR:发送报告,当前活动发送者发送、接收统计。(2RR:接收报告,非活动发送者接收统计。(3SDES:源描述项,包括CNAME。(4BYB:表示结束。(4APP:应用特定函数。
其中最主要的RTCP报文是SRRR。通常SR报文占总RTCP包数量的25%,RR报文占75%。类似于RTP数据包,每个RTCP报文以固定的包头部分开始,紧接着的是可变长结构元素,但是以32位长度为结束边界。在RTCP报文中,不需要插入任何分隔符就可以将多个RTCP报文连接起来形成一个RTCP组合报文。由于需要底层协议提供整体长度来决定组合报文的结尾,所以在组合报文中没有单个RTCP报文的显式计数。
RTCP
控制报文的发送周期是变化的,与报文长度L、用户数N和控制报文带宽B相关:周期P=L×NB。原因是RTP设计成允许应用自动扩展的模式,连接数可从几个到上千个。在一般的音频会议中,因为同一时刻一般只有两个人说话,所以数据流和控制流都是内在限制的,控制流不会对传输造成影响。而在组播发送模式下,给定连接数据率独立于用户数,仍是常数,但控制流量不是内在限制的。如果每个参加者以固定速率发送接收报告,控制流量将随参加者数量线性增长,因此,速率必须按比例下降。
  4RTP协议的实现
RTP
协议仅仅实现了网络传输层的功能,要真正实现流媒体的网络传输,网络层和会话层协议也必不可少,下图描述的是典型的服务器端RTP协议的实现方式,在会话层,RTSPRealTime Streaming Protocol)和SIPSession Initiation Protocol)协议完成会话控制;在传输层,为实现真正的端对端传输,RTP还必须以UDPTCP为底层协议;在网络层,IP协议完成网络寻址等最基本的网络层功能。


服务器端的RTP实现


在数据平面,服务器端将压缩打包后的音视频数据按照RTP数据传输协议的报文格式装入RTP报文的数据负载段,同时配置RTP报文头部的时间戳、同步信息、序列号等重要参数,此时的数据报文已经具有典型的时间特征,即被流化了。在UDP/TCP层,RTP报文作为负载数据装入DPTCP报文中,最后,由IP层负责最后的报文头部配置,实现网络传输。在客户端,实现方式相反,各网络层依次去除报文头部,并读取相关的控制参数和时间参数,最终获取可以实时播放的音视频数据。
在控制平面,RTCPRTSP报文通过UDP/TCP层后,同样由IP层负责发送。RTSP的主要功能是实现停滞、暂停、快进等VCR控制操作,SIPRTSP功能类似,RTCP仅负责控制RTP报文的传输。
  5.总结
随着流媒体技术的迅速普及与发展,服务于流媒体技术的实时传输协议RTP将逐渐遍及到网络的每一个角落,RTP协议具有灵活性、易控性和扩展性等优点,由RTP数据传输协议和RTCP数据控制协议两部分组成,RTP数据传输协议负责音视频数据的流化和负载,RTCP负责RTP数据报文的传输控制。RTP协议与RTSPSIPUDP/TCP等协议组成一个完整的网络体系完成流媒体的传输。

 

 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/panicyf/article/details/1341504

智能推荐

Emulator: G:\Android_SDK\emulator\qemu\windows-x86_64\qemu-system-x86_64.exe:Could not open 'C:\Use_j:\android\sdk\emulator\qemu\windows-x86_64\qemu-s-程序员宅基地

文章浏览阅读7.1k次。问题:Emulator: G:\Android_SDK\emulator\qemu\windows-x86_64\qemu-system-x86_64.exe: Could not open 'C:\Use...就是表示启动的AVD包含中文目录解决方案:将用户下的.android\avd下的对应文件剪切到别的地方_j:\android\sdk\emulator\qemu\windows-x86_64\qemu-system-aarch64.exe: pci bus

python字典输入学生信息_用Python创建一个学生字典并可以查询其中信息-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏22次。展开全部你可以试试这个----------------------------------------------------------# -*- coding:UTF-8 -*-students=[]def meun():print("="*30)print("*"*10+"学生信息管理"+"*"*10)print("1.添加学生信息")print("2.删除学生信息")print("3.指定..._利用字典实现学生个人信息查询

设置多个软件开机自启_开机自动启动多个应用程序怎么写-程序员宅基地

文章浏览阅读502次。多个软件都需要设置开机自启时,全部设置成开机自启有时会遇到各种问题,遇到兼容闪退等问题,这个时候就需要分时段启动软件,延时软件有时会遇到兼容问题,在此向大家分享一下,只需要简单的几句脚本就可以,一个个先后顺序启动软件了。 ⦁ 不在废话了,直接进入主题吧 .打开记事本,在里边写如下命令: set Wshell=CreateObject("Wscript.Shell") //设置脚本..._开机自动启动多个应用程序怎么写

Vim的终极配置方案,完美的写代码界面! ——.vimrc-程序员宅基地

文章浏览阅读2.7k次。Vim的终极配置方案,完美的写代码界面! ——.vimrcvim进阶 | 使用插件打造实用vim工作环境自动生成Python项目文档

kvm虚拟机中virbr0虚拟网络接口的…_kvm virb0 详解-程序员宅基地

文章浏览阅读3.6k次。原文链接:http://www.cnblogs.com/5201351/p/4445329.html,经测试有效,收集方便查阅安装 KVM 后都会发现网络接口里多了一个叫做 virbr0的虚拟网络接口一般情况下,虚拟网络接口virbr0用作nat,以允许虚拟机访问网络服务,但nat一般不用于生产环境。我们可以使用以下方法删除virbr01、先使用virshnet-list查看所_kvm virb0 详解

第三方库_列出第三方库-程序员宅基地

文章浏览阅读212次。在iso开发app :第一方库:程序中引入apple提供的库/程序(sdk api)第二方库:我们自己写的基础库/程序第三方库:程序中引入非apple提供的库/程序(例:从别的公司买过来的基础库/程序)..._列出第三方库

随便推点

数据结构与算法真的那么重要么?-程序员宅基地

文章浏览阅读7.4k次,点赞12次,收藏30次。很多同学对数据结构与算法的第一印象,可能是觉得它复杂、深奥、难以理解。之所以会有这种观念,我认为主要是因为没有找到适合自己的学习方法及学习资料。其实学习任何知识点,只要找到对的学习方法和学习资料,都能做到攻克难点,牢牢掌握。另外,同学们可能还有一个疑问:在平时的开发工作中,一个产品,从开发到上线,似乎都不会用到数据结构与算法,也就是说即使不懂数据结构与算法,也能出色地完成日常的工作任务,..._数据结构与算法真的那么重要么

一周搞定Cocos creator(cocos creator 入门篇) 5 - Sprite(精灵)_cocos 3.x sprite 编辑器在哪打开-程序员宅基地

文章浏览阅读827次。Sprite 精灵也是游戏开发中必不可少的元素 游戏中看到的障碍物 怪兽 等,这么说 能看到的图片 他的属性基本都是Sprite这里看下Creator的Sprite在层级管理器-右键-创建节点-创建渲染节点(这里注意) 或者是直接控件库拖拽新建完成后 看下Sp的属性依然 上面部分也就是Node的常用属性 大小 锚点 等,着重看下后面 SpriteFrame,这里可以直接拖拽需要的Sprite过来,上面看下Atlas 也就是代表是否用的图集,这里跟2dx的方式还是不一样的 后面的其他属_cocos 3.x sprite 编辑器在哪打开

牛人博客链接总结_/?newfollowblog-程序员宅基地

文章浏览阅读515次。bkeep:python牛人http://bkeep.blog.163.com/?newFollowBlog书籍:                                            《The Design and Evolution of C++》周涛:_/?newfollowblog

vins中imu融合_vins-fusion代码解读[五] imu在vins里的理解-程序员宅基地

文章浏览阅读463次。SLAM新手,欢迎讨论。IMU作用vins中,IMU只读取IMU六轴的信息,3轴线加速度(加速度计)和3轴角速度(陀螺仪)。通过对陀螺仪的一次积分,直觉上可以获取姿态的变化情况,对加速度的一次积分和二次积分结合陀螺仪的信息,可以获取位置的变换情况。背景知识:IMU: 通常6轴陀螺仪,包括3轴线加速度和3轴角速度。9轴陀螺仪增加3轴地磁信息。MEMS 陀螺仪没有姿态的输出,所有的MEMS陀螺都是非旋..._vins imu

分节符的插入与删除word_分节符怎么删除-程序员宅基地

文章浏览阅读2.5w次,点赞2次,收藏10次。设置分节符1、打开文档,在普通视图下进行操作2、找到布局,点击分隔符,选择符合自己需要的分隔符 3、如果想删除分节符,操作很简单,只要把鼠标光标放到分节符或分页符前面,然后按下键盘 delete(删除键)即可。ps: 如果添加了分节符看不到,或者是显示不出来分节符,可能是菜单栏这个红色的小图标的原因,点一下进行显示/隐藏的切换。..._分节符怎么删除

C++封装MySQL操作函数_c++编译封装mysql的-程序员宅基地

文章浏览阅读1.4w次,点赞44次,收藏39次。C++简单封装MySQL操作函数_c++编译封装mysql的

推荐文章

热门文章

相关标签