RTSP协议抓包及讲解(一)https://developer.aliyun.com/article/1472295
三、手撕 RTSP 协议
既然要分析 RTSP 协议,那么我们先抓取相应的报文,然后根据报文去分析 RTSP 协议。
1、Wireshark 抓包
①、搭建环境
虚拟机(192.168.137.128):使用 VLC 推流
windows 主机(192.168.167.176):使用 VLC 拉流
②、wireshark 抓包
选择虚拟机的网卡
可以看到抓到的部分报文如下
2、RTSP 交互流程
假设我们现在要向一个 RTSP 的 sever 发送请求获取数据,基本流程如下:
①、OPTIONS
- C -> S:客户端向服务器端发送 OPTIONS,请求可用的方法。
- S -> C:服务器端回复客户端,消息中包含当前可用的方法。
②、DESCRIBE
- C -> S:客户端向服务器请求媒体描述文件。
- S -> C:服务器回复客户端 sdp 文件, 该文件告诉客户端服务器有哪些音视频流,有什么属性,如编解码器信息,帧率等。
这里对 SDP 文本进行一个简要的分析,完整信息如下图:
- (v):0 //指示协议的版本
- (o):- 16771609170375560276 16771609170375560276 IN IP4 lpvm//与会话所有者有关的六个参数
- 第一个参数:表明会话发起者的名称,该参数可不填写,如填写和 SIP 消息中,from 消息头的内容一致
- 第二个参数:主叫方的会话标识符
- 第三个参数:主叫方会话的版本,会话数据有改变时,版本号递增
- 第四个参数:定义了网络类型,IN 表示 Internet 网络类型,目前仅定义该网络类型
- 第五个参数:地址类型,目前支持 IPV4 和 IPV6 两种地址类型
- 第六个参数:地址:表明会话发起者的 IP 地址,该地址为信令面的 IP 地址,信令 PDP 激活时为手机分配
- (s):Unnamed //表明本次会话的标题,或会话的名称
- (i):N/A //会话的描述
- (c):IN IP4 0.0.0.0//c 行包含为多媒体会话而建立的连接的信息,其中指出了真正的媒体流使用的 IP 地址。
- 第一个参数为网络类型,目前仅定义 INTERNET 网络类型。用 “IN” 表示
- 第二个参数为地址类型,目前支持两种地址类型:IPV4 和 IPV6
- 第三个参数为地址,该地址为多媒体流使用的 IP 地址
- (t):0 0 //表示会话的开始时间和结束时间
- (m):audio 0 RTP/AVP 14//m 行又称媒体行,描述了发送方所支持的媒体类型等信息
- 第一个参数为媒体名称:表明支持音频类型。
- 第二个参数为端口号,表明 UE 在本地端口为 0 上发送音频流。
- 第三个参数为传输协议,一般为 RTP/AVP 协议。
- 四-七参数为所支持的四种净荷类型编号
- (a):rtpmap:14 MPA/90000/2//a 行为媒体的属性行,以属性的名称:属性值的方式表示。
- 格式为:a=rtpmap:<净荷类型><编码名称>
③、SETUP
为音视频数据的传输准备通道
- C -> S:客户端向服务器端发起建立连接请求,请求建立会话连接,准备开始接收音视频数据,请求信息描述了期望音视频数据包基于 UDP 还是 TCP 传输,指定了 RTP,RTCP 端口,以及是单播还是组播等信息!
- S -> C:服务器端收到客户端请求后,根据客户端请求的端口号确定发送控制数据的端口以及音视频数据的端口!
④、PLAY
- C -> S:客户端向服务端请求播放媒体。
- S -> C:服务器回复客户端 200 OK!之后开始通过 SETUP 中指定的端口开始发送数据!
⑤、TEARDOWN
- C -> S:结束播放的时候,客户端向服务器端发起结束请求
- S -> C:服务端收到消息后,向客户端发送 200 OK,之后断开连接
其中第 ③ 步和第 ④ 步是必需的!第 ① 步,只要服务器客户端约定好,有哪些方法可用,则 option 请求可以不要。第 ② 步,如果我们有其他途径得到媒体初始化描述信息(比如 http 请求等等),则我们也不需要通过 rtsp 中的describe 请求来完成。上述的流程基本涵盖了 RTSP 的流程,当然,RTSP 除此之外,还有 PAUSE,SCALE,GET_PARAMETER,SET_PARAMETER 等参数。
3、协议格式
RTSP 中所有的操作都是通过服务器和客户端的消息应答机制完成的,其中消息包括请求和应答两种,RTSP 是对称的协议,客户机和服务器都可以发送和回应请求。
RTSP 是一个基于文本的协议,它使用 UTF-8 编码(RFC2279) 和 ISO10646 字符序列,采用 RFC882 定义的通用消息格式,每个语句行由 CRLF 结束(\r\n)。RTSP 的消息包括请求和应答两类。
①、请求消息
请求消息由请求行、标题行中的各种标题域和主体实体组成。请求消息的格式如下图:
- 方法:包括 OPTIONS、DESCRIBE、SETUP、PLAY、PAUSE、TEARDOWN 等
- URL :接收方的地址,例如:rtsp://192.168.137.128:8554/test
- RTSP 版本:一般都是 RTSP/1.0
- CRLF:每行后面的 CRLF 表示回车换行,需要接收端有相应的解析,最后一个消息头需要有两个 CRLF。
- 实体主体:消息体是可选的, 有的请求消息并不带消息体。
②、应答消息
响应报文的开始行是状态行,RTSP 应答消息的格式如下图:
- 状态码:是一个数值,用于表示请求消息的执行结果,比如 200 表示成功。
- 短语:与状态码对应的文本解释
RTSP协议抓包及讲解(三)https://developer.aliyun.com/article/1472297