SRS 入门:RTMP 协议基础
对应视频:
139--05-SRS流媒体服务器-RTMP协议1.mp4140--05-SRS流媒体服务器-RTMP协议2.mp4这篇只讲 RTMP 的基础概念:握手、命令消息、chunk、connect/createStream/publish/play。刚入门先抓流程,不急着背所有字段。
1. RTMP 在做什么
RTMP 是一种基于 TCP 的流媒体协议。它既负责连接控制,也负责传输音视频消息。
一个 RTMP 客户端连 SRS 后,大致会这样走:
TCP connect
RTMP handshake
connect
createStream
publish 或 play
持续发送/接收 audio/video/script 消息
close
2. RTMP 握手
RTMP 握手发生在 TCP 连接建立之后,正式命令交互之前。
常见握手流程:
Client -> Server: C0 + C1
Server -> Client: S0 + S1 + S2
Client -> Server: C2
入门理解:
C0/S0:版本信息。C1/S1:包含时间戳和随机数据。C2/S2:用于确认对方数据。

握手成功后,双方才开始发送 RTMP command message 和媒体消息。
3. RTMP 消息和 Chunk
RTMP 不是简单地“一条消息直接一次发完”。它会把消息切成 chunk 传输。
先分清两个层次:
| 层次 | 说明 |
|---|---|
| Message | 语义层的一条消息,例如 connect、publish、音频帧、视频帧 |
| Chunk | 传输层的小块,Message 可以被拆成多个 Chunk |

为什么要拆 chunk:
- 控制单次发送块大小。
- 多路消息可以交错传输。
- 减少大消息阻塞小控制消息的情况。
常见消息类型:
| 类型 | 含义 |
|---|---|
| Command Message | 命令消息,例如 connect、createStream、publish、play |
| Audio Message | 音频数据 |
| Video Message | 视频数据 |
| Data Message | 元数据,例如 onMetaData |
| User Control Message | 用户控制消息,例如 Stream Begin |
| Window Acknowledgement Size | 确认窗口大小 |
| Set Chunk Size | 设置 chunk 大小 |
4. SRS 中的握手代码
SRS 收到 RTMP 连接后,会先做握手,再进入命令消息处理。

可以用这个伪代码理解:
client 连接进来
SRS 创建 SrsRtmpConn
do_cycle()
handshake()
connect_app()
service_cycle()
如果握手失败,后面的 connect、publish、play 都不会发生。
5. connect 命令
connect 是握手后的第一个关键命令。客户端通过它告诉服务器:
- 我要连接哪个 app。
- 使用什么 tcUrl。
- 支持什么能力。
- 可能还带鉴权、flashVer、objectEncoding 等信息。
SRS 需要解析 connect 请求,并返回 _result。

简化流程:
client: connect(app=live)
server: Window Acknowledgement Size
server: Set Peer Bandwidth
server: Set Chunk Size
server: _result
6. createStream
createStream 用来创建一个 RTMP stream id。后续 publish 或 play 会基于这个 stream id 进行。

入门理解:
连接是 TCP 级别的通道
stream 是 RTMP 里承载某一路媒体的逻辑通道
7. publish 和 play
publish 表示客户端要推流。
推流端 -> SRS:
publish live/livestream
metadata
video messages
audio messages
play 表示客户端要拉流。
播放器 -> SRS:
play live/livestream
SRS -> 播放器:
metadata
video messages
audio messages
推流和拉流的命令不一样,但它们最终会围绕同一个 SrsSource 工作:推流端把消息写进去,拉流端从里面读出来。
8. 用 Wireshark 看 RTMP
抓包时可以先看整体顺序:
TCP 三次握手
RTMP C0/C1/S0/S1/S2/C2
connect
createStream
publish 或 play
音视频数据

新手调试时不要一开始就抠每个字节,先确认:
- 握手是否完成。
connect是否有_result。createStream是否有响应。- 推流是否发出了
publish。 - 拉流是否发出了
play。 - 后续是否有 Audio/Video Message。
9. RTMP 命令顺序速记
推流:
handshake
connect
createStream
publish
metadata
audio/video
拉流:
handshake
connect
createStream
play
metadata
audio/video

最后记住一句:
RTMP 先握手,再用命令建立会话,之后不断传 audio/video message。
评论
...正在读取评论。