协议圣经 RTSP

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了协议圣经 RTSP相关的知识,希望对你有一定的参考价值。

rtsp协议

所有代码实例可能使用go c c++ java nodejs 等任何一种语言 协议捕获使用wireshark

Real Time Streaming Protocol 实时流协议。这个协议是大街小巷的人都知道的,谈熟悉他不容易,必须要懂RTP和RTCP协议:
RTP 实时传输协议 Real-time Transport Protocol,
RTCP 实时传输控制协议 Real-time ControlProto
rtsp的传输层是可以使用udp 和 tcp 的,所以可以说RTP是一种半传输层和半应用层协议,他是这么定义的,所以一定要分开。

打开wireshark
wireshark

在wireshark里面选择网卡接口,在filter 里面 输入 port 554 ,意味着我们在rtsp协议默认端口554 端口监听所有数据

再打开一个wireshark,输入

udp and host 192.168.0.102 and not host 239.255.255.250 and not host 224.0.0.251
表示我们抓去一个ip地址的包,但是去除ssdp协议的包和mdns协议的包,其中239.255.255.250 是upnp ssdp协议组播地址,224.0.0.251 是mdns协议组播地址,显然是给苹果的投屏协议所用。这并不会去除其他的包,网络中还有更厉害的广播包,也就是255.255.255.255,如果想去除,也可以把这个选项加上。
抓去udp包

接下来我们启动一个rtsp的server,最简单的莫过于live555
live555 server
打开后,我们再使用一个工具vlc, 去打开一个rtsp 的文件 2.264,地址为rtsp://
在这里插入图片描述

1、tcp交互

我们知道rtsp协议是可以使用tcp也可以使用udp来传输,但是信令这一段都是tcp,保证信令完整传输之后,其他如音视频等传输就可以使用面向无连接的udp,这是使用了RTP实时传输协议和RTCP 实时传输控制协议。

OPTIONS rtsp://192.168.0.129:554/2.264 RTSP/1.0
CSeq: 1
User-Agent: Lavf57.71.100

RTSP/1.0 200 OK
CSeq: 1
Date: Tue, Jun 29 2021 00:50:12 GMT
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER

DESCRIBE rtsp://192.168.0.129:554/2.264 RTSP/1.0
Accept: application/sdp
CSeq: 2
User-Agent: Lavf57.71.100

RTSP/1.0 200 OK
CSeq: 2
Date: Tue, Jun 29 2021 00:50:12 GMT
Content-Base: rtsp://192.168.0.129/2.264/
Content-Type: application/sdp
Content-Length: 515

v=0
o=- 1624927812345800 1 IN IP4 192.168.0.129
s=H.264 Video, streamed by the LIVE555 Media Server
i=2.264
t=0 0
a=tool:LIVE555 Streaming Media v2017.07.18
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:H.264 Video, streamed by the LIVE555 Media Server
a=x-qt-text-inf:2.264
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:500
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=64001E;sprop-parameter-sets=Z2QAHqzZQKAv+WbIAAADAAgAAAMBkHixbLA=,aOvjyyLA
a=control:track1
SETUP rtsp://192.168.0.129/2.264/track1 RTSP/1.0
Transport: RTP/AVP/UDP;unicast;client_port=26818-26819
CSeq: 3
User-Agent: Lavf57.71.100

RTSP/1.0 200 OK
CSeq: 3
Date: Tue, Jun 29 2021 00:50:12 GMT
Transport: RTP/AVP;unicast;destination=192.168.0.102;source=192.168.0.129;client_port=26818-26819;server_port=6970-6971
Session: 552C06BF;timeout=65

PLAY rtsp://192.168.0.129/2.264/ RTSP/1.0
Range: npt=end-
CSeq: 4
User-Agent: Lavf57.71.100
Session: 552C06BF

RTSP/1.0 200 OK
CSeq: 4
Date: Tue, Jun 29 2021 00:50:12 GMT
Range: npt=0.000-
Session: 552C06BF
RTP-Info: url=rtsp://192.168.0.129/2.264/track1;seq=64552;rtptime=4216659733

GET_PARAMETER rtsp://192.168.0.129/2.264/ RTSP/1.0
CSeq: 5
User-Agent: Lavf57.71.100
Session: 552C06BF

RTSP/1.0 200 OK
CSeq: 5
Date: Tue, Jun 29 2021 00:50:44 GMT
Session: 552C06BF
Content-Length: 10

