服务器 > 网络 > 网络协议

【音视频 | RTSP】RTSP协议详解 及 抓包例子解析(详细而不赘述)

68人参与 2024-08-06 网络协议

本文未经允许,不得转发!!!


在这里插入图片描述

🎄一、概述

rtsp,全称时 real time streaming protocol,实时流媒体协议,是tcp/ip协议体系中的一个应用层协议,由哥伦比亚大学、网景和realnetworks公司提交的 ietf rfc 标准。

关于 rtsp 协议的官方文档是 rfc2326,文档链接 :rfc2326-real time streaming protocol (rtsp)

rtsp 协议的语法和操作参考了 http/1.1,基于文本的协议,采用iso10646字符集,使用utf-8编码;承载rtsp的传输层协议为tcp,默认端口554;如果是rtsp-over-http tunneling,则默认tcp端口为8080;一般与rtp/rtcp协议搭配使用,由rtp协议传输实时流数据,rtcp协议完成数据流和控制命令的传输。

在这里插入图片描述


在这里插入图片描述

🎄二、rtsp 方法

rtsp常用的方法包括:options、describe、setup、play、pause、teardown、announce、get_parameter和set_parameter等。详细使用介绍如下:

上面总共介绍了 11 个rtsp方法,其中,setupplayteardown三个命令是 rtsp 流程中必须的,其他方法非必须。而announceget_parameterset_parameter三个命令既可以是客户端发给服务端,也可以是服务端发给客户端,其他命令都是客户端发给服务端的。


在这里插入图片描述

🎄三、rtsp 的 请求报文 与 响应报文

rtsp有两类报文:请求报文和响应报文。请求报文是指从客户向服务器发送请求报文,响应报文是指从服务器到客户的应答。

✨3.1 、rtsp 的 请求报文

rtsp请求报文由请求行、请求头部和请求体三个部分组成。其中,请求行是必须的,而请求头部和请求体则根据具体情况可选。
在这里插入图片描述

✨3.2 、rtsp 的 响应报文

rtsp请求报文由状态行、响应头部和响应体三个部分组成。其中,状态行是必须的,而响应头部和响应体则根据具体情况可选。
在这里插入图片描述

在这里插入图片描述

🎄四、rtsp 报文的常用字段

rtsp报文的响应头会包含一些字段,下面是一些常用的字段:


在这里插入图片描述

🎄五、rtsp 流程抓包解析

使用wireshark抓取rtsp流媒体的网络包,可以看到其大概流程如下:
1、客户端发送options方法,服务端回复;
2、客户端发送describe方法,服务端回复;
3、客户端发送setup方法,服务端回复;
2、客户端发送play方法,服务端回复;
2、客户端发送teardown方法,服务端回复;
在这里插入图片描述
完整的取流报文如下:

options rtsp://192.168.3.225:554/wbc rtsp/1.0
cseq: 2
user-agent: libvlc/3.0.19 (live555 streaming media v2016.11.28)

rtsp/1.0 200 ok
cseq: 2
date: wed, jul 03 2024 14:42:11 gmt
public: options, describe, setup, teardown, play, pause, get_parameter, set_parameter

describe rtsp://192.168.3.225:554/wbc rtsp/1.0
cseq: 3
user-agent: libvlc/3.0.19 (live555 streaming media v2016.11.28)
accept: application/sdp

rtsp/1.0 200 ok
cseq: 3
date: wed, jul 03 2024 14:42:11 gmt
content-base: rtsp://192.168.3.225/wbc/
content-type: application/sdp
content-length: 472

v=0
o=- 1720014950032000 1 in ip4 192.168.3.225
s=live555 streaming media v2016.07.19
i=wbc
t=0 0
a=tool:live555 streaming media v2016.07.19
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:live555 streaming media v2016.07.19
a=x-qt-text-inf:wbc
m=video 0 rtp/avp 96
c=in ip4 0.0.0.0
b=as:5000
a=rtpmap:96 h264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=640029;sprop-parameter-sets=z2qakawsaohgcj+wbgoccgq=,ao4xshs=
a=control:track1
setup rtsp://192.168.3.225/wbc/track1 rtsp/1.0
cseq: 4
user-agent: libvlc/3.0.19 (live555 streaming media v2016.11.28)
transport: rtp/avp;unicast;client_port=55320-55321

rtsp/1.0 200 ok
cseq: 4
date: wed, jul 03 2024 14:42:11 gmt
transport: rtp/avp;unicast;destination=192.168.2.180;source=192.168.3.225;client_port=55320-55321;server_port=6970-6971
session: 4581e0ae;timeout=65

play rtsp://192.168.3.225/wbc/ rtsp/1.0
cseq: 5
user-agent: libvlc/3.0.19 (live555 streaming media v2016.11.28)
session: 4581e0ae
range: npt=0.000-

rtsp/1.0 200 ok
cseq: 5
date: wed, jul 03 2024 14:42:11 gmt
range: npt=0.000-
session: 4581e0ae
rtp-info: url=rtsp://192.168.3.225/wbc/track1;seq=7880;rtptime=3548171463

teardown rtsp://192.168.3.225/wbc/ rtsp/1.0
cseq: 6
user-agent: libvlc/3.0.19 (live555 streaming media v2016.11.28)
session: 4581e0ae

rtsp/1.0 200 ok
cseq: 6
date: wed, jul 03 2024 14:42:19 gmt

下面将解析上个这段报文中用到的各个rtsp方法和响应。

✨5.1、option 方法

向服务器获取可用的方法:
在这里插入图片描述
客户端发送 options 方法,并使用 cseq 指明请求序列号,使用 user-agent 指明自己的代理;
服务端会响应请求,使用 cseq 指明响应的是哪个请求,使用date指明日期,public指明提供的方法。


