当前位置: 首页 > news >正文

rtsp协议分析

rtsp概述

rtsp (real-time stream protocol)实时流媒体控制协议。RFC2326:这是RTSP的初始定义版本v1.0,由哥伦比亚大学、网景和RealNetworks公司提交给互联网工程任务组(IETF)作为RFC标准。RFC7826:这是RTSP的后续更新版本v2.0,对RFC2326中的RTSP进行了扩展和更新。

rtsp协议属于基于文本的应用层协议,rtsp的底层协议可以是udp也可以是tcp

ffmpeg 参数-rtsp_transport tcp 用于指定RTSP会话底层传输协议为TCP,实现 RTSP 的系统必须支持通过 TCP 承载 RTSP,并且可以支持 UDP。 RTSP 服务器的默认端口对于 UDP 和 TCP 都是 554

本身并不传输流媒体数据,只是提供流媒体的控制,实际流媒体的传输使用rtp协议,协议文档可以从资源链接下载rtsp协议中英双文icon-default.png?t=N7T8https://download.csdn.net/download/shenhuxi_yu/89358966

使用wireshark rtsp筛选器既可以比较容易的分析rtsp协议内容

如上图是本地使用vlc工具打开远程流的过程中抓到的rtsp包,rtsp报文包括request和response,服务端和客户端都可以法request和response

request 报文分析

以第一个报文为例rtsp报文的格式如下

一个client请求sever的options request的消息格式如下,request-line是request的第一行,CRLF作为行结束符,CSeq 字段指定 RTSP 请求-响应对的序列号。 该字段必须出现在所有请求和响应中。 对于每个包含给定序列号的 RTSP 请求,都会有一个具有相同编号的相应响应。 任何重传的请求必须包含与原始请求相同的序列号(即,序列号不会因相同请求的重传而增加)。SP分隔符具体是指空格字符(Space Character)

C->S:  OPTIONS * RTSP/1.0 
CSeq: 1 
Require: implicit-play 
Proxy-Require: gzipped-messages 
Request = Request-Line     ; Section 6.1 
*( general-header ; Section 5  
| request-header  ; Section 6.2
| entity-header ) ; Section 8.1 
CRLF 
[ message-body ] ; Section 4.3 Request-Line = Method SP Request-URI SP RTSP-Version CRLF 
Method = "DESCRIBE"       ; Section 10.2 
| "ANNOUNCE"       ; Section 10.3 
| "GET_PARAMETER" ; Section 10.8 
| "OPTIONS"        ; Section 10.1 
| "PAUSE"          ; Section 10.6 
| "PLAY"           ; Section 10.5 
| "RECORD"         ; Section 10.11 
| "REDIRECT"      ; Section 10.10 
| "SETUP"          ; Section 10.4 
| "SET_PARAMETER" ; Section 10.9 
| "TEARDOWN"       ; Section 10.7 
| extension-method extension-method = token Request-URI = "*" | absolute_URI RTSP-Version = "RTSP" "/" 1*DIGIT "." 1*DIGIT request-header    = Accept             ; Section 12.1 
| Accept-Encoding  ; Section 12.2 
| Accept-Language  ; Section 12.3 
| Authorization     ; Section 12.5 
| From                ; Section 12.20 
| If-Modified-Since ; Section 12.23 
| Range               ; Section 12.29 
| Referer             ; Section 12.30 
| User-Agent          ; Section 12.41 

response 报文分析

第二条报文时response报文类型CSeq与第一个报文相同,因此是对第一个报文的回复

Response  =    Status-Line       ; Section 7.1 
*(  general-header   ; Section 5 
|   response-header  ; Section 7.1.2 
|    entity-header ) ; Section 8.1 
CRLF 
[message-body ] ; Section 4.3 Status-Line = RTSP-Version SP Status-Code SP Reason-Phrase CRLFresponse-header = Location            ; Section 12.25 
| Proxy-Authenticate ; Section 12.26 
| Public               ; Section 12.28 
| Retry-After         ; Section 12.31 
| Server               ; Section 12.36 
| Vary                 ; Section 12.42 
| WWW-Authenticate   ; Section 12.44 

Status-Code状态表如下

客户端使用 OPTIONS 方法查询服务器支持的方法。 服务器使用Public响应头列出它支持的方法。并使用Server响应头报告服务器信息。

rtsp连接过程

从如上的抓包可以看到vlc打开并播放rtsp流的过程的报文以此是OPTIONS-->DESCRIBE-->SETUP-->PLAY,,开始播放后每隔58s通信一次GET_PARAMETER消息。当客户端关闭VLC的时候发送TEARDOWN报文。

这个过程的解释如下

