RTSP协议抓包及讲解

news2024/11/25 5:34:01

文章目录

  • 前言
  • 一、RTSP 亲手搭建直播点播
    • 1、数据源为视频文件
    • 2、数据源为摄像头
      • ①、搭建 RTSP 流媒体服务器
      • ②、客户端拉流
  • 二、RTSP 协议简介
  • 三、手撕 RTSP 协议
    • 1、Wireshark 抓包
      • ①、搭建环境
      • ②、wireshark 抓包
    • 2、RTSP 交互流程
      • ①、OPTIONS
      • ②、DESCRIBE
      • ③、SETUP
      • ④、PLAY
      • ⑤、TEARDOWN
    • 3、协议格式
      • ①、请求消息
      • ②、应答消息
    • 4、方法定义
    • 5、状态
  • 四、RTSP 与 HTTP


前言

本节主要讲解 RTSP 协议,通过 wireshark 抓包的方式对协议进行分析。


一、RTSP 亲手搭建直播点播

测试工具:VLC
数据源:文件或本地摄像头
测试功能:RTSP 直播点播

播放地址: rtsp://127.0.0.1:554/test
服务端: 推流
客户端: 拉流

1、数据源为视频文件

参考我之前的博客 “音视频开发常用工具” 下图部分
在这里插入图片描述

2、数据源为摄像头

①、搭建 RTSP 流媒体服务器

<1>、点击媒体 -> 流
在这里插入图片描述
<2>、选择捕获设备,视频设备我们选择笔记本电脑内置摄像头,电击串流
在这里插入图片描述
<3>、点击下一个
在这里插入图片描述
<4>、新目标选择 RTSP,点击添加
在这里插入图片描述
<5>、修改路径,并点击下一个
在这里插入图片描述
<6>、配置文件选择 Video - H.264 + MP3 (TS),点击下一个
在这里插入图片描述
<7>、点击流
在这里插入图片描述
<8>、可以看到进度条开始动了,这样一个 RTSP 流媒体服务器就搭建好了,目前正在进行推流
在这里插入图片描述

②、客户端拉流

<1>、再打开一个 VLC media player,选择媒体 -> 打开网络串流
在这里插入图片描述
<2>、网络 URL 修改为:rtsp://:8554/test2,点击播放
在这里插入图片描述
<3>、下图左边是服务端在推流,右边是客户端在拉流
在这里插入图片描述

上面两个例子实现了数据源分别是文件和摄像头时,搭建了 RTSP 直播点播功能

二、RTSP 协议简介

RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是 TCP/IP 协议体系中的一个应用层协议,由哥伦比亚大学、网景和 RealNetworks 公司提交的 IETF RFC 标准。该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP 是用来控制声音或影像的多媒体串流协议, 并允许同时多个串流需求控制。

RTSP 在体系结构上位于 RTP 和 RTCP 之上,它使用 TCP 或 UDP 完成数据传输。

HTTP 与 RTSP 相比,HTTP 请求由客户机发出,服务器作出响应;使用 RTSP 时,客户机和服务器都可以发出请求,即 RTSP 可以是双向的。

实时流媒体会话协议

  • SDP(会话描述协议)Session Description Protocol
  • RTP(实时传输协议)Realtime Transfer Protocol:音视频流

在这里插入图片描述
RTSP 是基于文本的协议,采用 ISO10646 字符集,使用 UTF-8 编码方案

行以 CRLF 中断( \r\n:10,13:0x0A,0x0D),包括消息类型、消息头、消息体和消息长。但接收者本身可将 CR 和 LF 解释成行终止符。基于文本的协议使其以自描述方式增加可选参数更容易,接口中采用 SDP 作为描述语言。

RTSP 是应用级协议, 控制实时数据的发送。

RTSP 提供了一个可扩展框架,使实时数据,如音频与视频的受控点播成为可能。数据源包括现场数据与存储在剪辑中数据。该协议目的在于控制多个数据发送连接,为选择发送通道,如 UDP、组播 UDP 与 TCP 提供途径,并为选择基于 RTP 上发送机制提供方法。
在这里插入图片描述
RTSP 协议支持:

  • 从媒体服务器上检索媒体
  • 媒体服务器邀请进入会议
  • 将媒体加到现成讲座中