✨5.2、describe 方法

向服务器获取rtsp://192.168.3.225:554/wbc的媒体对象的描述,其中accept字段指定了描述格式:

在这里插入图片描述
客户端发送 describe 方法,并使用 cseq 指明请求序列号,使用 user-agent 指明自己的代理,accept字段指定了描述格式为sdp;

服务端会响应这个请求,使用 cseq 指明响应的是哪个请求,使用date指明日期,content-type指明内容类型是sdp,content-length指明内容长度。

注意
1、有些需要用户名、密码的,服务器会在处理 describe 方法进行鉴权。如果未携带authorization鉴权信息,或者认证失败,服务器会返回错误号为401的响应,客户端接收到401响应时,需要根据已知的用户鉴权信息,生成authorization,再次发送describe,如果认证成功,服务器返回携带有sdp的响应信息。
2、服务器返回的sdp信息,会在之后的文章进行解析。


✨5.3、setup 方法

客户端向服务器请求建立会话并准备传输。请求信息主要包括传输协议和客户端的端口号;

在这里插入图片描述
客户端发送 setup 方法,并使用 cseq 指明请求序列号,使用 user-agent 指明自己的代理,transport字段指定了可以接受的传输协议rtp/avp、端口(这里指定了rtp端口为55320,rtcp端口为55321);

服务端会响应这个请求,使用 cseq 指明响应的是哪个请求,使用date指明日期,transport指明传输协议rtp/avp、目标地址、源地址、客户端端口(rtp为55320,rtcp为55321)、服务端端口(rtp为6970,rtcp为6971),session指明会话id。

注意
这个例子的rtp是通过udp协议传输的,有些时候,rtp会通过tcp进行传输,那么transport字段会有所差异。可能如下:

客户端请求:transport: rtp/avp/tcp;unicast;interleaved=0-1
服务器响应:transport: rtp/avp/tcp;unicast;interleaved=0-1;ssrc=24e4e500;mode="play"

rtp/avp/tcp表示rtp流通过tcp传输,当此值出现时,报文没有client_port字段;
interleaved=0-1表示streamid,标识rtp的streamid=0;rtcp的streamid=1;
当码流通过tcp传输时,与rtsp共用一个tcp链路,所以其不需要建立新的连接,为了区分rtp、rtcp及rtsp协议,需要增加包头标识,这里采用tcphead头字段,tcphead为四个字节,格式如下:

| magic number | channel number | embedded data length | data |

magic number: 1个字节,固定为0x24,是字符$,标识传输的是数据不是rtsp协议;
channel number: 1个字节,信道id,标识流的类型,就是前面说的streamid;
embedded data length :2个字节,表示流长度
data:表示rtp/rtcp包数据


✨5.4、play 方法

客户端主动通知服务器以setup指定的机制开始发送数据。

在这里插入图片描述
客户端发送 play 方法,并使用 cseq 指明请求序列号,使用 user-agent 指明自己的代理,session字段指定会话id,range字段指定了播放的起止时间。

服务端会响应这个请求,使用 cseq 指明响应的是哪个请求;使用date指明日期;range字段指定了播放的起止时间;session字段指定会话id;rtp-info字段描述将要发送码流的rtp信息,比如第一包rtp的seq和rtptime,客户端可以根据此字段进行解复用。


✨5.5、teardown 方法

客户端请求停止指定url流发送,释放相关资源。
在这里插入图片描述
客户端发送 teardown 方法,并使用 cseq 指明请求序列号,使用 user-agent 指明自己的代理,session字段指定会话id。

服务端会响应这个请求,使用 cseq 指明响应的是哪个请求;使用date指明日期。


在这里插入图片描述

🎄六、rtsp 响应错误码

rtsp的响应内容通常包含3位整数响应码以及一个原因短语,短语的目的是给出状态代码的简短文本描述,客户端不需要检查或显示原因短语。 按照响应码的首位数字区别,可以分为以下五个类别:

当然,rtsp的错误码和rtsp方法是强相关的,某些错误可能只会在特定方法中才会触发,详细错误码信息如下:

错误码原因短语响应的方法
100continueall
200successall
201createdrecord
250low on storage spacerecord
300multiple choicesall
301moved permanentlyall
302moved temporarilyall
303see otherall
305use proxyall
400bad requestall
401unauthorizedall
402payment requiredall
403forbiddenall
404not foundall
405method not allowedall
406not acceptableall
407proxy authentication requiredall
408request timeoutall
410goneall
411length requiredall
412precondition failed describesetup
413request entity too largall
414request-uri too longall
415unsupported media typeall
451invalid parametersetup
452illegal conference identifiersetup
453not enough bandwidthsetup
454session not foundall
455method not valid in this stateall
456header field not validall
457invalid rangeplay
458parameter is read-onlyset_parameter
459aggregate operation not allowedall
460only aggregate operation allowedall
461unsupported transportall
462destination unreachableall
500internal server errorall
501not implementedall
502bad gatewayall
503service unavailableall
504gateway timeoutall
505rtsp version not supportedall
551option not supportall

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
实时流协议—rtsp【详解】
从零开始精通rtsp之请求与响应详解1
流媒体协议之rtsp详解

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

计算机视觉目标检测性能指标

08-06

微服务与服务网格技术的性能优化:实现低延迟与高吞吐量

08-06

Ubuntu下Kubernetes(k8s)集群搭建

08-06

【Kubernetes】神乎其技的K8s到底是什么,为什么被越来越多人使用

08-06

腾讯云TStor存储一体机在大模型场景下的业务实践

08-06

腾讯云海外版对象储存服务COS使用教程(图文教程)

08-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论