RTMP 是目前各种网络直播应用最核心的传输协议,也是互动直播采用最广泛的协议。 如果说流媒体服务器(Server)是网络直播的骨骼,RTMP则是网络直播的血液,可以说,没有RTMP,就没有今天如此火爆的网络直播

RTMP协议是工作在传输层之上的协议,我们在播放RTMP流的时候, 点下播放按钮的那一刻到底发生了什么?本文将为你揭开RTMP播放流程的神秘面纱

1 RTMP概述

RTMP连接全都是以握手作为开始的。 ① 建立连接阶段 用于建立客户端与服务器之间的“网络连接”、、② 建立流阶段 用于建立客户端与服务器之间的“网络流”、、③ 播放阶段 用于传输视音频数据


本文中,我们辅以tcpdump来抓包,wireshark来分析抓到的包

2 抓RTMP包

tcpdump抓包:

tcpdump host IP and tcp port 1935 -w a.pcap

whireshark分析:

用wireshark打开a.pcap

3 握手(Handshake)

一个RTMP连接以握手开始,我们先看下图:


首先我们要明确的是客户端IP是192.168.1.102(我的电脑),123.183.164.23是RTMP服务器

剧本应该是这样子的:

  1. RTMP协议是TCP协议的上层协议,所以必须要先建立TCP连接,所以就看到了1-4这几个TCP三次握手的包

  2. 客户端向服务器发送C0块(chunks),表示要和服务器握手,C0中包含版本号

  3. 服务器收到C0后,检查C0中的版本是否支持,如果支持发送S0作为响应,否则应该终止连接

  4. 客户端和服务器都分别、待C1和S1,、待版本确认

  5. 客户端收到S1后发送C2,服务器收到C1后发送S2(确认发送,测试握手完成。 )

然而,协议的实际执行却不是按照剧说起来应该的 (如果按剧说起来应该,延迟就要大大增大了),实际执行是这样的:

  1. RTMP协议是TCP协议的上层协议,所以必须要先建立TCP连接,所以就看到了1-4这几个TCP三次握手的包

  2. 客户端发送的是C0+C1块,直接告诉服务器我发的版本我自己确认了

  3. 服务器更狠,一个大嘴巴子就抽回来了(发送S0+S1+S2)

  4. 客户端收到后,发送C2,握手完成!

附上RTMP协议中的流程图:

有同学站起来提问了,No.13的包是C2,那么后面的connect是what?这位同学请坐下,往下看

4 建立一个网络连接(NetConnection)

提示:

网络连接代表服务器端应用程序和客户端之间基础的连通关系

我们接着看抓到的包:

RTMP握手完成后,要建立网络连接。 大家都知道一个普通的标准的rtmp流是什么样子的?rtmp://IP:PORT/APP/Stream 是不是这样?

实际剧本是这样子滴:

1.客户端在发送C2的时候,顺带还发了一个请求连接的命令,要求与服务器应用(live7)建立网络连接,这就是RTMP URL中的的Application。 soga,是不是恍然大悟?

2.服务器在收到客户端发送的连接请求后发送如下信息:

主要是告诉客户端确认窗口大小,设置节点带宽,然后服务器把“连接”连接到指定的应用并返回结果,“网络连接成功”。 并且返回流开始的的消息(Stream Begin 0)

3.客户端在收到服务器发来的消息后,返回确认窗口大小(No.18),此时网络连接创建完成

协议流程图:

5 建立一个网络流(NetStream
)

提示:

网络流代表了发送多媒体数据的通道

服务器和客户端之间只能建立一个网络连接,且多个网络流可以复用这一个网络连接

接着看抓包:


现在地洞挖好了,就差铺铁轨了!

  1. 客户端向服务器发送设置Buffer Length为0,3000ms,并请求创建流(createStream)

  2. 客户端向服务器发送一个控制消息(去了,我也不知道干啥用的!)

  3. 服务器收到请求后向客户端发送_result(),对创建流的消息进行响应。 此时NetStream创建完成

协议流程图:

6 播放

提示:

主要功能:传输音视频数据

看抓包:


万事具备,只欠东风了

1.客户端向服务器发送播放命令,请求播放stream,并设置Buffer Length 1,3000ms

2.服务器收到请求后,向客户端发送设置块大小的协议消息,并且还附加了一堆其他的消息一起发送:

包括 Stream Begin(告知客户端流ID为0)、NetStream.Play.Reset和NetStream.Play.Start(告知客户端播放成功,其中reset会调整流ID为1)、

3.服务器向客户端发送推流通知,并附带元数据信息(分辨率、、)和视频、音频采样率、帧率、音频码率、音频数据。 此时客户端就可以开始正常播放rtmp流了

协议流程图:

结语

本文总结了RTMP协议播放环节的全流程,后续文章将为大家带来更多RTMP实际输出中遇到的坑以及优化方案

参考文献

RTMP流媒体播放过程 - 雷霄骅(leixiaohua1020)的专栏 - 博客频道 - CSDN.NET

