从客户端发起播放请求,到rtrmp视频流开始播放,大致经过了握手->建立连接->创建流->播放这几步比较重要的步骤。下面我将结合wireshark的抓包,对其中的每个流程进行分析和学习。

握手

RTMP协议基于TCP,TCP建立连接有三次握手。在TCP连接建立以后,会再进行一次RTMP协议层次的握手。

TCP握手

TCP建立连接的三次握手如图所示:



从wireshark的抓包中,也可以看到TCP的三次握手。



RTMP握手

在TCP建立连接成功后,rtmp会再进行三次握手。



可以通过在wireshark的过滤器中输入rtmpt来过滤RTMP协议的数据,如图所示:





客户端首先发送C0、C1到服务器。其中C1的大小是固定的,为1536个字节。服务端收到C0,C1后,发送S0,S1给客户端,S1的大小和C1一样,为1536个字节。服务端收齐C0,C1后,发送S2给客户端,客户端收齐S0,S1后,发送C2给服务端。C2和S2的大小也为1536个字节。可以看出来,rtmp协议握手交换数据报文的大小是固定的。

下图是引自wiki,可以很清晰的看到客户端和服务端的交互流程和包之间的关系:



C0 and S0

C0和S0都是单一的八位字节,里面包含着客户端要求的RTMP版本号







C1 and S1

C1和S1的长度都是1536个字节,里面包含着时间戳,4个字节的0和1528个字节随机生成的数据





C2 and S2

C2和S2的长度是1536个字节,其中的数据包括:

  • time:终端在 S1 (给 C2) 或者 C1 (给 S2) 发的 timestamp。
  • time2:终端先前发出数据包 (S1 或者 C1) timestamp。
  • random echo:终端发的 S1 (给 C2) 或者 S2 (给 C1) 的随机数据。







connect

客户端

握手完成后,客户端会发送connect命令到服务端,请求连接一个服务器应用的实例。

connect消息组成如下:



其中Command Object包含了多个字段,来帮助客户端和服务端的连接。

Command Object包含的字段如下:



  • app:客户端连接到服务器应用端的名字
  • flashver:Flash Player 版本号。和ApplicationScript getversion() 方法返回的是同一个字符串。
  • swfUrl:进行当前连接的 SWF 文件源地址。
  • tcUrl:服务器 URL。
  • fpad:代理标志,如果使用了代理就是 true。
  • audioCodecs:表明客户端所支持的音频编码。
  • videoCodecs:表明支持的视频编码。
  • videoFunction:表明所支持的特殊视频方法。
  • pageUrl:SWF 文件所加载的网页 URL。
  • objectEncoding:AMF 编码方法。

总的来说,就是包含了版本,流名称,url,音视频编码等后面播放视频流时所用的信息,以保证后续服务端发送的视频数据可以正常播放。

wireshark抓包如下:



服务端

服务端收到connect命令后,发送了几条消息给客户端。如下图所示:



Window Acknowledgement size

Window Acknowledgement size的结构如下:



Window Acknowledgement size是服务器端用来通知对端发送和应答之间窗口大小的。

此例子中发送的窗口大小为2500000。

Set Peer Bandwidth

该消息里限制对端输出带宽。



限制类型取以下值之一:

  • 0 - Hard:对端应该限制其输出带宽到指示的窗口大小。

  • 1 - Soft:对端应该限制其输出带宽到知识的窗口大小,或者已经有限制在其作用的话就取两者之间的较小值。

  • 2 - Dynamic:如果先前的限制类型为 Hard,处理这个消息就好像它被标记为 Hard,否则的话忽略这个消息。

Set Chunk Size

设置块大小,以通知对端新的最大块大小,默认为128字节。



Chunk是消息的一段。消息在网络发送之前被拆分成很多小的部分。Chunk可以确保端到端交付所有消息有序 timestamp,即使有很多不同的流。Chunk的格式如下:



