RTSP协议入门基础
(一)RTSP身世:
RTSP全称是Real Time Streaming Protocol 实时流传输协议是Real Network和Netscape共同提出的在互联网上传输流媒体数据(包括视频和音频数据)的应用层协议。RTSP的作用相当于遥控器可以对远端的服务器进行控制(播放,暂停,终止等)。可以选择使用TCP或UDP来传送串流内容,语法跟HTTP 1.1类似,用的端口号是554。(ps:先提示一下rtsp只是命令控制,传输具体的音视频数据是由rtp协议传输的,还有rtcp用于传输质量监控和会话成员管理)。RTSP被广泛用于安防,在线教育,直播等领域。感兴趣的读者可以详细研读rfc2326.pdf这份文档。
(二)RTSP通信交互过程:
计算机编程领域里所有通信交互就好比人与人之间的沟通,有问有答。世界上人与人之间的沟通也有很多语言如英语,汉语等(对应到计算机就是通信协议)。语言(协议)都是约定俗成的。rtsp类似于http使用纯文本来发送消息,rtsp是有状态的下面先总体看看rtsp基本交互步骤:
由上图可以知道:RTSP操作过程首先,客户端连接到流服务器并发送一个OPTIONS查询服务端支持的方法 ,服务端返回支持的方法。客户端再发送RTSP描述命令(DESCRIBE),服务端通过一个SDP描述来进行回复,回复信息包括流数量、媒体类型等信息。客户端再分析该SDP描述,并为会话中的每一个流发送一个RTSP建立命令(SETUP),RTSP建立命令告诉服务器客户端用于接收媒体数据的端口。流媒体连接建立完成后,客户端发送一个播放命令(PLAY),服务端就开始在UDP端口上传送媒体流(RTP包)到客户端。 在播放过程中客户端还可以向服务器发送命令来控制快进、快退和暂停等。最后,客户端可发送一个终止命令(TERADOWN)来结束流媒体会话。
(三)RTSP的消息格式:
RTSP消息分为两类,请求消息(request)和 回应消息(ressponse)。
1 请求消息(request)
先上个直观的图吧:
由图可知:
请求消息由 方法+URI+RTSP版本号,之后跟一条或多条消息。
URI:表示接收方的地址,如rtsp://192.168.0.110:8554/rtsp
CR:表示回车。LF:表示换行。
RTSP使用消息类型和消息体来表示不同类型的消息。最后一条消息要使用两个CR LF。
看看wireshark的抓包看一个RTSP的请求消息:
如图中所示,该RTSP请求消息的方法为OPTIONS,请求的目标地址为rtsp://192.168.0.110:8554/rtsp,RTSP的版本为1.0;
接者包含两条消息,第一条为CSeq表示序列号,本次请求的序列号为2;
第二条为User-Agent,表示用户代理,值为”User-Agent: LibVLC/3.0.1 (LIVE555 Streaming Media v2018.02.18)”;
User-Agent做为最后一条消息,其后要跟两组回车和换行!
2 回应消息(response)
先上图:
回应消息由RTSP版本号+状态码+解释开头,之后跟一条或多条消息!
说明:
状态码:表示状态,同http的返回状态,如200,表示OK
解释:针对状态码的文本解释
最后一条消息也是需要 跟两个回车和换行!
来看抓包的数据:
回复消息以Response标识,该消息中RTSP的版本号为1.0;
服务器回复的状态码为:200,解释为:ok;
- 消息内容为 Server类型,内容为VLC/2.2.8.
对RTSP消息的结构就有了比较全面的了解了!接下来我们来讲一讲sdp的详细格式。
(四)SDP的格式详解:
简介:
sdp,英文全称Session Description Protocol会话描述协议,对应RFC2327。RTSP协议中使用sdp进行媒体信息的描述(客户端发送describe后服务端以sdb方式回复).sdp还应用在语音通话SIP协议,监控安防GB28181国标, webRtc等。
sdp格式:
sdp信息由多行"<type>=<value>"组成,其中<type>是一个字符串,<value>是一个字符串,type表示类型,value的格式视type而定,整个协议区分大小写,"="两侧不允许有空格。有点类似键值对。sdp会话描述包含一个会话级描述(session_level_description)和多个媒体级描述(media_level description)组成。会话级描述的作用域是整个会话,其位置从"v="行开始到第一个媒体描述为止;媒体级描述是对单个的媒体流进行描述,如传输过程中的视频流信息,从m=开始到下一个媒体描述为止,如下图所示:
会话级描述主要包含以下字段
媒体级描述主要包含以下字段
上述图片中有些行是必须要的,带*号标记的行是可选的。必选的字段包括v=,o=,s=,t=,(对于会话级描述必选)m=(对于媒体级会话描述必选)。
各字段描述 :
1.version(必选)
格式: v=<version>
描述: 表示sdp的版本号,不包含次版本号
我们来看一个抓包数据:
2.origin(必选)
格式:o=<username> <sessionid> <version> <network type> <address type> <address>
描述:o=选项对会话的发起者进行了描述;
<username>:是用户的登录名,;
<session id>:会话id,必须是唯一的,建议使用个NTP 时间戳;
<version>: 该会话公告的版本,
<networktype>: 网络类型,一般为"IN",表示internet
<addresstype>: 地址类型,一般为IP4
<adress>:地址.
3.Session Name(必选)
格式:s=
会话名称,在整个会话中有且只有1个"s="
4.Connection Data(可选)
格式: c=<networktype> <address type> <connection address>描述:表示媒体连接信息;一个会话级描述中必须有"c="或者在每个媒体级描述中有一个"c="选项,也可能在会话级描述和媒体级描述中都有"c="选项;
network type表示网络类型,一般为IN,表示internet;
address type,地址类型,一般为IP4;
connection address,地址,可能为域名或ip地址两种形式
5.Bandwidth(可选)
格式: b=<modifier>:<bandwidth-value>
描述:该选项描述了建议的带宽,单位 kbs/s,可选,modifier包括两种类型,CT和AS,CT表示总带宽,AS表示单个媒体带宽的最大值;bandwidth-value表示具体的带宽。
6.Times(必选)
格式:t=<start time> <stop time>
描述:t字段描述了会话的开始时间和结束时间,<start time> <stop time>为NTP时间,单位是秒;如果<stop time>为0表示过了<start time>之后,会话一直持续;当<start time> 和<stop time>都为0的时候,表示持久会话;
start time和stop time均为0,表示一个持久的会话。
7.email(可选)
格式:e=<email address>
描述:用来描述邮件地址。Vlc里没有抓包到这个。
8.phone number(可选)
格式:p=<phone number>
描述:比较简单,用来描述电话号码
9.URI(可选)
格式:u=<uri>
描述:类似于url的一个值,这里不过多介绍了
10.a=(*) (可选)
格式 :a=<*>
描述:表示一个会话级别或媒体级别下的0个或多个属性
来看一个抓包文件:
11.media information(必选)
格式:m=<media> <port> <transport type> <fmt list>
描述:
<media>表示媒体类型
有"audio","video","application","data"(不向用户显示的数据),"control"(描述额外的控制通道);
<port>表示媒体流发往传输层的端口,对于RTP,偶数端口用来传输数据,奇数端口用来发RTCP数据;
RTP数据发向偶数的UDP端口,而对应的控制信号RTCP数据发向相邻的奇数UDP端口(偶数的UDP端口+1)
<transport>表示传输协议,与"c="一行相关联,一般用RTP/AVP表示,即 Realtime Transport Protocol using the Audio/Video profile over udp,即我们常说的RTP over udp;
<fmt list>表示媒体格式,分为静态绑定和动态绑定
静态绑定:媒体编码方式与RTP负载类型有确定的一一对应关系,如: m=audio 0 RTP/AVP 8
动态绑定:媒体编码方式没有完全确定,需要使用rtpmap进行进一步的说明: 如:
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
12. rtpmap(可选)
格式:a=rtpmap:<payload typee> <encoding name>/<clock rate>
描述:
payload type表示动态负载类型,如 98表示h264
encoding name表示编码名称,如H.264
clock rate表示时钟频率,如90000
我们来看一个抓包文件:
至此,我们把RTSP的基础知识点讲完了,下一篇我们将详细讲解rtsp基本操作。