[ PROMPT_NODE_24386 ]
常见问题与排查
[ SKILL_DOCUMENTATION ]
# TURN 常见问题与排查
Cloudflare TURN 的常见错误、安全最佳实践及故障排除。
## 快速参考
| 问题 | 解决方案 | 详情 |
|-------|----------|---------|
| 凭据无效 | 检查 TTL ≤ 48小时 | [查看排查](#issue-turn-credentials-not-working) |
| ~48小时后连接断开 | 实现凭据刷新 | [查看连接断开](#issue-connection-drops-after-48-hours) |
| 浏览器中 53 端口失败 | 服务端过滤 | [查看 53 端口](#using-port-53-in-browsers) |
| 高丢包率 | 检查速率限制 | [查看速率限制](#limits-per-turn-allocation) |
| 维护后连接失败 | 实现 ICE 重启 | [查看 ICE 重启](#ice-restart-required-scenarios) |
## 关键约束
| 约束 | 值 | 违规后果 |
|------------|-------|-------------------------|
| 最大凭据 TTL | 48 小时 (172800秒) | API 拒绝请求 |
| 凭据撤销延迟 | ~秒级 | 计费立即停止,连接很快断开 |
| IP 白名单更新窗口 | 14 天 (若 IP 变更) | 若 IP 变更则连接失败 |
| 数据包速率 | 5-10k pps/分配 | 丢包 |
| 数据速率 | 50-100 Mbps/分配 | 丢包 |
| 唯一 IP 速率 | >5 个新 IP/秒 | 丢包 |
## 每个 TURN 分配的限制
**按用户计算**(非账户级):
- **IP 地址**: 每秒 >5 个新唯一 IP
- **数据包速率**: 每秒 5-10k 个数据包(入站/出站)
- **数据速率**: 50-100 Mbps(入站/出站)
- **MTU**: 无特定限制
- **突发速率**: 高于文档记录值
超过限制会导致 **丢包**。
## 常见错误
### 设置 TTL > 48 小时
typescript
// ❌ 错误:API 将拒绝
const creds = await generate({ ttl: 604800 }); // 7 天
// ✅ 正确:
const creds = await generate({ ttl: 86400 }); // 24 小时
### 未经监控硬编码 IP
typescript
// ❌ 错误:IP 可能在 14 天通知期内变更
const iceServers = [{ urls: 'turn:141.101.90.1:3478' }];
// ✅ 正确:使用 DNS
const iceServers = [{ urls: 'turn:turn.cloudflare.com:3478' }];
### 在浏览器中使用 53 端口
typescript
// ❌ 错误:被 Chrome/Firefox 拦截
urls: ['turn:turn.cloudflare.com:53']
// ✅ 正确:过滤 53 端口
urls: urls.filter(url => !url.includes(':53'))
### 未处理凭据过期
typescript
// ❌ 错误:凭据过期但通话继续 → 连接断开
const creds = await fetchCreds();
const pc = new RTCPeerConnection({ iceServers: creds });