RTSP(Real Time Streaming Protocol),是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。HTTP与RTSP相比,HTTP请求由客户机发出,服务器作出响应;使用RTSP时,客户机和服务器都可以发出请求,即RTSP可以是双向的。RTSP是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通讯协定并不在其定义的范围内,服务器端可以自行选择使用TCP或UDP来传送串流内容,它的语法和运作跟HTTP 1.1类似,但并不特别强调时间同步,所以比较能容忍网络延迟。而前面提到的允许同时多个串流需求控制(Multicast),除了可以降低服务器端的网络用量,更进而支持多方视讯会议(Video Conference)。因为与HTTP1.1的运作方式相似,所以代理服务器〈Proxy〉的快取功能〈Cache〉也同样适用于RTSP,并因RTSP具有重新导向功能,可视实际负载情况来转换提供服务的服务器,以避免过大的负载集中于同一服务器而造成延迟。
方法 | 方向 | 要求 | 含义 |
---|---|---|---|
OPTIONS | Client/Server C->S S->C | 要求 | 可在任意时刻发出OPTIONS请求,如用户打算尝试非标准请求,并不影响服务器状态 |
DESCRIBE | C->S | 推荐 | 检查演示或媒体对象的描述,也允许使用接收头指定用户理解的描述格式。DESCRIBE的答复-响应组成媒体RTSP初始阶段 |
PAUSE | C->S | 推荐 | PAUSE请求引起流发送临时中断。如请求URL命名一个流,仅回放和记录被停止;如请求URL命名一个演示或流组,演示或组中所有当前活动的流发送都停止。恢复回放或记录后,必须维持同步。在SETUP消息中连接头超时参数所指定时段期间被暂停后,尽管服务器可能关闭连接并释放资源,但服务器资源会被预订 |
PLAY | C->S | 要求 | PLAY告诉服务器以SETUP指定的机制开始发送数据;直到一些SETUP请求被成功响应,客户端才可发布PLAY请求。PLAY请求将正常播放时间设置在所指定范围的起始处,发送流数据直到范围的结束处。PLAY请求可排成队列,服务器将PLAY请求排成队列,顺序执行 |
SETUP | C->S | 要求 | 对URL的SETUP请求指定用于流媒体的传输机制。客户端对正播放的流发布一个SETUP请求,以改变服务器允许的传输参数。如不允许这样做,响应错误为"455 Method Not Valid In This State”。为了透过防火墙,客户端必须指明传输参数,即使对这些参数没有影响 |
TEARDOWN | C->S | 要求 | TEARDOWN请求停止给定URL流发送,释放相关资源。如URL是此演示URL,任何RTSP连接标识不再有效。除非全部传输参数是连接描述定义的,SETUP请求必须在连接可再次播放前发布 |
GET_PARAMETER | C->S S->C | 可选 | GET_PARAMETER请求检查URL指定的演示与媒体的参数值。没有实体体时,GET_PARAMETER也许能用来测试用户与服务器的连通情况 |
Note:
一般的顺序是:
- OPTIONS
- DESCRIBE
- SETUP
- PLAY
- TEARDOWN
这几个基本上都有,虽然DESCRIBE是推荐项,一般都有
GET_PARAMETER这个我看有的rtsp服务器是没有选择发这个标记的,
我用的这个海康摄像头1却有发GET_PARAMETER
我用的这个海康摄像头1:
我们tcp dump抓包分析(我们的海康摄像头1)
OPTIONS rtsp://172.17.11.155:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 2
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
# OPTIONS :这个是选项,问下服务器我到底有啥本领技能?
RTSP/1.0 200 OK
CSeq: 2
Public: OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER
Date: Tue, May 23 2017 16:08:47 GMT
# 服务器回复你,你有这么多技能:OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER
DESCRIBE rtsp://172.17.11.155:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 3
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Accept: application/sdp
# DESCRIBE :我想让服务器描述一下流的情况,你用sdp的格式告诉我吧
RTSP/1.0 401 Unauthorized
CSeq: 3
WWW-Authenticate: Digest realm="1868cb21d4df", nonce="cfbaf30c677edba80dbd7f0eb1df5db6", stale="FALSE"
WWW-Authenticate: Basic realm="1868cb21d4df"
Date: Tue, May 23 2017 16:08:47 GMT
# 服务器回答,你没有认证(用户密码),所以给你401吧
DESCRIBE rtsp://172.17.11.155:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 4
Authorization: Digest username="admin", realm="1868cb21d4df", nonce="cfbaf30c677edba80dbd7f0eb1df5db6", uri="rtsp://172.17.11.155:554/h264/ch1/main/av_stream", response="8b9d4d3e6ae627b62f430874a8c6e333"
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Accept: application/sdp
# DESCRIBE :我表示不服,再上诉:让服务器描述一下流的情况,你用sdp的格式告诉我吧
RTSP/1.0 200 OK
CSeq: 4
Content-Type: application/sdp
Content-Base: rtsp://172.17.11.155:554/h264/ch1/main/av_stream/
Content-Length: 598
v=0
o=- 1495555727123750 1495555727123750 IN IP4 172.17.10.7
s=Media Presentation
e=NONE
b=AS:5050
t=0 0
a=control:rtsp://172.17.11.155:554/h264/ch1/main/av_stream/
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:5000
a=recvonly
a=x-dimensions:1920,1080
a=control:rtsp://172.17.11.155:554/h264/ch1/main/av_stream/trackID=1
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z00AKpWoHgCJ+WEAAAcIAAFfkAQ=,aO48gA==
a=Media_header:MEDIAINFO=494D4B48010200000400000100000000000000000000000000000000000000000000000000000000;
a=appversion:1.0
# 服务器答应了,然后把SDP发给我了
# 里面有各种信息:我看到只有一路视频,1080P的,H264编码;
# 96是视频流ID, 这符合规范,mediainfo可能是sps pps的加密信息
SETUP rtsp://172.17.11.155:554/h264/ch1/main/av_stream/trackID=1 RTSP/1.0
CSeq: 5
Authorization: Digest username="admin", realm="1868cb21d4df", nonce="cfbaf30c677edba80dbd7f0eb1df5db6", uri="rtsp://172.17.11.155:554/h264/ch1/main/av_stream/", response="a34897f9b42eb7f501d549f6fa558838"
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
# SETUP :为了透过防火墙,我想指定传输机制RTP/AVP/TCP告诉服务器
RTSP/1.0 200 OK
CSeq: 5
Session: 313720730;timeout=60
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=72a9bdb8;mode="play"
Date: Tue, May 23 2017 16:08:47 GMT
# 服务器准了,并告诉你可以play了
PLAY rtsp://172.17.11.155:554/h264/ch1/main/av_stream/ RTSP/1.0
CSeq: 6
Authorization: Digest username="admin", realm="1868cb21d4df", nonce="cfbaf30c677edba80dbd7f0eb1df5db6", uri="rtsp://172.17.11.155:554/h264/ch1/main/av_stream/", response="13e073b1f7a0d1be0442491ba4613c35"
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Session: 313720730
Range: npt=0.000-
# PLAY :我想告诉服务器以SETUP指定的机制开始发送数据;
# 还可以用关键字Range指定play的范围
RTSP/1.0 200 OK
CSeq: 6
Session: 313720730
RTP-Info: url=rtsp://172.17.11.155:554/h264/ch1/main/av_stream/trackID=1;seq=13657;rtptime=106503066
Date: Tue, May 23 2017 16:08:47 GMT
# 服务器很听话,给到了初始的随机序列号和随机时间戳seq=13657;rtptime=106503066
GET_PARAMETER rtsp://172.17.11.155:554/h264/ch1/main/av_stream/ RTSP/1.0
CSeq: 7
Authorization: Digest username="admin", realm="1868cb21d4df", nonce="cfbaf30c677edba80dbd7f0eb1df5db6", uri="rtsp://172.17.11.155:554/h264/ch1/main/av_stream/", response="5845426a0c6ce7ca7839ac9e639d7197"
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Session: 313720730
# GET_PARAMETER :我请求检查URL指定的演示与媒体的参数值。
# 没有实体体时,也许能用来测试用户与服务器的连通情况
$.. .`5Y.Y..r...gM.*......a......_..$....`5Z.Y..r...h.<.$....`5[.Y..r......y....$....`5\.Y..r...|....sT...e....Z&x]A....UF...8..I..O...x.4ZC/|$..
# 一堆数据?
TEARDOWN rtsp://172.17.11.155:554/h264/ch1/main/av_stream/ RTSP/1.0
CSeq: 14
Authorization: Digest username="admin", realm="1868cb21d4df", nonce="cfbaf30c677edba80dbd7f0eb1df5db6", uri="rtsp://172.17.11.155:554/h264/ch1/main/av_stream/", response="a52194fbc2c6433e1f1dbf33576a7f7c"
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Session: 313720730
$..(......[.r.........l...................[.
# TEARDOWN :不玩了,就停止给定URL流发送数据,并释放相关资源
RTSP/1.0 200 OK
CSeq: 14
Session: 313720730
Date: Tue, May 23 2017 16:15:10 GMT
# 好的,服务器说:对你这个会话Session: 313720730, 我把它干掉
接下来,我们来分析下别人家的(TDRX)
他们家是没有GET_PARAMETER 的,但是有sdp,就是打红圈的那里
但是sdp好像有点不对
同样,详细分析下:
OPTIONS rtsp://192.168.1.211:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 2
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
# OPTIONS 和前面的一样
RTSP/1.0 200 OK
CSeq: 2
Public: DESCRIBE, PLAY, PAUSE, SETUP, OPTIONS, TEARDOWN, SET_PARAMETER
# 和前面的一样,服务器回复你的能力: DESCRIBE, PLAY, PAUSE, SETUP, OPTIONS, TEARDOWN, SET_PARAMETER
# 和之前比,少了个GET_PARAMETER
DESCRIBE rtsp://192.168.1.211:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 3
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Accept: application/sdp
# DESCRIBE 和前面的一样
RTSP/1.0 401 Unauthorized
CSeq: 3
WWW-Authenticate: Basic realm="/"
# 和前面的一样;
# 服务器回答,你没有认证(用户密码),所以给你401吧
# 区别在于比我的少了WWW-Authenticate: Digest realm="1868cb21d4df", nonce="cfbaf30c677edba80dbd7f0eb1df5db6", stale="FALSE"
DESCRIBE rtsp://192.168.1.211:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 4
Authorization: Basic YWRtaW46MTIzNDU=
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Accept: application/sdp
# 和前面一样: 我表示不服,再上诉:让服务器描述一下流的情况,你用sdp的格式告诉我吧
# 区别在于比我的少了WWW-Authenticate: Digest realm="1868cb21d4df", nonce="cfbaf30c677edba80dbd7f0eb1df5db6", stale="FALSE"
RTSP/1.0 200 OK
CSeq: 4
Content-Type: application/sdp
Content-Length: 499
v=0
o=- 1109162014219182 1109162014219192 IN IP4 x.y.z.w
s=Media Presentation
e=NONE
c=IN IP4 0.0.0.0
t=0 0
a=control:*
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=control:trackID=1
a=fmtp:96 profile-level-id=4D0014;packetization-mode=0;sprop-parameter-sets=Z0KAKIiLQCgC3QgAABdwAAr8gCA=,aM44gA==
m=audio 0 RTP/AVP 0
a=rtpmap:0 PCMU/8000
a=control:trackID=2
a=Media_header:MEDIAINFO=494D4B48010100000400000110710110401F000000FA000000000000000000000000000000000000;
a=appversion:1.0
# 服务器答应了,然后把SDP发给我了
# 里面有各种信息:我看到只有一路视频,1080P的,H264编码;
# 96是视频流ID, 这符合规范,mediainfo可能是sps pps的加密信息
# trackID=1 是视频; trackID=2 是音频,音频格式是PCMU 8K的,监控常用
# 问题来了: m=audio 0 RTP/AVP 0 音频的ID按协议应该是97(m=audio 0 RTP/AVP 97)
# 根据sdp草案,写0可能也不算bug,具体再细看
# sdp: https://wenku.baidu.com/view/f5e3838102d276a200292ed5.html
SETUP rtsp://192.168.1.211:554/h264/ch1/main/av_stream/trackID=1 RTSP/1.0
CSeq: 5
Authorization: Basic YWRtaW46MTIzNDU=
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Transport: RTP/AVP;unicast;client_port=63234-63235
# SETUP :为了透过防火墙,我想指定传输机制RTP/AVP/TCP告诉服务器
# interleaved变成了client_port; 我那边是:Transport: RTP/AVP/TCP;unicast;interleaved=0-1,这个不清楚有无影响
# trackID=1 这路是音频
RTSP/1.0 200 OK
CSeq: 5
Session: 1095657681
Transport: RTP/AVP;unicast;client_port=63234-63235;server_port=8813-8814;ssrc=55667788
# 服务器准了这路音频,不过回复不一样,也没告诉你可以play了
# 我的是这样的:Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=72a9bdb8;mode="play"
SETUP rtsp://192.168.1.211:554/h264/ch1/main/av_stream/trackID=2 RTSP/1.0
CSeq: 6
Authorization: Basic YWRtaW46MTIzNDU=
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Transport: RTP/AVP;unicast;client_port=63236-63237
Session: 1095657681
# trackID=2 这路是视频
RTSP/1.0 200 OK
CSeq: 6
Session: 1095657681
Transport: RTP/AVP;unicast;client_port=63236-63237;server_port=8813-8814;ssrc=55667788
# 准了这路视频
PLAY rtsp://192.168.1.211:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 7
Authorization: Basic YWRtaW46MTIzNDU=
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Session: 1095657681
Range: npt=0.000-
# 和之前一样,PLAY :我想告诉服务器以SETUP指定的机制开始发送数据;
# 还可以用关键字Range指定play的范围
RTSP/1.0 200 OK
CSeq: 7
Session: 1095657681
Range: npt=now-
RTP-Info: url=trackID=1;seq=6575,url=trackID=2;seq=43949
RTSP/1.0 200 OK
CSeq: 7
Session: 1095657681
Range: npt=now-
RTP-Info: url=trackID=1;seq=6575,url=trackID=2;seq=43949
# 为啥发两次一模一样的?
TEARDOWN rtsp://192.168.1.211:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 8
Authorization: Basic YWRtaW46MTIzNDU=
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Session: 1095657681
# 和之前一样TEARDOWN :不玩了,就停止给定URL流发送数据,并释放相关资源
RTSP/1.0 200 OK
CSeq: 8
Session: 1095657681
Connection: close
# 服务器关闭了会话,告诉你一下,后会无期~~