RTMP协议规范中文版

RTMP协议规范英文版

http://www.0791quanquan.com/news_keji/topic_1381439/

揭开RTMP播放流程的神秘面纱相关推荐

  1. 揭开J2EE集群的神秘面纱(一):什么是J2EE集群

    揭开J2EE集群的神秘面纱(一):什么是J2EE集群 作者:不详 来源:CSDN博客 酷勤网收集 2008-04-18 摘要 酷勤网 J2EE集群技术包括负载均衡和失效转移.负载均衡意味着有许多客户端 ...

  2. 连通子图什么意思_一道物理竞赛题揭开“希罗喷泉”的神秘面纱,到底什么物理原理?...

    多数初二的中学生朋友们现在都已经在学习压强知识,这一块知识属于中考物理必考重点内容,所占分值很高,所考查题型非常广泛,而且多是力学知识的综合性应用,因此属于中考的一个难点,中学生朋友们在遇到有关此类复 ...

  3. 算法笔记 揭开广度优先遍历BFS的神秘面纱 HERODING的算法之路

    揭开广度优先遍历BFS的神秘面纱 前言 1. 审题 1.1 树的BFS 1.2 图的BFS 2. 解法 2.1 树的BFS 2.2 图的BFS 3. 总结 前言 最近到了面试的高峰时期,前段时间也刷了 ...

  4. xpress-mp优化实例精选_实例解析,揭开“隔震技术”的神秘面纱!

    作者简介:仁者见仁,从事施工管理,深扎施工一线多年.著有微信公众号"仁者见仁",旨在为大家提供关于施工技术.项目管理最接地气的满满干货. 传统的抗震技术主要特点是"抗&q ...

  5. 揭开均线系统的神秘面纱_在应用程式审查API中揭开新玩法的神秘面纱

    揭开均线系统的神秘面纱 During the #11WeeksOfAndroid the new Play In-App Review API was announced. This was a lo ...

  6. 揭开Salesforce Accredited Professional证书神秘面纱,到底含金量有多高?

    自从Salesforce宣布Accredited Professional计划以来,已经过去了将近两年.这些认证旨在证明备考者在Salesforce平台特定领域的广泛知识,并且仅供Salesforce ...

  7. C ++匿名函数:揭开C++ Lambda表达式的神秘面纱

    潜意识编程:揭秘C++ Lambda表达式的神秘面纱 Subconscious Programming: Unveiling the Mystery of C++ Lambda Expressions ...

  8. hive 行转列和列转行的方法_读离线和实时大数据开发实战,为你揭开 Hive 优化实践的神秘面纱...

    前言 「1024,1GB,一级棒!程序仔们节日快乐!」 ❝ 指尖流动的 1024 行代码,到底是什么? ❞ ❝ 是10行的迷茫?是101行的叛逆?是202行的理性思考?是307行对渴望的冲动?还是40 ...

  9. manjaro文件不是一个有效的图表主题_重磅分享-揭开Excel动态交互式图表神秘面纱...

    今天,跟大家系统地分享下Excel动态交互式图表的制作方法.通过本文,你能学到动态交互式图表的制作原理.知识体系.实现方法.此外,本文会分享最经典的切片器+数据透视图制作仪表板方法.在之前的文章< ...

最新文章

  1. Python零基础入门(1)——Linux下安装及环境配置
  2. 使用Mysql数据库完成增删改查综合案例(JSP页面)
  3. 修改Linux网卡由eth1变成eth0
  4. 20165301 预备作业二:学习基础和C语言基础调查
  5. 【渝粤教育】电大中专学前儿童科学教育 (5)作业 题库
  6. Exchange Server 2013日记功能
  7. 重读经典:《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》
  8. window 写txt 换行
  9. java面向对象内存分析
  10. linux登录指令 pgsql_一句一例解读20条Linux常用指令,学会了你就入门了
  11. Java反编译工具JAD安装与基本使用
  12. wxPython in Action 学习笔记一
  13. HTML语言中 blur()方法,HTML DOM blur() 方法
  14. Webug靶场之旅——显错注入
  15. vue [ECharts] Unkown series surface
  16. 编程语言的起源和发展
  17. 通行费发票在哪里开?可以抵扣吗?
  18. js三元运算符(? :)的链式写法
  19. tomcat集群测试
  20. 直播系统源代码,实现快速排序和归并排序

热门文章

  1. HTML--特殊符号
  2. IDEA 设置文件编码
  3. cocos 链接PHP服务器,Cocos网络篇[3.2](2) ——HTTP连接
  4. 初始化创建 list
  5. 【Linux】BASH基本攻略,分分钟PK掉黑客达人
  6. 如何通过软文营销获得流量红利?
  7. Matlab中用于数据预测spline()函数的使用
  8. gitLab ssh密匙配置
  9. 蓝桥杯 ADV-168 贪吃的大嘴
  10. redis 4.Redis的发布和订阅