OPTIONS 请求可以在任何时候发出,例如,如果客户端将要尝试一个非标准请求。 
它不会影响服务器状态。DESCRIBE 方法从服务器检索由请求 URL 标识的演示文稿或媒体对象的描述。 
它可以使用 Accept 头来指定客户端理解的描述格式。 
服务器以所请求资源的描述作为响应。 DESCRIBE 回复-响应对构成了 RTSP 的媒体初始化阶段SETUP 请求指定用于流媒体的传输机制。 客户端可以对已经播放的流发出 SETUP 请求以更改传输参数,
服务器可以允许。 如果它不允许这样做,它必须以错误“455 Method Not Valid In This State”响应。 
为了通过任何中间防火墙,客户端必须指明传输参数,即使它对这些参数没有影响,
例如,服务器在哪里通告固定的多播地址。服务器生成会话标识符以响应 SETUP 请求。 
如果对服务器的 SETUP 请求包含会话标识符,则服务器必须将此设置请求捆绑到
现有会话或返回错误“459 不允许聚合操作”PLAY 方法告诉服务器通过 SETUP 中指定的机制开始发送数据。 
在任何未完成的 SETUP 请求被确认为成功之前,客户端不得发出 PLAY 请求。
PLAY 请求将正常播放时间定位到指定范围的开始,并传送流数据直到到达范围结束。 
PLAY 请求可能会被流水线化(排队); 服务器必须将 PLAY 请求按顺序执行。 
也就是说,在前一个 PLAY 请求仍处于活动状态时到达的 PLAY 请求会被延迟,直到第一个请求完成。GET_PARAMETER 请求检索 URI 中指定的演示文稿或流的参数值。 
回复和响应的内容留给实现。 没有实体主体的 GET_PARAMETER 
可用于测试客户端或服务器的活跃度(“ping”)。TEARDOWN 请求停止给定 URI 的流传输,释放与之关联的资源。 
如果 URI 是此演示文稿的演示文稿 URI,则与该会话关联的任何 RTSP 会话标识符都不再有效。 
除非所有传输参数都由会话描述定义,否则必须在会话再次播放之前发出 SETUP 请求。

另外在DESCRIBE报文的回复报文中使用了SDP协议报文描述会话信息,在RTSP中,会话指的是客户端和服务器之间建立的一个连接,用于控制多媒体流的传输。这个连接通过一系列的RTSP请求和响应来维护,包括设置参数、播放、暂停、停止等操作。会话的关闭动作是客户端发送TEARDOWN报文发起的。

SETUP报文后会建立客户端与服务端的会话,如下Session字段,建立会话之后的报文都会把Session ID放到报文中

PLAY报文会上报请求播放的时间范围Range

PLAY的response报文会把时间戳和包序号回复过来如下图。seq:表示流的第一个数据包的序列号。 rtptime:表示Range响应头中时间值对应的RTP时间戳。

rtsp的实现

ffmpeg可以推流拉流,ffmpeg中有rtsp客户端的实现,zlmediakit中有rtsp服务端的实现,zlmediakit作为rtsp服务端能够接收客户端(如ffmpeg、VLC等)发送的RTSP请求,如播放、暂停、录制等,并处理这些请求,提供相应的流媒体数据。

rtsp服务端和客户端的代码分析待更新

相关文章:

  • 系统开发与运行知识
  • 智慧农田视频监控技术应用:智能监管引领农业新时代
  • 【Python设计模式01】面向对象基础
  • Oracle递归查询笔记
  • LeetCode 2951.找出峰值:模拟(遍历)
  • windows ip助手函数了解
  • 前端本地项目启动供后端或者测试调试
  • Java实现图片保存到pdf的某个位置2
  • 基于Matlab的车道线检测系统 (文末有代码获取链接)【含Matlab源码 MX_001期】
  • C# WPF编程基础
  • 外汇天眼:风险预警!以下平台监管牌照被撤销!
  • 2024年5月22日 (周三) 叶子游戏新闻
  • 国产数据库替代加速 助力数字中国建设
  • firewalld
  • 小小字符串竟然如此嚣张 —— 聊聊 Java 的 String
  • [PHP内核探索]PHP中的哈希表
  • chrome扩展demo1-小时钟
  • Js基础知识(四) - js运行原理与机制
  • laravel with 查询列表限制条数
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • React Native移动开发实战-3-实现页面间的数据传递
  • RxJS: 简单入门
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 阿里云购买磁盘后挂载
  • 从零开始的无人驾驶 1
  • 大快搜索数据爬虫技术实例安装教学篇
  • 对象管理器(defineProperty)学习笔记
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 前端自动化解决方案
  • 前言-如何学习区块链
  • #APPINVENTOR学习记录
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #Z2294. 打印树的直径
  • $GOPATH/go.mod exists but should not goland
  • (AngularJS)Angular 控制器之间通信初探
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (五)网络优化与超参数选择--九五小庞
  • (一)u-boot-nand.bin的下载
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)深入super,看Python如何解决钻石继承难题
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .Mobi域名介绍
  • .NET CORE Aws S3 使用
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @TableLogic注解说明,以及对增删改查的影响
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [BSGS算法]纯水斐波那契数列
  • [Everyday Mathematics]20150130