2017.07.18GET_PARAMETER rtsp://192.168.0.129/2.264/ RTSP/1.0
CSeq: 6
User-Agent: Lavf57.71.100
Session: 552C06BF

RTSP/1.0 200 OK
CSeq: 6
Date: Tue, Jun 29 2021 00:51:16 GMT
Session: 552C06BF
Content-Length: 10

2017.07.18GET_PARAMETER rtsp://192.168.0.129/2.264/ RTSP/1.0
CSeq: 7
User-Agent: Lavf57.71.100
Session: 552C06BF

RTSP/1.0 200 OK
CSeq: 7
Date: Tue, Jun 29 2021 00:51:48 GMT
Session: 552C06BF
Content-Length: 10

2017.07.18GET_PARAMETER rtsp://192.168.0.129/2.264/ RTSP/1.0
CSeq: 8
User-Agent: Lavf57.71.100
Session: 552C06BF

RTSP/1.0 200 OK
CSeq: 8
Date: Tue, Jun 29 2021 00:52:20 GMT
Session: 552C06BF
Content-Length: 10

2017.07.18GET_PARAMETER rtsp://192.168.0.129/2.264/ RTSP/1.0
CSeq: 9
User-Agent: Lavf57.71.100
Session: 552C06BF

RTSP/1.0 200 OK
CSeq: 9
Date: Tue, Jun 29 2021 00:52:52 GMT
Session: 552C06BF
Content-Length: 10

2017.07.18GET_PARAMETER rtsp://192.168.0.129/2.264/ RTSP/1.0
CSeq: 10
User-Agent: Lavf57.71.100
Session: 552C06BF

RTSP/1.0 200 OK
CSeq: 10
Date: Tue, Jun 29 2021 00:53:24 GMT
Session: 552C06BF
Content-Length: 10

2017.07.18

以上为包的整个追踪,客户端options,服务端回复200 OK,和http协议及其类似,同时带回能力:

Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER

这个交互过程非常简单明了,所以写一段rtsp程序的信令并不复杂,整个过程中只有一段比较复杂,分析以下这一段是什么?

a=fmtp:96 packetization-mode=1;profile-level-id=64001E;sprop-parameter-sets=Z2QAHqzZQKAv+WbIAAADAAgAAAMBkHixbLA=,aOvjyyLA

实际上,他的意思是映射哪位96的包使用的profile level 和sps信息的base64编码,因为rtsp协议和http协议一样为文本协议,所以这里把二进制的sps编码成了base64.信令过程结束以后,如果不使用tcp来传输,就开始了udp传输协议。而上面有一段指明了udp传输的端口,就是以下这一段:

Transport: RTP/AVP/UDP;unicast;client_port=26818-26819

以上表明接收端在26818端口接收RTP数据,在26819接收RTCP数据,抓包的过程也可以看出,源地址将数据送往了26818端口

rtp 和 rtcp 端口

2、udp

看到我们的udp捕获里面有RDT 和 RTCP,设定的内部发包MTU大小约为1450字节左右,去除14byte 以太网头部,20byte IP头部,8 byte UDP 头部,剩下的是UDP 数据 部分。
在这里插入图片描述
一看到以80 16进制数据开头,基本就知道是RTP包了,可以看出,除了RDT以外,RDT实际上意思就是real data trasnport的意思,还有RTCP的RR包,也就是收到包以后,目的地址给源发包地址返回收包统计。

rtsp协议的信令和http协议是极其类似的,超文本传输协议http的好处就是简单明了,我们来看一下http协议的一段描述
HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程
(1)客户与服务器建立连接;
(2)客户向服务器提出请求;
(3)服务器接受请求,并根据请求返回相应的文件作为应答;
(4)客户与服务器关闭连接。
上面一段说明了http协议是面向链接的,也就是说http协议在传输层是使用tcp的,那么是否http协议就没有改进呢,答案是否,一切定义皆人为,http协议3 使用quic协议,这是建立在udp基础之上的,http协议我们后面再讲,而rtsp协议也是类似的,他的传输层使用tcp还是udp,一切都是依靠编程人员。

code

我们会在下一章开始写rtsp服务器和rtsp客户端。

以上是关于协议圣经 RTSP的主要内容,如果未能解决你的问题,请参考以下文章

协议圣经 四 rtspclient

协议圣经 -协议之服务编写

基于EasyDarwin的实现无人机远程视频传输--RTSP协议分析篇

rtsp协议格式解析

RTSP/Onvif协议EasyNVR平台文字过长则显示文字title的组件开发及使用附代码

协议圣经 RTP组播音视频技巧