徐州网站关键词推广,中国核工业二三建设有限公司西南分公司,手机网站如何做外链,英雄联盟网页制作素材RTMP#xff08;Real-Time Messaging Protocol#xff09;是一种用于实时音视频和数据传输的协议#xff0c;常见于直播和流媒体应用。
一 RTSP 协商消息
一、消息类型#xff08;Message Types#xff09;
RTMP消息分为多种类型#xff0c;通过Message Type ID标识Real-Time Messaging Protocol是一种用于实时音视频和数据传输的协议常见于直播和流媒体应用。
一 RTSP 协商消息
一、消息类型Message Types
RTMP消息分为多种类型通过Message Type ID标识主要包括
控制消息Control MessagesType ID 1-7 Set Chunk Size (ID1)设置分块大小。Window Acknowledgement Size (ID5)设置确认窗口大小。Set Peer Bandwidth (ID6)协商带宽限制。 数据消息Data Messages AMF0 (ID18) 或 AMF3 (ID19)传输元数据或命令如onMetaData。 音视频数据 音频数据 (ID8)、视频数据 (ID9)传输原始音视频流。 用户控制消息 (ID4)如流开始/结束事件。
二、元数据Metadata
元数据用于描述流的基本信息通常以onMetaData命令形式通过AMF0/AMF3编码发送。包含字段如
视频宽度、高度、帧率、编码格式。音频采样率、编码类型、时长等。示例AMF0命令格式onMetaData { duration: 60, width: 1280, ... }。
三、消息分块Message Chunking
RTMP将消息拆分为多个Chunk传输以提升实时性。分块规则如下
Chunk Header Basic Header1-3字节包含Chunk Stream ID和Chunk Type。Message Header根据Chunk Type0-3决定包含字段时间戳、消息长度、Type ID等。Extended Timestamp可选当时间戳≥0xFFFFFF时启用。 分块示例 若块大小设为128字节300字节的消息会被分为3个Chunk12812844。
四、客户端与服务端协商过程
1. 握手Handshake
C0/S0交换版本号通常为3。C1/S1交换随机数据和时间戳。C2/S2确认随机数据完成握手。
2. 参数协商Post-Handshake
握手后通过控制消息协商传输参数
Set Chunk Size (Type1) 双方发送此消息确定Chunk大小默认128字节可设为4096等。 Window Acknowledgement Size (Type5) 设置接收方确认窗口大小流量控制。 Set Peer Bandwidth (Type6) 协商带宽限制接收方需确认模式硬限/动态/软限。
3. 连接与流创建
Connect Command客户端发送连接请求包含应用名称、传输参数等。CreateStream Command创建逻辑流服务端返回Stream ID。发布/播放流传输音视频数据及元数据onMetaData。
五、关键流程示例
客户端发送connect| Chunk Stream ID3 | AMF0 Commandconnect | Transaction ID1 | Applive | ... |服务端响应Window Ack Size和Set Chunk Size| Chunk Stream ID2 | Control Message (Type5, Ack Size2500000) |
| Chunk Stream ID2 | Control Message (Type1, Chunk Size4096) |发送元数据onMetaData| Chunk Stream ID4 | AMF0 Data (Type18) | onMetaData { width: 1280, ... } |总结
协商内容块大小、带宽、确认窗口等通过控制消息动态调整。元数据通过AMF数据消息传输描述流属性。分块机制提升传输效率适应网络波动。流程顺序握手 → 参数协商 → 连接 → 流创建 → 数据传输。
通过上述机制RTMP实现了低延迟、自适应的流媒体传输适用于实时性要求高的场景。
RTMP 协议在客户端与服务器建立会话后通过以下机制维护连接的稳定性并在断开时进行相应处理
二 会话维护
一、会话维护机制
1. 心跳机制Keep-Alive
RTMP 使用 User Control Messages (Type4) 中的 Ping/Pong 机制作为心跳
Ping (Event6)服务器或客户端主动发送携带时间戳4字节。Pong (Event7)接收方需立即响应返回相同的 Ping 时间戳。作用 检测连接活性若未及时收到 Pong则认为连接已断开。默认间隔通常为 5-10 秒具体由实现决定。
2. 流量控制与确认机制
Window Acknowledgement Size (Type5) 接收方告知发送方可发送的最大未确认字节数例如 2500000 字节。发送方需在达到该阈值后暂停发送直到收到确认Ack。 Acknowledgment (Type3) 接收方定期发送已接收字节数的确认帮助发送方调整传输速率。 作用 避免网络拥塞同时间接检测连接状态若无 Ack 返回可能连接异常。
3. TCP 层保活Keep-Alive
依赖 TCP 协议的 Keep-Alive 机制默认间隔通常较长如 2 小时。RTMP 更多依赖应用层Ping/Pong而非 TCP 保活因后者响应不够实时。
4. 超时检测
服务器/客户端设定 空闲超时时间如 30 秒 若在超时时间内未收到任何数据包或心跳响应则主动断开连接。 二、断开后的处理逻辑
1. 检测断开
主动检测通过心跳超时未收到 Pong或 TCP 连接异常事件如 ECONNRESET。被动检测发送数据时发现写入失败如 Broken Pipe 错误。
2. 客户端处理
自动重连 关闭旧连接重新发起握手C0-C2/S0-S2。重新协商参数Chunk Size、带宽等。重新创建流createStream并发布/播放。 重试策略 指数退避首次立即重试失败后等待 1s、2s、4s… 避免频繁请求。最大重试次数例如 3 次后放弃通知用户。
3. 服务端处理
清理资源 释放与连接关联的流Stream和会话Session资源。通知其他订阅者该流已终止如发送 onStatus 事件。 日志与告警 记录断开原因超时、主动关闭、网络错误等。触发监控告警如大量异常断开。
4. 应用层容错
会话恢复 若支持客户端重连后可尝试恢复之前的流需服务端支持会话续传。例如通过唯一 Session ID 关联旧流非 RTMP 标准需自定义实现。 状态同步 重连后重新发送关键元数据如 onMetaData确保播放端状态一致。
三、示例流程
1. 正常心跳交互
Server - Client: User Control Message (Ping, Time1000)
Client - Server: User Control Message (Pong, Time1000)2. 心跳超时导致断开
Server - Client: Ping (Time2000)
[Client未响应]
Server检测超时30秒- 关闭连接释放资源。3. 客户端重连
1. 客户端检测断开 - 触发重连逻辑。
2. 重新握手C0-C1-C2/S0-S1-S2。
3. 发送 Set Chunk Size、Window Ack Size 等参数。
4. 发送 createStream 创建新流。
5. 重新发布/播放流并发送元数据。四、优化实践
合理配置超时时间 心跳间隔5-10 秒超时时间3 倍间隔如 15-30 秒。 冗余设计 客户端实现断线重连队列缓存未发送的数据如直播推流的最后几秒数据。 快速失败与降级 若多次重连失败切换备用服务器或通知用户检查网络。 服务端负载均衡 使用集群避免单点故障客户端支持故障转移Failover。 总结
RTMP 通过 应用层心跳Ping/Pong、流量控制确认 和 超时检测 维护会话活性。断开后客户端和服务端需协作清理资源并尝试恢复通常需应用层逻辑支持完整重连流程。实际开发中需结合业务场景优化重试策略和容错机制以提升用户体验。