首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

手撕Rtmp协议细节(1)——握手

之前文章,我们介绍过基于rtmp的直播环境的搭建,接下来,我们一起来学习一下Rtmp协议的细节,由于协议本身比较琐碎,小编会将rtmp协议拆解为一个个的小的模块,通过本公号推送rtmp协议的系列文章,欢迎诸位关注,本篇首先来看看rtmp协议握手的部分。

RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议是应用层协议,基于TCP。RTMP是一种设计用来进行实时通信的网络协议,主要用来在Flash平台和支持RTMP协议的流媒体/交互服务器之间进行以视频和数据通信。直播场景中使用RTMP协议比较多。

RTMP协议建立连接的过程,也需要有握手的过程。这一篇就记录一下rtmp握手的过程。

RTMP协议是基于TCP的,TCP建立连接有三次握手。如下图:

所以,RTMP首先在TCP层面是有三次握手的过程的,在TCP连接建立以后,再进行RTMP协议层次的握手。

顺便说一下,熟悉和学习一种协议的时候,我们一般都通过网络抓包来分析学习,这样可以加深印象和理解。一般而言,比较常用的有wireshark,linux平台可以使用tcpdump或者tshark(wireshark的命令行版本),关于wireshark的相关知识这里就不赘述了。学习rtmp,同样我们也借助rtmp进行抓包,抓包需要有rtmp的场景,可以参照之前的文章“”直播“”构建产生rtmp的场景。

握手的简单流程

在rtmp连接建立以后,服务端要与客户端通过3次交换报文完成握手。与其他握手协议不同,rtmp协议握手交换的数据报文是固定大小的,客户端向服务端发送的3个报文为c0、c1、c2,服务端向客户端发送的3个报文为s0、s1、s2。c0与s0的大小为1个字节,c1与s1的大小为1536个字节,c2与s2的大小为1536个字节。

发送顺序

  • 建立连接后,客户端开始发送C0、C1块到服务器;
  • 服务器端收到C0或C1后发送S0和S1;
  • 当客户端收齐S0和S1之后,开始发送C2;
  • 当服务端收齐C0和C1后,开发发送S2;
  • 当客户端收到S2,服务端收到C2,握手完成。

在实际工程应用中,一般是客户端将C0、C1块同时发出,服务器在收到C1块之后同时将S0、S1、S2发给客户端。客户端收到S1之后,发送C2给服务端,握手完成。

握手数据包格式

  • C0和S0

C0和S0数据包占用一个字节,表示RTMP版本号。目前RTMP版本定义为3,0-2是早期的专利产品所使用的值,现已经废弃,4-31是预留值,32-255是禁用值。

  • C1和S1

C1和S1数据包占用1536个字节。包含4个字节的时间戳,4个字节的0和1528个字节的随机数。

  • C2和S2

C2和S2数据包占用1536个字节,包含4个字节的时间戳,4个字节的对端的时间戳(C2数据包为S1数据包的时间戳,S2为C1数据包的时间戳)。

几种握手的状态

  • 未初始化:协议版本被发送,客户端服务端都是未初始化的,客户端在C1数据包中发送协议版本,如果服务器支持这个版本,将会发送S0和S1作为响应,如果不支持,则服务端会用响应的动作来响应,在RTMP中这个动作是结束这个连接。
  • 版本发送完成:客户端和服务端在未初始化状态之后都进入到版本发送完成状态,客户端等待包S1,服务端等待包C1,在收到相应的包后,客户端发送包C2,服务端发送包S2,状态变成询问发送完成。
  • 询问发送完成:客户端和服务端等待S2和C2。
  • 握手完成:客户端和服务端开始交换信息。

接下来我们通过wireshark看一个实际的rtmp握手的过程:

注意,wireshart过滤RTMP协议的条件是rtmpt,不要忘了后面的t。

抓包实战

  • source为客户端(192.17.1.92),握手时首先向server(192.17.1.200)发送C0和C1数据包;
  • 服务端收到C0和C1数据包之后,直接发送S0+S1+S2数据包;
  • 客户端收到服务端发来的S2数据包后,发送C2数据包,至此,rtmp握手完成,可以进行数据交换了。
  • 再看下C0和C1数据包的内容
  • S0+S1+S2的数据
  • C2的数据

哦,对了,差点忘了说,rtmp服务端默认端口1935,一般在nginx服务器中配置,从抓包中明显可以看出。

写到这里,rtmp协议的握手的流程我们就基本清晰了,握手的过程主要完成了两个工作,一是对rtmp的版本进行校验,二是发送了一些随机数据,用于网络状况的检测。握手成功之后,表示客户端和服务器之间可以正常进行网络通信,接下来就可以进行数据的交互了。

本篇就到这里,接下来的文章我们来了解一下,rtmp如何组织网络中传输的数据,欢迎来围观。

举报
领券