三、手撕 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 表示成功。
  • 短语:与状态码对应的文本解释

4、方法定义

注: P----演示, S----流, C----用户端, S----服务器端

方法方向对象要求含义
DESCRIBEC -> SP,S推荐检查演示或媒体对象的描述,也允许使用接收头指定用户理解的描述格式。DESCRIBE 的答复-响应组成媒体 RTSP 初始阶段
ANNOUNCEC -> S

S->C
P,S可选当从用户发往服务器时,ANNOUNCE 将请求 URL 识别的演示或媒体对象描述发送给服务器;反之,ANNOUNCE 实时更新连接描述。如新媒体流加入演示,整个演示描述再次发送,而不仅仅是附加组件,使组件能被删除
GET_PARAMETERC -> S

S->C
P,S可选GET_PARAMETER 请求检查 URL 指定的演示与媒体的参数值。没有实体时,GET_PARAMETER 也许能用来测试用户与服务器的连通情况
OPTIONSC -> S

S -> C
P,S要求可在任意时刻发出 OPTIONS 请求,如用户打算尝试非标准请求,并不影响服务器状态
PAUSEC -> SP,S推荐PAUSE 请求引起流发送临时中断。如请求 URL 命名一个流,仅回放和记录被停止;如请求 URL 命名一个演示或流组,演示或组中所有当前活动的流发送都停止。恢复回放或记录后,必须维持同步。在 SETUP 消息中连接头超时参数所指定时段期间被暂停后,尽管服务器可能关闭连接并释放资源,但服务器资源会被预订
PLAYC -> SP,S要求PLAY 告诉服务器以 SETUP 指定的机制开始发送数据;直到一些 SETUP请求被成功响应,客户端才可发布 PLAY 请求。PLAY 请求将正常播放时间设置在所指定范围的起始处,发送流数据直到范围的结束处。PLAY 请求可排成队列,服务器将 PLAY 请求排成队列,顺序执行
RECORDC -> SP,S可选该方法根据演示描述初始化媒体数据记录范围,时标反映开始和结束时间;如没有给出时间范围,使用演示描述提供的开始和结束时间。如连接已经启动,立即开始记录,服务器数据请求 URL 或其他 URL 决定是否存储记录的数据;如服务器没有使用 URL 请求,响应应为 201(创建),并包含描述请求状态和参考新资源的实体与位置头。支持现场演示记录的媒体服务器必须支持时钟范围格式,smpte 格式没有意义
REDIRECTS -> CP,S可选重定向请求通知客户端连接到另一服务器地址。它包含强制头地址,指示客户端发布 URL 请求;也可能包括参数范围,以指明重定向何时生效。若客户端要继续发送或接收 URL 媒体,客户端必须对当前连接发送 TEARDOWN 请求,而对指定主执新连接发送 SETUP 请求
SETUPC -> SP,S可选对 URL 的 SETUP 请求指定用于流媒体的传输机制。客户端对正播放的流发布一个 SETUP 请求,以改变服务器允许的传输参数。如不允许这样做,响应错误为"455 Method Not Valid In This State”。为了透过防火墙,客户端必须指明传输参数,即使对这些参数没有影响
SET_PARAMETERC -> S

S -> C
P,S要求这个方法请求设置演示或 URL 指定流的参数值。请求仅应包含单个参数,允许客户端决定某个特殊请求为何失败。如请求包含多个参数,所有参数可成功设置, 服务器必须只对该请求起作用。服务器必须允许参数可重复设置成同一值,但不让改变参数值。注意:媒体流传输参数必须用 SETUP 命令设置。将设置传输参数限制为 SETUP 有利于防火墙。 将参数划分成规则排列形式, 结果有更多有意义的错误指示
TEARDOWNC -> SP,S要求TEARDOWN 请求停止给定 URL 流发送,释放相关资源。如 URL 是此演示 URL,任何 RTSP 连接标识不再有效。除非全部传输参数是连接描述定义的,SETUP 请求必须在连接可再次播放前发布

5、状态

