wireshark解析RTSP交互
RTSP信令交互
RTSP协议即实时流协议(Real TIme Streaming Protocol,RTSP)是一种网络应用协议,用以控制流媒体服务器信息交互。大多数RTSP服务器使用实时传输协议(RTP)和实时传输控制协议(RTCP)结合媒体流传输。即客户端和服务器先进行RTSP交互,获取服务端可用命令,以及媒体参数;之后传输数据的时候传输的是RTP封装的数据包;
下边的描述中,客户端就是我发送RTSP请求的那端,本例子中我使用的是VLC拉流,VLC就是客户端;服务端就是“设备”,是一个带存储功能的服务器设备;
简单的交互流程图:以RTSP over tcp为例,当然RTSP数据传输也可以使用UDP:
1 客户端和服务器进行RTSP交互过程中,我们通过TCP进行协议交互;首先就是TCP3次握手
2 RTSP交互,首先是客户端发送options命令给服务端,用来查询服务端支持的命令种类【设备是海康的】
请求的具体内容:
设备回复可用的方法:
3客户端向服务端发送describe命令,获取SDP信息
客户端发送describe请求:
设备回复:(该设备是海康的存储设备)
这里注意,客户端与某些设备【服务端】交互的时候,第一次发送describe,设备会回复401,此时客户端需要携带服务端上次回复的认证信息,再次发送describe;
设备回复SDP信息(下次客户端发送setup请求的URL就是media attribute里的control-URL):
4 客户端向服务端发起SETUP命令,建立会话链接:
这里注意,setup有个重要参数,无论是接收推流,还是代理拉流,使用TCP还是UDP进行数据传输? 是setup里标注的
客户端发送的请求:(有音视频两个track的话,setup请求两次)
注意,setup命令使用的URL是服务端返回的SDP中的control信息,如果setup用错了URL,服务端会回复415 Unsupported media type;
设备端的回复:
5 客户端向服务端发起播放请求
客户端发送play请求:
“PLAY”请求中,URL就是你RTSP请求拉流的URL,不带用户名和密码;里边的range很重要,也需要带上;避免拉回放流出现时间对不上的问题【拉早上7点,得到的是早上5点,这种其实就与play命令的URL和range有关】
“ Range头可能包含一个时间参数。该参数以UTC格式指定了播放开始的时间。如果在这个指定时间后收到消息,那么播放立即开始。时间参数可能用来帮助同步从不同数据源获取的数据流。
不含Range头的PLAY请求也是合法的。它从媒体流开头开始播放,直到媒体流被暂停。如果媒体流通过PAUSE暂停,媒体流传输将在暂停点(the pause point)重新开始。(只不过有些厂家解析RTSP请求的时候,range起到了重要作用)
如果媒体流正在播放,那么这样一个PLAY请求将不起更多的作用,只是客户端可以用此来测试服务器是否存活。---来源于雷神的博客 ”
设备返回OK:如果你是pause转play,paly的回复可能某些流媒体服务器也会带range,这个range有些播放器会使用,所以要注意它的正确性;会影响播放器PTS的计算;
play信令的回复还有下边这种样式(海康的设备回复千变万化)
播放过程中你还可以发送其他请求,这里不再做其他操作;播放过程的数据交互
6 结束会话
客户端向服务端发送结束会话请求:
如果是点播:一般是服务端本段时间的数据发完了,客户端收数据超时,触发teardown;或者有些客户端自己开发解析play信令的Range返回值,接收到满足Range时间段就不接收了;目前看到的基本都是客户端发teardown;结束;
客户端向服务端发送RTCP控制协议goodbye:
设备(服务端)应答:
结束TCP会话:强制关闭TCP链接(没有用四次挥手)使用 RST ACK;
7 RTSP标准错误码
1 ”100” ; Continue (all 100 range) 2 3 “110”; Connect Timeout 4 5 “200” ; OK 6 7 ”201” ; Created 8 9 ”250” ; Low on Storage Space 10 11 ”300” ; Multiple Choices 12 13 ”301” ; Moved Permanently 14 15 ”302” ; Moved Temporarily 16 17 ”303” ; See Other 18 19 ”304” ; Not Modified 20 21 ”305” ; Use Proxy 22 23 ”350” ; Going Away 24 25 ”351” ; Load Balancing 26 27 ”400” ; Bad Request 28 29 ”401” ; Unauthorized 告诉发出请求的那端,带上401回给你的信息,并加密 30 31 ”402” ; Payment Required 32 33 ”403” ; Forbidden 信令交互过程中,出现不支持的信令;解析不到信令头等,返回403 34 35 ”404” ; Not Found 36 37 ”405” ; Method Not Allowed 38 39 ”406” ; Not Acceptable 40 41 ”407” ; Proxy Authentication Required 42 43 ”408” ; Request Time-out 44 45 ”410” ; Gone 46 47 ”411” ; Length Required 48 49 ”412” ; Precondition Failed 50 51 ”413” ; Request Entity Too Large 52 53 ”414” ; Request-URI Too Large 54 55 ”415” ; Unsupported Media Type 56 57 ”451” ; Parameter Not Understood 58 59 ”452” ; reserved 60 61 ”453” ; Not Enough Bandwidth 一般是摄像机不支持多路预览,或者多路输出;反应摄像机能力集有限 62 63 ”454” ; Session Not Found 64 65 ”455” ; Method Not Valid in This State 66 67 ”456” ; Header Field Not Valid for Resource 68 69 ”457” ; Invalid Range 70 71 ”458” ; Parameter Is Read-Only 72 73 ”459” ; Aggregate operation not allowed 74 75 ”460” ; Only aggregate operation allowed 76 77 ”461” ; Unsupported transport 78 79 ”462” ; Destination unreachable 80 81 ”500” ; Internal Server Error 82 83 ”501” ; Not Implemented 你的请求未实现,返回 reply 501 84 85 ”502” ; Bad Gateway 86 87 ”503” ; Service Unavailable 88 89 ”504” ; Gateway Time out 90 91 ”505” ; RTSP Version not supported 92 93 ”551” ; Option not supported
http中错误码101 表示切换应用层协议成功的返回,比如HTTP协议切换成websocket协议;