createStream

在connect完成后就可以创建或者访问RTMP流了。



从抓包数据可以看到,服务端向客户端发送了三条命令,分别是Window Acknowledgement sizecreateStream和_checkbw

  • Window Acknowledgement size是对之前服务端发送的Set Peer Bandwidth消息的应答。
  • _checkbw用于检查带宽,来评估与服务器的连接质量和带宽。

主要的消息是creatStream,客户端发送此消息到服务端,创建一个逻辑通道,用于消息通信。音频、视频、元数据均通过createStream创建的数据通道进行交互。createStream消息的结构如下:



客户端发送createStream请求之后,服务端会反馈一个结果给客户端,如果成功,则返回_result,如果失败,则返回_error。

wireshark抓包数据如下:



在服务端返回的数据中,最后一个字段为Stream ID,作为该Stream的唯一标识。此例子中返回的是1,后续的视频或音频的Stream ID就是1。

至此,客户端和服务端的通道已经建立完成,接下来就可以进行数据的传输了。

play

createStream成功后,客户端发送play命令,通知服务端开始播放视频流。

play消息有7个字段,其中最后3个为可选字段。

  • Command Name: String类型,命令的名称,为“play”。
  • Transaction ID: Number类型,事务ID。
  • Command Object:命令信息不存在。设为 null 类型。
  • Stream Name: String类型,要播放流的名字。
  • Start(可选): Number类型,以秒为单位定义开始时间,默认值为 -2,表示用户首先尝试播放流名字段中定义的直播流。
  • Duration(可选): Number类型,以秒为单位定义了回放的持续时间。默认值为 -1。-1 值意味着一个直播流会一直播放直到它不再可用或者一个录制流一直播放直到结束。
  • Reset(可选): Boolean类型,定义了是否对以前的播放列表进行 flush。

    wireshark抓包数据为:



从抓包数据可以看到,此次事务ID为5;流的名称为“test”;start为-2000ms,即-2s,用户首先尝试播放流名字段中定义的直播流。

客户端发送play命令来播放指定流后,就开始传输音视频数据。后面就是客户端按照流程对接收到的数据进行解协议,解封装,解码..........

........此处省略一万字...........

