# RTMP 握手失败：服务器以意外的版本字节 0x03 响应

- **ID:** `communication/rtmp-handshake-failed`
- **领域:** communication
- **类别:** protocol_error
- **错误码:** `0x03`
- **验证级别:** ai_generated
- **修复率:** 79%

## 根因

RTMP 客户端和服务器无法协商握手，因为服务器期望 Flash Player 版本 9+（字节 0x03），但客户端发送了较旧或格式错误的版本（例如 0x00 或 0x01），通常是由于过时的库或防火墙篡改。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| RTMP specification (Adobe) | active | — | — |
| FFmpeg 6.0 | active | — | — |
| OBS Studio 29.1 | active | — | — |
| nginx-rtmp-module 1.2.2 | active | — | — |
| Wowza Streaming Engine 4.8.0 | active | — | — |

## 解决方案

1. ```
   Update the RTMP client library to a version that sends the correct handshake byte (0x03): for FFmpeg, upgrade to 6.0 or later; for OBS, ensure version 29.0+.
   ```
2. ```
   Override the handshake version on the server side: in nginx-rtmp-module, set 'rtmp_version 3;' in the configuration to force acceptance of older clients (though this may reduce security).
   ```
3. ```
   Use a proxy to rewrite the handshake: deploy a simple RTMP proxy (e.g., using Node.js 'node-rtmp-server') that intercepts the client's version byte and sends the expected 0x03 to the server.
   ```

## 无效尝试

- **** — Disabling RTMP authentication (e.g., removing 'rtmp_auth' in nginx) does not affect the handshake version negotiation; the version byte mismatch persists. (80% 失败率)
- **** — Using a different streaming protocol (e.g., RTSP instead of RTMP) changes the issue but may introduce new compatibility problems with the server. (70% 失败率)
- **** — Increasing the handshake timeout (e.g., 'rtmp_handshake_timeout 30s') only delays the failure; the version mismatch remains. (85% 失败率)