RTSP 状态机
  RTSP 控制通过单独协议发送的数据流,与控制通道无关。例如,RTSP 控制可通过 TCP 连接,而数据流通过 UDP。因此,即使媒体服务器没有收到请求,数据也会继续发送。在连接生命期,单个媒体流可通过不同 TCP 连接顺序发出请求来控制。所以,服务器需要维持能与 RTSP 请求的连接状态联系流。 RTSP 中很多方法与状态无关,但下列方法在定义服务器流资源的分配与应用上起着重要的作用:

  • SETUP:让服务器给流分配资源,启动 RTSP 连接
  • PLAY 与 RECORD:启动 SETUP 分配流的数据传输
  • PAUSE:临时停止流,而不释放服务器资源
  • TEARDOWN:释放流的资源,RTSP 连接停止

标识状态的 RTSP 方法使用连接头段识别 RTSP 连接,为响应 SETUP 请求,服务器连接产生连接标识。

四、RTSP 与 HTTP

实时流协议在语法和操作上与 HTTP/1.1 类似,因此 HTTP 的扩展机制大都可加入 RTSP,然而,在很多重要方面 RTSP 仍不同于 HTTP:

  • RTSP 引入了大量新方法并具有一个不同的协议标识符
  • 在大多数情况下,RTSP 服务器需要保持缺省状态,与 HTTP 的无状态相对
  • RTSP 中客户端和服务器都可以发出请求
  • 在多数情况下,数据由不同的协议传输
  • RTSP 使用 ISO 10646(UTF-8) 而并非 ISO 8859-1,与当前的国际标准 HTML 相一致
  • URL 请求总是包含绝对 URL。为了与过去的错误相互兼容,HTTP/1.1 只在请求过程中传送绝对路径并将主机名置于另外的头字段

我的qq:2442391036,欢迎交流!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1050748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全面横扫:dlib Python API在Linux和Windows的配置方案

前言 在计算机视觉和人工智能领域&#xff0c;dlib是一个备受推崇的工具库。它为开发者提供了强大的图像处理、机器学习和深度学习功能。在计算机视觉项目中&#xff0c;配置dlib Python API是一个重要的初始步骤。本文将引导读者详细了解在Linux和Windows系统上安装和配置dli…

【算法分析与设计】动态规划(下)

目录 一、最长公共子序列1.1 最长公共子序列的结构1.2 子问题的递归结构1.3 计算最优值1.4 举例说明1.5 算法的改进 二、最大子段和2.1 代码2.2 最大子段和问题的分治算法2.3 代码2.4 分治算法的时间复杂度2.5 最大子段和问题的动态规划算法 三、凸多边形最优三角剖分3.1 三角剖…

Flutter笔记:关于应用程序中提交图片作为头像

Flutter笔记 关于应用程序中提交图片作为头像 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/133418554…

raw智能照片处理工具DxO PureRAW mac介绍

DxO PureRAW Mac版是一款raw智能照片处理工具&#xff0c;该软件采用了智能技术&#xff0c;以解决影响所有RAW文件的七个问题&#xff1a;去马赛克&#xff0c;降噪&#xff0c;波纹&#xff0c;变形&#xff0c;色差&#xff0c;不想要的渐晕&#xff0c;以及缺乏清晰度。 Dx…

软件测试之单元测试自动化入门基础

单元测试自动化 所谓的单元测试(Unit Test)是根据特定的输入数据&#xff0c;针对程序代码中的最小实体单元的输入输出的正确性进行验证测试的过程。所谓的最小实体单元就是组织项目代码的最基本代码结构&#xff1a;函数&#xff0c;类&#xff0c;模块等。在Python中比较知名…

picoctf_2018_got_shell

picoctf_2018_got_shell Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)32位&#xff0c;只开了NX int __cdecl __noreturn main(int argc, const char **argv, const char **envp) {_DWOR…

DeepFace【部署 02】轻量级人脸识别和面部属性分析框架(实时分析+API+Docker部署+命令行接口)

轻量级人脸识别和面部属性分析框架 2.10 Real Time Analysis2.11 API2.12 Dockerized Service2.13 Command Line Interface 2.10 Real Time Analysis 你也可以运行deepface实时视频。流功能将访问您的网络摄像头&#xff0c;并应用面部识别和面部属性分析。如果能连续聚焦5帧&…

