欢迎多多交流:18665385110
1. 系统概述
本系统是一个基于 WebRTC 的实时音视频通话平台,采用客户端-服务器架构,支持点对点(P2P)视频通话、NAT 穿透、多人在线管理等功能。系统由以下核心组件构成:
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 系统整体架构 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Android 客户端 A │ │ Android 客户端 B │ │
│ │ │ │ │ │
│ │ ┌────────────┐ │ │ ┌────────────┐ │ │
│ │ │ WebRTC │ │ │ │ WebRTC │ │ │
│ │ │ 音视频引擎 │ │ │ │ 音视频引擎 │ │ │
│ │ └────────────┘ │ │ └────────────┘ │ │
│ │ ┌────────────┐ │ │ ┌────────────┐ │ │
│ │ │ TCP 信令 │ │ │ │ TCP 信令 │ │ │
│ │ └────────────┘ │ │ └────────────┘ │ │
│ └────────┬─────────┘ └────────┬─────────┘ │
│ │ │ │
│ │ TCP 信令通道 │ │
│ │ (注册/呼叫/SDP/ICE) │ │
│ │ │ │
│ └────────────┬───────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────┐ │
│ │ TCP 信令服务器 │ │
│ │ (端口: 3480) │ │
│ │ │ │
│ │ - 用户注册管理 │ │
│ │ - 消息转发 │ │
│ │ - 在线状态管理 │ │
│ │ - 心跳检测 │ │
│ └────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────┐ │
│ │ STUN/TURN 服务器 │ │
│ │ (端口: 3478/3479) │ │
│ │ │ │
│ │ - NAT 穿透 │ │
│ │ - ICE 候选者收集 │ │
│ │ - 中继转发(TURN) │ │
│ └────────────────────────┘ │
│ │
│ ════════════════════════════════════════════════════════ │
│ P2P 音视频数据通道 │
│ ════════════════════════════════════════════════════════ │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 客户端 A │ ◄───────────────────► │ 客户端 B │ │
│ │ │ 音视频数据流 │ │ │
│ └──────────────────┘ └──────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
2. 技术栈
2.1 服务端技术栈
| 组件 | 技术选型 | 说明 |
|---|---|---|
| 信令服务器 | Go 1.18+ | TCP 长连接管理、消息转发 |
| STUN/TURN | coturn | NAT 穿透服务 |
| 数据库 | MySQL 5.7+ | 用户数据存储 |
| Web 服务器 | Apache/Nginx | HTTPS 反向代理 |
| 进程管理 | PM2 | 服务监控和自动重启 |
2.2 客户端技术栈
| 组件 | 技术选型 | 说明 |
|---|---|---|
| 开发语言 | Kotlin | Android 原生开发 |
| 音视频引擎 | Google WebRTC | 实时音视频处理 |
| 网络通信 | Socket (TCP) | 信令传输 |
| 异步处理 | Coroutines | Kotlin 协程 |
| UI 框架 | Android SDK | 原生界面 |
3. 核心模块详解
3.1 服务端架构
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 服务端架构 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
│ │ main.go (入口) │ │
│ │ - 加载配置 │ │
│ │ - 初始化日志 │ │
│ │ - 启动信令服务器 │ │
│ │ - 启动 STUN/TURN 服务器 │ │
│ │ - 启动健康检查服务 │ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────┼───────────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ protocol.go │ │ client.go │ │ message.go │ │
│ │ │ │ │ │ │ │
│ │ - 消息类型定义 │ │ - 客户端管理 │ │ - 消息处理 │ │
│ │ - 协议常量 │ │ - 注册处理 │ │ - 心跳处理 │ │
│ │ - Client 结构 │ │ - 连接统计 │ │ - SDP 转发 │ │
│ └───────────────┘ │ - 资源清理 │ │ - ICE 转发 │ │
│ └───────────────┘ └───────────────┘ │
│ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ config.go │ │ worker_pool.go│ │ stun_turn.go │ │
│ │ │ │ │ │ │ │
│ │ - 配置加载 │ │ - 工作池管理 │ │ - STUN 服务 │ │
│ │ - 参数验证 │ │ - 任务分发 │ │ - TURN 服务 │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │
│ ┌───────────────┐ ┌───────────────┐ │
│ │ logger.go │ │ health_check.go│ │
│ │ │ │ │ │
│ │ - 日志输出 │ │ - 健康检查 │ │
│ │ - 文件轮转 │ │ - 状态监控 │ │
│ └───────────────┘ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
3.1.1 消息协议
服务端采用长度前缀 + JSON 的消息格式:
┌─────────────────────────────────────────────────────────────┐
│ 消息格式 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 长度前缀 (4 字节, Big Endian) │ │
│ │ 表示后续 JSON 数据的字节长度 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ JSON 数据 │ │
│ │ { │ │
│ │ "type": "消息类型", │ │
│ │ "sender_id": "发送方ID", │ │
│ │ "receiver_id": "接收方ID", │ │
│ │ "data": "消息内容" │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
3.1.2 支持的消息类型
| 消息类型 | 方向 | 说明 |
|---|---|---|
register |
客户端→服务器 | 用户注册 |
register_response |
服务器→客户端 | 注册响应 |
heartbeat |
客户端→服务器 | 心跳保持 |
heartbeat_response |
服务器→客户端 | 心跳响应 |
query_online_users |
客户端→服务器 | 查询在线用户 |
query_online_users_response |
服务器→客户端 | 在线用户列表 |
get_stun_turn_config |
客户端→服务器 | 获取 STUN/TURN 配置 |
get_stun_turn_config_response |
服务器→客户端 | STUN/TURN 配置 |
call_request |
客户端→客户端 | 呼叫请求 |
call_stop |
客户端→客户端 | 挂断通知 |
webrtc_sdp |
客户端→客户端 | SDP 交换 |
webrtc_ice_candidate |
客户端→客户端 | ICE 候选者交换 |
3.1.3 连接统计
服务端对每个连接进行详细统计:
go
type ClientStats struct {
ConnectTime time.Time // 连接建立时间
MessagesSent int64 // 发送消息数
MessagesReceived int64 // 接收消息数
BytesSent int64 // 发送字节数
BytesReceived int64 // 接收字节数
HeartbeatSent int64 // 发送心跳数
HeartbeatReceived int64 // 接收心跳数
CallRequestSent int64 // 发起呼叫数
CallRequestReceived int64 // 接收呼叫数
CallStopSent int64 // 发起挂断数
CallStopReceived int64 // 接收挂断数
WebRTCSdpSent int64 // SDP 发送数
WebRTCSdpReceived int64 // SDP 接收数
WebRTCIceCandidateSent int64 // ICE 发送数
WebRTCIceCandidateReceived int64 // ICE 接收数
Errors int64 // 错误数
}
3.2 客户端架构
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 客户端架构 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
│ │ UI 层 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │LoginActivity│ │MainActivity │ │UserList │ │VideoCall │ │ │
│ │ │ │ │ │ │Fragment │ │Activity │ │ │
│ │ │ - 用户登录 │ │ - 导航管理 │ │ - 用户列表 │ │ - 视频通话 │ │ │
│ │ │ - 账号注册 │ │ - TCP 管理 │ │ - 呼叫发起 │ │ - WebRTC │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
│ │ 信令层 │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ TcpSignalingClient │ │ │
│ │ │ - TCP 连接管理 │ │ │
│ │ │ - 消息发送/接收 │ │ │
│ │ │ - 心跳保持 │ │ │
│ │ │ - 断线重连 │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ┌───────────────────────────┼───────────────────────────┐ │ │
│ │ │ │ │ │ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐│ │
│ │ │MessageHandler │ │HeartbeatManager│ │TcpProtocol ││ │
│ │ │ │ │ │ │ ││ │
│ │ │ - 消息解析 │ │ - 心跳发送 │ │ - 编码/解码 ││ │
│ │ │ - 回调分发 │ │ - 超时检测 │ │ - 长度前缀 ││ │
│ │ └───────────────┘ └───────────────┘ └───────────────┘│ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
│ │ WebRTC 层 │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ WebRTCClient │ │ │
│ │ │ - PeerConnection 管理 │ │ │
│ │ │ - 媒体流管理 │ │ │
│ │ │ - SDP 协商 │ │ │
│ │ │ - ICE 候选者管理 │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ │ ┌───────────────────────────┼───────────────────────────┐ │ │
│ │ │ │ │ │ │
│ │ ▼ ▼ ▼ │ │
│ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐│ │
│ │ │PeerConnection │ │SdpManager │ │IceCandidate ││ │
│ │ │Manager │ │ │ │Manager ││ │
│ │ │ │ │ │ │ ││ │
│ │ │ - 连接创建 │ │ - SDP 缓存 │ │ - ICE 缓存 ││ │
│ │ │ - 状态监控 │ │ - 时序管理 │ │ - 时序管理 ││ │
│ │ │ - 媒体协商 │ │ │ │ ││ │
│ │ └───────────────┘ └───────────────┘ └───────────────┘│ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────────────────────┐ │
│ │ 网络层 │ │
│ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐│ │
│ │ │DnsCache │ │NetworkMonitor │ │AppConfig ││ │
│ │ │ │ │ │ │ ││ │
│ │ │ - DNS 缓存 │ │ - 网络状态 │ │ - 配置管理 ││ │
│ │ │ - 解析优化 │ │ - 连接检测 │ │ - 参数存储 ││ │
│ │ └───────────────┘ └───────────────┘ └───────────────┘│ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
3.2.1 目录结构
android_client/app/src/main/java/com/example/videocall/
├── di/ # 依赖注入
│ └── ServiceLocator.kt
├── model/ # 数据模型
│ ├── CallState.kt # 通话状态
│ ├── Message.kt # 消息结构
│ ├── MessageType.kt # 消息类型
│ ├── NatType.kt # NAT 类型
│ └── User.kt # 用户模型
├── network/ # 网络模块
│ ├── DnsCache.kt # DNS 缓存
│ └── NetworkMonitor.kt # 网络监控
├── signaling/ # 信令模块
│ ├── HeartbeatManager.kt # 心跳管理
│ ├── MessageHandler.kt # 消息处理
│ ├── TcpProtocol.kt # TCP 协议
│ └── TcpSignalingClient.kt # TCP 客户端
├── util/ # 工具类
│ ├── AppConfig.kt # 应用配置
│ ├── Logger.kt # 日志工具
│ └── PermissionHelper.kt # 权限管理
├── webrtc/ # WebRTC 模块
│ ├── IceCandidateManager.kt # ICE 管理
│ ├── NatTypeDetector.kt # NAT 检测
│ ├── PeerConnectionManager.kt# 连接管理
│ ├── SdpManager.kt # SDP 管理
│ └── WebRTCClient.kt # WebRTC 客户端
├── ui/ # UI 层
│ ├── call/
│ │ └── VideoCallActivity.kt
│ ├── login/
│ │ └── LoginActivity.kt
│ └── main/
│ ├── MainActivity.kt
│ └── UserListFragment.kt
└── WebRTCPreInitializer.kt # WebRTC 预初始化
4. 核心流程
4.1 用户注册流程
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 用户注册流程 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ Android 客户端 TCP 服务器 │
│ │ │ │
│ │ 1. 用户输入用户名和密码 │ │
│ │ ────────────────────> │ │
│ │ │ │
│ │ 2. HTTP 登录请求 │ │
│ │ POST /api/login │ │
│ │ ───────────────────────────────────────────────>│ │
│ │ │ │
│ │ 3. 登录成功,返回用户信息 │ │
│ │ <───────────────────────────────────────────────│ │
│ │ │ │
│ │ 4. 启动 TcpSignalingClient │ │
│ │ - DNS 解析 │ │
│ │ - 建立 TCP 连接 │ │
│ │ │ │
│ │ 5. 发送 register 消息 │ │
│ │ {"type":"register","sender_id":"user_a"} │ │
│ │ ───────────────────────────────────────────────>│ │
│ │ │ │
│ │ │ 6. 记录用户连接 │
│ │ │ - 存储 client_id │
│ │ │ - 更新在线状态 │
│ │ │ │
│ │ 7. 返回 register_response │ │
│ │ {"type":"register_response","data":"成功"} │ │
│ │ <───────────────────────────────────────────────│ │
│ │ │ │
│ │ 8. 启动心跳管理器 │ │
│ │ - 每 90 秒发送心跳 │ │
│ │ │ │
│ │ 9. 查询在线用户 │ │
│ │ {"type":"query_online_users"} │ │
│ │ ───────────────────────────────────────────────>│ │
│ │ │ │
│ │ 10. 返回在线用户列表 │ │
│ │ <───────────────────────────────────────────────│ │
│ │ │ │
│ ▼ ▼ │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
4.2 视频通话建立流程
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 视频通话建立流程 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 客户端 A (主叫) TCP 服务器 客户端 B (被叫) │
│ │ │ │ │
│ │ 1. 用户点击呼叫 B │ │ │
│ │ ────────────────> │ │ │
│ │ │ │ │
│ │ 2. call_request │ │ │
│ │ ─────────────────────────>│ │ │
│ │ │ │ │
│ │ │ 3. 转发 call_request │ │
│ │ │ ──────────────────────>│ │
│ │ │ │ │
│ │ │ │ 4. 手机响铃 │
│ │ │ │ 用户点击接听 │
│ │ │ │ │
│ │ 5. 获取 STUN/TURN 配置 │ │ │
│ │ ─────────────────────────>│ │ │
│ │ <─────────────────────────│ │ │
│ │ │ │ │
│ │ 6. 创建 PeerConnection │ │ │
│ │ 创建本地媒体流 │ │ │
│ │ 创建 Offer │ │ │
│ │ │ │ │
│ │ 7. webrtc_sdp (offer) │ │ │
│ │ ─────────────────────────>│ │ │
│ │ │ 8. 转发 offer │ │
│ │ │ ──────────────────────>│ │
│ │ │ │ │
│ │ │ │ 9. 设置远程描述 │
│ │ │ │ 创建 Answer │
│ │ │ │ │
│ │ │ 10. webrtc_sdp (answer)│ │
│ │ │ <──────────────────────│ │
│ │ 11. 转发 answer │ │ │
│ │ <─────────────────────────│ │ │
│ │ │ │ │
│ │ 12. 设置远程描述 │ │ │
│ │ │ │ │
│ │ ════════════════════════════════════════════════════════════════ │
│ │ │
│ │ 13. ICE Candidate 交换 (双向) │
│ │ - 收集本地候选者 │
│ │ - 发送给对方 │
│ │ - 添加远程候选者 │
│ │ │
│ │ ════════════════════════════════════════════════════════════════ │
│ │ │ │ │
│ │ 14. ICE 连接建立成功 │ │ │
│ │ IceConnectionState = CONNECTED │ │
│ │ │ │ │
│ │ <═════════════════════════ P2P 音视频数据流 ═════════════════════> │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
4.3 挂断流程
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 挂断流程 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 客户端 A (挂断方) TCP 服务器 客户端 B (被叫方) │
│ │ │ │ │
│ │ 1. 用户点击挂断 │ │ │
│ │ ────────────────> │ │ │
│ │ │ │ │
│ │ 2. call_stop │ │ │
│ │ {"type":"call_stop", │ │ │
│ │ "sender_id":"A", │ │ │
│ │ "receiver_id":"B"} │ │ │
│ │ ─────────────────────────>│ │ │
│ │ │ │ │
│ │ │ 3. 转发 call_stop │ │
│ │ │ ──────────────────────>│ │
│ │ │ │ │
│ │ 4. 清理资源 │ │ 5. 清理资源 │
│ │ - 关闭 PeerConnection │ │ - 关闭连接 │
│ │ - 释放媒体流 │ │ - 释放资源 │
│ │ - 清空回调 │ │ - 返回主界面 │
│ │ - 返回主界面 │ │ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
5. 部署架构
5.1 生产环境部署
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 生产环境部署架构 │
├─────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ │
│ │ 域名/SSL证书 │ │
│ │ videocall.itgcs │ │
│ │ .tech │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Nginx/Apache │ │
│ │ 反向代理 │ │
│ │ HTTPS 443 │ │
│ └────────┬────────┘ │
│ │ │
│ ┌─────────────────────────┼─────────────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ TCP 信令服务器 │ │ STUN/TURN 服务│ │ 管理系统 │ │
│ │ │ │ │ │ │ │
│ │ 端口: 3480 │ │ STUN: 3478 │ │ 端口: 8080 │ │
│ │ PM2 管理 │ │ TURN: 3479 │ │ PM2 管理 │ │
│ │ │ │ coturn │ │ │ │
│ │ - 消息转发 │ │ │ │ - 用户管理 │ │
│ │ - 在线管理 │ │ - NAT 穿透 │ │ - 设备管理 │ │
│ │ - 心跳检测 │ │ - 中继转发 │ │ - API 服务 │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │ │ │
│ │ │ │
│ └───────────────────────┬───────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ MySQL │ │
│ │ 数据库 │ │
│ │ │ │
│ │ - 用户数据 │ │
│ │ - 设备数据 │ │
│ │ - 通话记录 │ │
│ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────────┘
5.2 服务器配置
5.2.1 系统参数优化
bash
# /etc/sysctl.conf
# 文件描述符限制
fs.file-max = 1000000
# TCP 连接优化
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 网络缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 应用配置
net.ipv4.ip_local_port_range = 1024 65535
5.2.2 应用配置
json
{
"server": {
"name": "tcp 服务器",
"port": 3480,
"max_connections": 1000000,
"worker_pool_size": 100
},
"client": {
"heartbeat_interval_seconds": 90,
"inactive_timeout_seconds": 300
},
"stun": {
"name": "stun服务器",
"enabled": true,
"server": "47.106.189.19",
"port": 3478
},
"turn": {
"name": "turn服务器",
"enabled": true,
"server": "47.106.189.19",
"port": 3479,
"username": "videocall",
"password": "turn123456"
}
}
5.3 部署步骤
5.3.1 服务端部署
bash
# 1. 编译服务端
cd server
go build -o server main.go
# 2. 上传到服务器
scp server config.json user@server:~/videocall/
# 3. 启动服务
pm2 start server --name videocall-server
# 4. 查看状态
pm2 status
pm2 logs videocall-server
# 5. 设置开机自启
pm2 startup
pm2 save
5.3.2 STUN/TURN 部署
bash
# 1. 安装 coturn
sudo apt install coturn
# 2. 配置 /etc/turnserver.conf
listening-port=3478
tls-listening-port=5349
relay-ip=47.106.189.19
external-ip=47.106.189.19
realm=videocall.itgcs.tech
user=videocall:turn123456
lt-cred-mech
min-port=49152
max-port=65535
# 3. 启动服务
sudo systemctl start coturn
sudo systemctl enable coturn
5.3.3 Android 客户端打包
bash
# 1. 编译 APK
cd android_client
./gradlew assembleRelease
# 2. APK 位置
# app/build/outputs/apk/release/app-release.apk
# 3. 签名验证
jarsigner -verify app-release.apk
6. 性能指标
6.1 服务器性能
| 指标 | 数值 | 说明 |
|---|---|---|
| 最大并发连接 | 1,000,000 | 可配置 |
| 消息处理延迟 | < 10ms | Worker Pool 模式 |
| 心跳间隔 | 90 秒 | 可配置 |
| 连接超时 | 300 秒 | 无活动断开 |
| 内存占用 | ~50MB | 空载状态 |
6.2 客户端性能
| 指标 | 数值 | 说明 |
|---|---|---|
| 视频分辨率 | 640x480 | 默认 |
| 帧率 | 30 fps | 可配置 |
| 音频编码 | Opus | WebRTC 默认 |
| 视频编码 | VP8/H.264 | WebRTC 默认 |
| 首帧时间 | < 2s | 正常网络 |
7. 安全措施
7.1 传输安全
- HTTPS: 所有 HTTP 请求使用 HTTPS 加密
- WSS: WebSocket 使用安全连接
- TURN 认证: TURN 服务器使用用户名密码认证
7.2 数据安全
- 密码加密: 用户密码使用 bcrypt 加密存储
- SQL 注入防护: 使用参数化查询
- XSS 防护: 输入输出转义
7.3 访问控制
- 防火墙: 只开放必要端口
- 限流: 防止 DDoS 攻击
- 日志审计: 记录关键操作
8. 监控与运维
8.1 健康检查
GET /health
Response: {"status": "ok", "connections": 1234, "uptime": 86400}
8.2 日志管理
bash
# 查看服务日志
pm2 logs videocall-server
# 查看系统日志
tail -f /var/log/videocall/server.log
# 日志轮转配置
/var/log/videocall/*.log {
daily
rotate 30
compress
missingok
notifempty
}
8.3 监控指标
- CPU 使用率
- 内存使用率
- 网络流量
- 连接数
- 消息处理量
- 错误率
9. 故障排查
9.1 常见问题
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 无法连接服务器 | 防火墙/端口问题 | 检查防火墙规则 |
| 视频无法显示 | WebRTC 初始化失败 | 检查权限和编解码器 |
| 频繁断线 | 心跳超时 | 检查网络稳定性 |
| 单向音频 | ICE 协商失败 | 检查 NAT 配置 |
9.2 调试命令
bash
# 检查端口占用
netstat -tlnp | grep 3480
# 检查进程状态
ps aux | grep server
# 检查连接数
ss -s
# 测试端口连通性
telnet videocall.itgcs.tech 3480