Skip to content

Latest commit

 

History

History
150 lines (86 loc) · 5.89 KB

RTMP.md

File metadata and controls

150 lines (86 loc) · 5.89 KB

RTMP

rtmp推流

tcp 3次握手

image

RTMP握手

首先服务端与客户端需要通过3次交换报文完成握手,RTMP是由三个静态大小的块,而不是可变大小的块组成的,客户端与服务器发送相同的三个chunk,客户端发送c0,c1,c2,服务端发送s0,s1,s2。

image

  • 客户端发送 C0,C1 块,握手开始。
  • 客户端在发送 C2 之前客户端必须等待接收 S1 。
  • 客户端在发送任何数据之前客户端必须等待接收 S2。
  • 服务端在发送 S0 和 S1 之前必须等待接收 C0,也可以等待接收 C1。
  • 服务端在发送 S2 之前必须等待接收 C1。
  • 服务端在发送任何数据之前必须等待接收 C2。

RTMP建立连接

image

  • 客户端发送命令消息中的“连接”(connect)到服务器,请求与一个服务应用实例建立连接。
  • 服务器接收到连接命令消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到客户端,同时连接到连接命令中提到的应用程序。
  • 服务器发送设置带宽协议(Set Peer Bandwidth)消息到客户端。
  • 客户端处理设置带宽协议消息后,发送确认窗口大小(Window Acknowledgement Size)协议消息到服务器端。
  • 服务器发送用户控制消息中的“流开始”(Stream Begin)消息到客户端。
  • 服务器发送命令消息中的“结果”(_result),通知客户端连接的状态。

push数据抓包分析

(1)tcp 3次握手

image

(2)[client -> server] Handshake C0+C1

image

(3)[server -> client] Handshake S0+S1+S2

image

(4)[client -> server] Handshake C2

image

(5)[client -> server] connect('live')

image

(6)[server -> client] Window Acknowledgement Size

image

(7)[server -> client] Set Peer Bandwidth(5000000); NetConnection.Connect.Success;

image

(8)[client -> server] createStream()

image

(9)publish

image

(10)[client -> server] setDataFrame()

image

(11)[client -> server] Video Data; Audio Data

image

rtmp拉流player

image

pull数据抓包分析

(1) tcp 3次 握手

(2)[client -> server] Handshake C0+C1 image

(3)[server -> client] Handshake S0+S1+S2 image

(4)[client -> server] Handshake C2 image

(5)[client -> server] connect('live') image

(6)[server -> client] Window Acknowledgement Size

(7)[client -> server] createStream() image

(8)[server -> client] _result() image

(9)[client -> server] getStreamLength(); player('zhangbiwu') image

(10)[server -> client] Audio; Video image

RTMP传输过程

image

FAQ

RTMP直播推流中需要注意的点

  • 握手开始于客户端发送C0、C1块。 服务器收到C0或C1后发送S0和S1。
  • 当客户端收齐S0和S1后,开始发送C2。 当服务器收齐C0和C1后,开始发送S2。
  • 当客户端和服务器分别收到S2和C2后,握手完成。

link