RTMP协议学习——从握手到播放的更多相关文章

  1. rtmp协议分析

    最近需要做一个rtmp服务器,着手分析一下rtmp协议,开干. rtmp握手 这个推荐一篇文章讲解得比较透彻http://blog.sina.com.cn/s/blog_676e11660102v8b ...

  2. RTMP流媒体播放过程:握手,建立连接,建立流,播放

    本文讲述从打开一个RTMP流媒体到视音频数据开始播放的整个过程. 播放一个流媒体有两个前提步骤: 第一步,建立一个网络连接(NetConnection): 第二步,建立一个网络流(NetStream) ...

  3. 推荐下:开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !

    视频播放, 原本是想h5 自带视频播放,使用很简单,结果现实很骨感. <video controls="controls" preload="auto" ...

  4. iOS直播-播放基于RTMP协议的视频

    iOS直播-播放基于RTMP协议的视频 流媒体协议介绍 1. 伪流媒体: 渐进式下载 : 边下边存, 文件会保存 使用http协议,也能够实现视频播放, 也能快进快退等, 体验上跟流媒体很像. 优酷, ...

  5. 调试libRTMP代码来分析RTMP协议

    RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写.该协议基于TCP,是一个协议族,常用在视频直播领域.RTMP协议的默认端口是1935. 学习一个协议 ...

  6. (转)RTMP协议从入门到放弃

    转载自:  http://blog.csdn.net/shangmingyang/article/details/50837852 RTMP协议是Real Time Message Protocol( ...

  7. rtmplib rtmp协议过程分析

    转自:http://chenzhenianqing.cn/articles/1009.html 写的很好,收藏如下,向作者致敬! 没事碰到了librtmp库,这个库是ffmpeg的依赖库,用来接收,发 ...

  8. 玩转直播系列之RTMP协议和源码解析(2)

    一.背景 实时消息传输协议(Real-Time Messaging Protocol)是目前直播的主要协议,是Adobe公司为Flash播放器和服务器之间提供音视频数据传输服务而设计的应用层私有协议. ...

  9. 网络协议学习笔记(九)CDN和数据中心

    概述 上一篇给大家介绍了DNS协议和HttpDns协议,现在给大家介绍一下CDN和数据中心相关的知识. CDN:你去小卖部取过快递么? 如果你去电商网站下单买个东西,这个东西一定要从电商总部的中心仓库 ...

  10. RTMP协议中文翻译(首发)(转)

    Adobe公司的实时消息传输协议 摘要 此备忘录描述了 Adobe公司的实时消息传输协议(RTMP),此协议从属于应用层,被设计用来在适合的传输协议(如TCP)上复用和打包多媒体传输流(如音频.视频和 ...

随机推荐

  1. windows传输文件到linux

    PFSTP 打开该软件,在安装putty自带的 连接服务器 open 192.168.142.131 按提示输入账户密码 传送文件 put C:\Users\13662\nifi-1.13.2-bin ...

  2. vs(visual stuiod)中vc++工程的Filter和Folder及vcxproj知识

    vs中创建Filter 在一个新项目中右键 - Add - New,默认只有一选项 New Filter. 创建出来的Filter可以理解为是VS的过滤器(虚拟目录),它不会在本地的磁盘上新建目录,而 ...

  3. 线性关系和非线性关系在.net中的应用

    在数学中,线性关系和非线性关系是描述两个变量之间函数关系的两种不同类型. 线性关系是指两个变量之间可以用一条直线来表示的关系.具体来说,如果存在一个一次函数 y = kx + b,其中k和b是常数,使 ...

  4. 产品代码都给你看了,可别再说不会DDD(一):DDD入门

    这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...

  5. elasticsearch中的数据类型search_as_you_type及查看底层Lucene索引

    search_as_you_type字段类型用于自动补全,当用户输入搜索关键词的时候,还没输完就可以提示用户相关内容.as_you_type应该是说当你打字的时候.它会给索引里的这个类型的字段添加一些 ...

  6. 深入了解商品详情API接口的使用方法与数据获取

    ​ 作为程序员,了解和熟悉如何调用API接口获取淘宝商品数据是非常重要的.在现今的电商环境中,准确.及时地获取商品详情信息对于开发者和商家来说至关重要.本文将以程序员的视角,详细介绍如何调用API接口 ...

  7. 浅聊一下SpringMVC的核心组件以及通过源码了解其执行流程

    浅聊一下SpringMVC的核心组件以及通过源码了解其执行流程 MVC作为WEB项目开发的核心环节,正如三个单词的分解那样,Controller(控制器)将View(视图.用户客户端)与Model(j ...

  8. The Missing Semester - 第五讲 学习笔记(二)

    第五讲(二) SSH入门 介绍完命令行环境后,这半节主要介绍的是ssh的有关入门知识.SSH是Secure Shell的简称. 课程视频地址:https://www.bilibili.com/vide ...

  9. dp_ppi转光纤模块连接200PLC组态王通信案例

    DP_PPI转光纤模块连接200PLC组态王光纤通信在冷却塔控制系统案例 现场背景介绍: 西门子200 CPU226PLC通过兴达易控dp转光纤模块在200PLC系统中ppi转光纤实现PCL与组态王2 ...

  10. 0 基础晋级 Serverless 高手课 — 初识 Serverless(上)

    应用 - 无服务器 2017- 2006 函数即服务 类似 云计算 (Serverless) faas 函数服务 + 后端数据库 账号服务 弹性,按量 服务器,客户端的终结 - 弹性 - 按量 优点 ...