RTSP抓包详解

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:

my.png

我们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好像有点不对

tdrx.png

同样,详细分析下:

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
# 服务器关闭了会话,告诉你一下,后会无期~~
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • RFC 2326RTSP Spec中文版(1-11)RTSP Spec中文版(12-16)RTSP Spec中文版...
    SniperPan阅读 5,486评论 3 10
  • 上一篇Live555源码解析(1) - Main 寻根问祖,留其筋骨将main()函数脉络做了整体分析,通常来讲本...
    SniperPan阅读 4,440评论 0 14
  • RTSP Spec中文版(1-11)RTSP Spec中文版(12-16)RTSP Spec中文版(附录) 12 ...
    SniperPan阅读 1,276评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 又到一年清明(其实是又到每月一个假),依旧回家。 作为有心要考研的大三学生,回家还带了本书作为心里安慰,事实上并没...
    子谓鱼阅读 208评论 0 0