2023-9-29 LCR 083 全排列

题目链接&#xff1a;全排列 class Solution {int [] nums;List<List<Integer>> res new ArrayList<>();List<Integer> path;boolean[] st;public List<List<Integer>> permute(int[] nums) {this.nums nums;path Arrays.asList(new In…

DAMA-DMBOK2重点知识整理CDGA/CDGP——第14章 大数据与数据科学

目录 一、分值分布 二、重点知识梳理 1、引言 1.1 业务驱动因素 1.2 原则 1.3 基本理念 2、活动 2.1 定义大数据战略和业务需求 2.2 选择数据源 2.3 获得和接收数据源 2.4 制定数据假设和方法 2.5 集成和调整数据进行分析 2.6 使用模型探索数据 2.7 部署和监控 …

09链表-单链表移除元素

目录 链表&#xff08;Linked List&#xff09; 链表的数据结构 单链表 双链表 循环链表 链表的存储方式 删除节点 添加节点 LeetCode之路——203. 移除链表元素 分析&#xff1a; 链表&#xff08;Linked List&#xff09; 链表是一种线性数据结构&#xff0c;用于…

C运算符和控制语句

几乎每一个程序都需要进行运算&#xff0c;对数据进行加工处理&#xff0c;否则程序就没有意义了。要进行运算&#xff0c;就需规定可以使用的运算符。 C语言的运算符范围很宽&#xff0c;把除了控制语句和输人输出以外的几乎所有的基本操作都作为运算符处理。 运算符分类1 除…

Scala第六章节

Scala第六章节 scala总目录 章节目标 掌握类和对象的定义掌握访问修饰符和构造器的用法掌握main方法的实现形式掌握伴生对象的使用掌握定义工具类的案例 1. 类和对象 Scala是一种函数式的面向对象语言, 它也是支持面向对象编程思想的&#xff0c;也有类和对象的概念。我们依…

【Linux指令集】---git命令的基本使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 演示环境&#xff1…

Spring修炼之路(1)基础入门

一、简介 1.1Spring概述 Spring框架是一个轻量级的Java开发框架&#xff0c;它提供了一系列底层容器和基础设施&#xff0c;并可以和大量常用的开源框架无缝集成&#xff0c;可以说是开发Java EE应用程序的必备。Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&…

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真+程序+原理图+报告+讲解视频)

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真程序原理图报告讲解视频&#xff09; 讲解视频1.主要功能&#xff1a;2.仿真3. 程序代码4.原理图5. 设计报告6. 设计资料内容清单 51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显…

Scala第一章节

Scala第一章节 scala总目录 章节目标 理解Scala的相关概述掌握Scala的环境搭建掌握Scala小案例: 做最好的自己 1. Scala简介 1.1 概述 ​ Scala(斯嘎拉)这个名字来源于"Scalable Language(可伸缩的语言)", 它是一门基于JVM的多范式编程语言, 通俗的说: Scala是一…

面向对象【递归方法】

文章目录 递归编写递归函数递归的工作原理常见的递归应用场景递归注意点 递归 递归是一种解决问题的方法&#xff0c;其中一个函数调用自身以解决较小的实例&#xff0c;直到达到基本情况&#xff08;停止条件&#xff09;&#xff0c;然后开始返回结果。递归可以让我们更容易地…

CSS详细基础(五)选择器的优先级

本节介绍选择器优先级&#xff0c;优先级决定了元素最终展示的样式~ 浏览器是通过判断CSS优先级&#xff0c;来决定到底哪些属性值是与元素最为相关的&#xff0c;从而作用到该元素上。CSS选择器的合理组成规则决定了优先级&#xff0c;我们也常常用选择器优先级来合理控制元素…

038:vue页面头部提示低版本浏览器升级问题

第038个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

一例疑似MMCore下载器分析

概述 这是一例文件夹病毒&#xff0c;手法相对比较高级&#xff0c;通过域名关联到MMCore样本&#xff0c;可能与印度方向APT组织有关联。 这个病毒使用了分离免杀技术&#xff0c;有2个样本&#xff0c;一个加载器&#xff0c;一个payload。 加载器(文件名为dwm22.exe)的主要…