UCC Remote
工业级 P2P 远程桌面 — 完整项目技术文档
Qt 5.15.2MinGW64qmakeWindows
1. 项目基础信息
1.1 项目名称
UCC Remote(可执行文件:UCCRemote.exe)
1.2 项目简介
UCC Remote 是一款面向工业/企业场景的 点对点(P2P)远程桌面 软件,采用 TeamViewer / ToDesk 风格的 统一客户端 设计:同一安装包既可作为被控端(Host),也可作为控制端(Viewer),运行时通过界面开关切换,无需分别安装两个程序。
项目基于 Qt 5.15.2 + MinGW 8.1 64-bit 构建,使用 qmake 工程管理,支持中文界面(uccremote_zh_CN.qm),具备屏幕共享、远程键鼠控制、剪贴板同步、断点续传文件传输等企业级远程协作能力。
1.3 核心功能
🖥 远程桌面
DXGI Desktop Duplication 屏幕采集,H.264(x264/NVENC)编码,OpenGL / D3D11 硬件解码渲染,支持多显示器切换。
🔗 P2P 连接
KCP → UDT → UCC Relay → coturn 四级连接级联,STUN 打洞,TLS 信令,AES-256-HMAC 媒体加密。
📋 剪贴板同步
双向文本剪贴板实时同步(ClipboardSync),可在设置中开关。
📁 文件传输
48KB 分块流式传输,逐块 ACK 确认,SHA-256 完整性校验,支持断点续传(FileResume)。
🔐 安全认证
设备码 + 临时密码,X25519 ECDH 会话密钥协商,HMAC-SHA256 认证标签,TLS 信令通道。
⚡ 自适应 QoS
RTT/抖动/丢包率反馈,动态调整码率、帧率、缩放比例;NACK 重传 + XOR/RS-FEC 前向纠错。
1.4 解决的核心问题
- 复杂 NAT 穿透:通过 STUN 打洞、KCP/UDT 双协议、自建 UDP/WebSocket 中继及可选 coturn TURN,覆盖 LAN/WAN 多种网络环境。
- 低延迟高画质:GPU 零拷贝 DXGI→NVENC 管线、脏矩形增量传输、双通道 KCP(控制/视频分离)、解码线程 offload。
- 部署简便:单文件夹部署,LAN 信标自动发现信令服务器,无需每台机器单独配置 IP。
- 工业稳定性:信令心跳重连、会话自动重连、DXGI 访问丢失恢复、传输层 rehome、单实例锁。
- 安全合规:端到端 AES 加密、ECDH 密钥交换、入站连接审批/无人值守模式、跨账户 CONNECT 拒绝。
2. 环境与安装
2.1 依赖环境要求
| 组件 | 版本/要求 | 说明 |
|---|---|---|
| 操作系统 | Windows 7 SP1+(推荐 Win10/11) | 主要目标平台,需 DXGI/D3D11 支持 |
| Qt | 5.15.2 mingw81_64 | 模块:Core, Gui, Widgets, Network, OpenGL, WebSockets |
| 编译器 | MinGW 8.1.0 64-bit | 路径:C:\Qt\Tools\mingw810_64 |
| 构建工具 | qmake + mingw32-make | C++17 标准 |
| Python | 3.x | 翻译填充脚本 fill_zh_cn_translations.py |
| OpenSSL | 3.x(静态/动态) | third_party/openssl-mingw64,TLS 信令 |
| FFmpeg | 静态库(可选但推荐) | third_party/ffmpeg-static,H.264 编解码 |
| libyuv | 静态库 | third_party/libyuv-static,YUV 色彩转换 |
| libudt | 可选 | third_party/libudt,UDT 传输备选 |
| GPU | NVIDIA(可选) | NVENC 硬件编码,无则回退 x264 软编 |
2.2 本地编译步骤
方式一:一键构建(推荐)
cd d:\UCC_QT\UCCRemote
scripts\build_and_deploy.bat [输出目录]
# 默认输出:C:\uccremote_out
# 自定义输出:scripts\build_and_deploy.bat C:\newout
该脚本自动完成:libyuv 静态编译 → FFmpeg 检测 → 翻译更新(lupdate/lrelease)→ UCCRemote Release 编译 → UCCSignaling/UCCRelay/UCCWsRelay 编译 → TLS 证书生成 → windeployqt 打包 → 部署脚本复制。
方式二:Qt Creator 手动构建
# 1. 打开 UCCRemote.pro
# 2. 配置 Kit:Desktop Qt 5.15.2 MinGW 64-bit
# 3. Release 模式构建
# 4. Release 构建会自动复制 exe 到 C:/newout(需先运行过一次 build_and_deploy.bat)
cd build
qmake ..\UCCRemote.pro -spec win32-g++ "CONFIG+=release" ^
"FFMPEG_DIR=..\third_party\ffmpeg-static" ^
"OPENSSL_DIR=..\third_party\openssl-mingw64"
mingw32-make -j4
可选:单独构建第三方库
scripts\build_libyuv_static.bat # libyuv 静态库
scripts\build_ffmpeg_static.bat # FFmpeg 静态库(H.264)
scripts\build_libudt_mingw.bat # libudt(UDT 传输)
scripts\build_all.bat # 全部构建
scripts\gen_certs.bat # 生成 TLS 证书
2.3 部署/安装步骤
步骤 1 — 在局域网内 一台 PC 上启动信令服务:
cd C:\newout && start_signaling.bat(保持窗口打开)步骤 2 — 在 所有 PC 上双击
UCCRemote.exe客户端自动通过 LAN 信标或 127.0.0.1 发现信令服务器。
部署目录结构
C:\newout\
├── UCCRemote.exe # 统一客户端
├── start_signaling.bat # 信令+中继启动脚本
├── Qt5*.dll # Qt 运行时
├── libcrypto-3-x64.dll # OpenSSL
├── libssl-3-x64.dll
├── libgcc_s_seh-1.dll # MinGW 运行时
├── libstdc++-6.dll
├── libwinpthread-1.dll
├── certs\ # TLS 证书
│ ├── ca.crt
│ ├── signaling.crt
│ └── signaling.key
├── translations\
│ └── uccremote_zh_CN.qm # 中文界面
├── server\
│ ├── UCCSignaling.exe # 信令服务器 (21080/TCP)
│ ├── UCCRelay.exe # UDP 中继 (21081/UDP)
│ ├── UCCWsRelay.exe # WebSocket 中继 (21082)
│ └── certs\
└── *.ps1 # LAN 发现/信标脚本
同机测试
start_signaling.bat
UCCRemote.exe
2.4 TLS 证书配置
开发/测试环境由 scripts\gen_certs.bat 自动生成自签名证书到 certs/ 目录。生产环境应替换为正式 CA 签发的证书:
certs/ca.crt— CA 根证书(客户端信任)certs/signaling.crt+signaling.key— 信令服务器证书
客户端启动时调用 TlsConfig::ensureDefaultCerts() 确保证书可用。
3. 使用指南
3.1 快速开始
- 在一台 PC 运行
start_signaling.bat启动信令与中继服务。 - 被控 PC:启动
UCCRemote.exe→ 勾选 「允许远程控制」 → 记录设备码和临时密码。 - 控制 PC:启动
UCCRemote.exe→ 输入对方设备码和密码 → 点击 「连接」。 - 连接成功后自动打开远程桌面窗口,可进行键鼠操作、文件传输、剪贴板同步。
3.2 被控端(Host)操作
| 操作 | 说明 |
|---|---|
| 允许远程控制 | 主界面开关,开启后注册到信令服务器并等待入站连接 |
| 设备码 | 9 位数字 ID(如 988 008 226),唯一标识本机 |
| 临时密码 | 会话密码,可手动刷新;正确密码可自动接受连接 |
| 二维码 | 生成含 uccremote:// URI 的 QR 码供控制端扫描 |
| 无人值守 | 设置中开启后,密码正确时跳过手动审批 |
| 入站审批 | 密码错误时弹出倒计时审批对话框(默认 30 秒超时拒绝) |
| 系统托盘 | 关闭窗口可最小化到托盘(可配置),入站请求时气泡通知+声音提醒 |
| Host 控制栏 | 会话期间显示断开按钮,被控端可随时终止远程连接 |
3.3 控制端(Viewer)操作
| 操作 | 说明 |
|---|---|
| 远程连接 | 输入设备码 + 密码,通过信令服务器查找对端并建立 P2P |
| 直连连接 | 输入 IP:端口 直接 TCP/KCP 连接(绕过信令) |
| 粘贴连接 URI | 支持 uccremote://设备码?pwd=密码 格式 |
| 远程桌面窗口 | 工具栏:断开、全屏(Esc 退出)、显示器切换、会话统计 |
| 发送文件 | 选择本地文件发送到被控端 |
| 剪贴板同步 | 勾选后双向同步文本剪贴板 |
| 聊天 | 会话内文本消息 |
| 自动重连 | 意外断开后自动尝试重连(TeamViewer 风格) |
3.4 设置页面说明
| 设置项 | 配置键 | 说明 |
|---|---|---|
| 信令地址 | signaling/endpoint | 信令服务器 host:port,默认自动发现 |
| TLS | signaling/tls | 信令通道是否启用 TLS |
| WebSocket 模式 | signaling/websocket | 使用 WS/WSS 信令及 WS 中继回退 |
| 仅 P2P | connection/p2p_only | 优先直连,禁用中继回退 |
| 双通道 KCP | connection/dual_channel_kcp | 控制/视频分离 conv(默认开启) |
| 视频 FEC | connection/video_fec | XOR 前向纠错(WAN 有效) |
| RS-FEC | connection/video_fec_rs | Reed-Solomon RS(4,2) 纠错 |
| 采集显示器 | capture/monitor_index | 多显示器选择 |
| 画质预设 | video/quality_preset | Auto/Speed/Balanced/Quality |
| 场景配置 | profile/scenario | 最佳画质/办公 WAN/均衡/低带宽/移动慢网 |
| GPU 编码 | video/gpu_encode | NVENC 硬件编码 |
| 硬件解码 | video/hardware_decode | D3D11VA H.264 解码 |
| OpenGL 渲染 | remote/use_opengl | 远程桌面 OpenGL 渲染(默认开启) |
| 语言 | ui/language | en / zh_CN |
| 开机自启 | general/auto_start | Windows 登录自启动 |
| 入站审批超时 | incoming/approval_timeout_sec | 5–300 秒 |
| coturn | coturn/host,port,user,pass | 标准 TURN 服务器配置 |
配置存储于 INI 格式用户设置文件(AppRuntime::userSettings()),默认数据目录由 AppRuntime::defaultUnifiedDataDir() 决定,可通过 --datadir= 覆盖。
3.5 命令行参数
| 参数 | 说明 |
|---|---|
--datadir=<path> | 指定用户配置/数据目录 |
--connect-remote=<设备码:密码> | 无 GUI 自动连接远程 |
--signaling=<host:port> | 指定信令服务器 |
--ensure-firewall-rule | 安装 Windows 防火墙规则(需管理员) |
--verify-e2e | 端到端传输验证 |
--test-capture | 屏幕采集测试 |
--test-capture-stream | 采集流测试(支持 --monitor, --capture-fps 等) |
--test-host | 无 GUI Host 待机模式 |
--test-transmit | 本地传输验证 |
--test-transmit-h264 | H.264 传输验证 |
--test-transmit-dual | 双通道传输验证 |
--test-remote-display | 远程显示 GUI 测试 |
--test-direct-viewer | 直连 Viewer 测试 |
--role host|viewer | 旧版分离角色模式(已弃用,默认统一客户端) |
3.6 连接 URI 格式
uccremote://988008226?pwd=yhjm2mxx
解析器:ConnectionUriParser(src/core/connectionuri.cpp)。支持从剪贴板粘贴或 QR 码扫描导入。
4. 技术架构
4.1 整体架构图
┌─────────────────────────────────────────────────────────────────┐
│ UCCRemote.exe (统一客户端) │
├──────────────┬──────────────────────────────────────────────────┤
│ UI 层 │ MainWindow / RemoteWindow / SystemTray / Dialogs │
├──────────────┼──────────────────────────────────────────────────┤
│ 会话层 │ RemoteSession / SessionIoPump / VideoEncodeWorker │
│ │ VideoDecodeWorker / ClipboardSync / FileTransfer │
├──────────────┼──────────────────────────────────────────────────┤
│ 连接层 │ ConnectionManager / SignalingRegistrar / P2pConnector│
├──────────────┼──────────────────────────────────────────────────┤
│ 传输层 │ SecureChannel → KCP / TCP / UDT / Relay / WS-Relay│
│ │ DualChannelTransport / TcpDualChannelTransport │
├──────────────┼──────────────────────────────────────────────────┤
│ 媒体层 │ DXGI/GDI Capture → FFmpeg Encoder/Decoder │
│ │ D3D11 GPU Context / AdaptiveQoS / libyuv │
├──────────────┼──────────────────────────────────────────────────┤
│ 安全层 │ AES-256-HMAC / X25519 ECDH / SessionAuth / TLS │
└──────────────┴──────────────────────────────────────────────────┘
│
TLS 信令 (21080) / UDP 中继 (21081)
│
┌─────────────────────────────┴───────────────────────────────────┐
│ UCCSignaling.exe │ UCCRelay.exe │ UCCWsRelay.exe │ coturn │
└─────────────────────────────────────────────────────────────────┘
4.2 连接建立流程
- 信令注册:
SignalingRegistrar通过 TLS/WebSocket 连接信令服务器,发送 REGISTER + 15s 心跳 PING/PONG。 - 发起连接:控制端发送 CONNECT 命令,信令服务器返回
PeerInfo(含公网地址、路径类型)。 - 连接级联:
ConnectionManager按优先级尝试:- P2P KCP + STUN 打洞
- P2P UDT rendezvous
- UCC UDP Relay(21081,Token 配对)
- WebSocket Relay(21082)
- coturn TURN(3478/UDP,可选)
- 安全握手:
SecureChannelAES-256-HMAC 加密 →RemoteSessionHandshake/HandshakeAck(含 ECDH 公钥、会话认证标签)。 - 会话激活:双方 SessionReady → Host 开始 Desktop Duplication 采集 → Viewer 打开远程窗口。
4.3 代码目录结构
UCCRemote/
├── main.cpp # 程序入口(GUI + 测试模式分发)
├── mainwindow.cpp/h # 主窗口(三页导航:首页/设备/设置)
├── UCCRemote.pro # qmake 主工程文件
├── uccremote.qrc # Qt 资源(图标等)
├── translations/
│ └── uccremote_zh_CN.ts/qm # 中文翻译
├── certs/ # TLS 证书
├── images/ # 应用图标
├── docs/ # 文档
├── scripts/ # 构建/部署脚本
│ ├── build_and_deploy.bat
│ ├── gen_certs.bat
│ └── deploy/ # 部署辅助脚本
├── server/ # 服务端子工程
│ ├── UCCSignaling.pro # 信令服务器
│ ├── UCCRelay.pro # UDP 中继
│ ├── UCCWsRelay.pro # WebSocket 中继
│ └── signaling_server.cpp
├── third_party/ # 第三方库
│ ├── kcp/ # KCP 协议 (ikcp.c)
│ ├── qrcodegen/ # QR 码生成
│ ├── ffmpeg-static/ # FFmpeg 静态库
│ ├── libyuv-static/ # libyuv 静态库
│ ├── openssl-mingw64/ # OpenSSL
│ └── libudt/ # UDT 库(可选)
└── src/ # 核心源码
├── core/ # 核心配置与协议
├── crypto/ # 加密模块
├── net/ # 网络基础(TLS, FEC)
├── p2p/ # P2P 连接器
├── signaling/ # 信令客户端
├── transport/ # 传输层抽象
├── relay/ # 中继协议
├── turn/ # coturn 客户端
├── capture/ # 屏幕采集
├── codec/ # 音视频编解码
├── session/ # 远程会话
├── input/ # 输入注入
├── clipboard/ # 剪贴板同步
├── file/ # 文件传输
├── ui/ # UI 组件
├── util/ # 工具类
└── tools/ # 测试/验证工具
4.4 核心模块说明
core/ — 核心基础设施
| 文件 | 职责 |
|---|---|
protocol.h/cpp | UCC1 二进制协议:消息类型定义、打包/解包(Handshake, VideoFrame, QoS, File 等 28 种消息) |
appconfig.h/cpp | 全局配置读写(QSettings),画质/连接/信令/coturn 等 50+ 配置项 |
appruntime.h/cpp | 运行时初始化:统一客户端模式、数据目录、单实例键、命令行参数解析 |
connectionmanager.h/cpp | 连接编排:信令查找 → P2P 级联 → SecureChannel 包装 → RemoteSession 创建 |
deviceid.h/cpp | 9 位设备 ID 生成/验证/格式化 |
sessionpassword.h/cpp | 临时会话密码生成与管理 |
connectionuri.h/cpp | uccremote:// URI 解析 |
adaptiveqos.h/cpp | 自适应 QoS:带宽/丢包/RTT 反馈 → 码率/帧率/缩放建议 |
profilepreset.h/cpp | 5 种场景预设(最佳画质/办公 WAN/均衡/低带宽/移动慢网) |
signalingbootstrap.h/cpp | 统一客户端信令自举(LAN 发现/默认端点) |
accountsession.h/cpp | 账户登录/Token 管理/绑定设备列表 |
settingsmigrate.h/cpp | 旧版设置迁移 |
videostreamconfig.h/cpp | 视频流参数计算(分辨率/码率/FPS 表) |
signaling/ — 信令子系统
| 文件 | 职责 |
|---|---|
signalingprotocol.h/cpp | 文本行协议:Register/Login/Connect/PeerInfo/Punch/RelayInfo/Ping/Pong 等命令 |
signalingregistrar.h/cpp | 持久信令连接:注册、心跳(15s PING)、自动重连(指数退避)、入站 CONNECT 通知 |
signalinglink.h/cpp | 底层 TLS TCP / WebSocket 连接封装 |
signalinglinebuffer.h/cpp | 行缓冲解析器 |
signalingclient.h/cpp | 一次性信令客户端(CONNECT 请求) |
transport/ — 传输层
| 文件 | 职责 |
|---|---|
itransport.h | 传输抽象接口:write() / takeReceived() / isOpen() |
securechannel.h/cpp | AES-256-HMAC 加密包装,支持控制/视频双通道加密 |
kcptransport.h/cpp | KCP over UDP(基于 ikcp.c),低延迟可靠传输 |
tcptransport.h/cpp | TCP 流传输 |
udttransport.h/cpp | UDT 传输(libudt,可选编译) |
relaytransport.h/cpp | UCC UDP 中继客户端 |
wsrelaytransport.h/cpp | WebSocket 中继客户端 |
websockettransport.h/cpp | WebSocket 通用传输 |
dualchanneltransport.h/cpp | 双 KCP conv 复用(控制 conv + 视频 conv ^ 0x56CC56CC) |
tcpdualchanneltransport.h/cpp | TCP 双通道复用(控制/视频帧类型前缀) |
transportrehome.h/cpp | 传输层热迁移(不断会话切换底层 socket) |
p2p/ — P2P 连接
| 文件 | 职责 |
|---|---|
p2pconnector.h/cpp | 核心 P2P 连接器:STUN 发现、UDP 打洞、TCP/KCP 连接、被动监听 |
stunclient.h/cpp | STUN 客户端(默认 stun.l.google.com:19302) |
p2putil.h/cpp | P2P 工具函数(探针握手、地址解析) |
capture/ — 屏幕采集
| 文件 | 职责 |
|---|---|
capturefactory.h/cpp | 采集后端工厂:自动选择 DXGI / GDI |
dxgicapture.h/cpp | DXGI Desktop Duplication(主采集方式,支持脏矩形) |
gdicapture.h/cpp | GDI BitBlt 采集(回退/测试) |
capturescheduler.h/cpp | 采集帧率调度器 |
monitorinfo.h/cpp | 多显示器枚举 |
captureexclude_win.h/cpp | 排除本应用窗口避免反馈环 |
dxgicursor.h/cpp | DXGI 光标叠加 |
codec/ — 编解码
| 文件 | 职责 |
|---|---|
ffmpegencoder.h/cpp | H.264 编码(x264 软编 / NVENC 硬编),低延迟参数(bframes=0, rc-lookahead=0) |
ffmpegdecoder.h/cpp | H.264 解码(软解 / D3D11VA 硬解) |
d3d11gpucontext.h/cpp | D3D11 GPU 上下文:BGRA→NV12 零拷贝转换 |
session/ — 远程会话
| 文件 | 职责 |
|---|---|
remotesession.h/cpp | 核心会话引擎:握手、桌面共享、视频帧收发、QoS、FEC/NACK、输入/聊天/文件 |
sessioniopump.h/cpp | IO 泵:独立线程处理入站/出站队列,优先级调度(输入 > 控制 > 视频) |
videoencodeworker.h/cpp | 编码工作线程(Host 端 offload) |
videodecodeworker.h/cpp | 解码工作线程(Viewer 端 offload,队列深度 2 丢弃旧帧) |
ui/ — 用户界面
| 文件 | 职责 |
|---|---|
mainwindow.cpp/h | 主窗口:三页导航、连接管理、设置、会话生命周期 |
remotewindow.h/cpp | 远程桌面窗口:帧渲染、输入捕获、工具栏 |
remotedesktopglwidget.h/cpp | OpenGL 远程桌面渲染(默认) |
remotedesktopd3d11widget.h/cpp | D3D11 远程桌面渲染(硬解路径) |
hostcontrolbar.h/cpp | 被控端会话控制栏 |
incomingconnectdialog.h/cpp | 入站连接审批对话框 |
deviceqrdialog.h/cpp | 设备 QR 码对话框 |
logindialog.h/cpp | 账户登录对话框 |
systemtray.h/cpp | 系统托盘图标与菜单 |
其他模块
| 目录 | 职责 |
|---|---|
crypto/ | AES-256-HMAC 加解密、X25519 ECDH 密钥交换、HMAC-SHA256 会话认证 |
net/ | TLS 配置、GF(256) 运算、Reed-Solomon FEC、WebSocket 端点 |
relay/ | UDP 中继协议(Token 配对、数据转发) |
turn/ | coturn TURN 客户端(RFC 5766) |
input/ | Windows 输入注入(SendInput:鼠标/键盘/滚轮) |
clipboard/ | 剪贴板双向同步 |
file/ | 文件传输(48KB 分块、滑动窗口 8、断点续传、SHA-256 校验) |
util/ | 单实例锁、开机自启、防火墙规则、语言管理、提示音 |
tools/ | E2E 验证、远程显示测试、采集测试 |
4.5 通信协议
应用层协议(UCC1 帧格式)
所有会话消息使用 packMessage(MessageType, payload) 封装,前缀魔数 UCC1,支持 28 种消息类型:
| 类型 | 值 | 方向 | 说明 |
|---|---|---|---|
| Handshake | 1 | 双向 | 会话握手(屏幕尺寸、DPI、ECDH 公钥、显示器列表) |
| HandshakeAck | 2 | 双向 | 握手确认 + sessionAuthTag |
| StartDesktop / StopDesktop | 3/4 | Viewer→Host | 开始/停止桌面共享 |
| VideoFrame | 5 | Host→Viewer | H.264 全帧 / JPEG 或 H.264 增量 tile |
| QoSFeedback | 6 | Viewer→Host | RTT/抖动/丢包/建议码率 |
| InputMouse / InputKey | 7/8 | Viewer→Host | 远程键鼠输入 |
| Chat | 9 | 双向 | 文本聊天 |
| Ping / Pong | 10/11 | 双向 | 会话保活 |
| Clipboard | 13 | 双向 | 剪贴板数据 |
| FileOffer/Chunk/Ack/Complete/Reject/Resume | 14–19 | 双向 | 文件传输协议 |
| RequestKeyframe | 20 | Viewer→Host | 请求 IDR 关键帧 |
| NackFrames | 21 | Viewer→Host | 丢帧 NACK(Host 缓存最近 90 帧重传) |
| VideoFec | 22 | Host→Viewer | XOR/RS 前向纠错 |
| SelectMonitor | 23 | Viewer→Host | 远程切换显示器 |
| SessionReady | 24 | 双向 | 会话就绪信号 |
| CursorUpdate | 28 | Host→Viewer | 独立光标层(位置+PNG 形状) |
信令协议(文本行)
格式:COMMAND arg1 arg2 ...\n,主要命令:
REGISTER <deviceId> <role> <deviceName>
LOGIN <username> <password>
CONNECT <peerDeviceId> <mode> [<sessionPassword>]
PEER_INFO <deviceId> <publicHost> <publicPort> <udpPort> <path> ...
PUNCH <peerHost> <peerPort>
RELAY_INFO <relayHost> <relayPort> <token>
PING / PONG
4.6 传输层级联策略
| 优先级 | 路径 | 协议 | 适用场景 |
|---|---|---|---|
| 1 | P2P KCP | UDP + KCP + STUN | 大多数 NAT 环境,低延迟 |
| 2 | P2P UDT | UDP + UDT | KCP 失败时的备选 |
| 3 | P2P TCP | TCP 打洞 | LAN / 友好 NAT |
| 4 | UCC Relay | UDP 21081 | 对称 NAT / 打洞失败 |
| 5 | WS Relay | WebSocket 21082 | 企业防火墙/代理环境 |
| 6 | coturn | TURN 3478/UDP | 标准 TURN 回退 |
4.7 服务端组件
| 二进制 | 端口 | 工程 | 职责 |
|---|---|---|---|
| UCCSignaling.exe | 21080/TCP (TLS) | server/UCCSignaling.pro | 设备注册、在线状态、CONNECT 路由、Relay 分配、120s 空闲断开 |
| UCCRelay.exe | 21081/UDP | server/UCCRelay.pro | Token 配对 UDP 中继(TURN-like) |
| UCCWsRelay.exe | 21082/TCP | server/UCCWsRelay.pro | WebSocket 中继(企业网络回退) |
| coturn (可选) | 3478/UDP | 外部 | 标准 RFC 5766 TURN 服务器 |
4.8 安全机制
- 信令 TLS:SignalingLink 使用 OpenSSL TLS 1.2+ 加密信令通道
- 媒体 AES-256-HMAC:SecureChannel 对所有会话数据 AES-256-CBC + HMAC-SHA256 认证
- ECDH 密钥交换:X25519 + HKDF 派生会话密钥,替代共享密码(SessionKeyExchange)
- 会话认证:HMAC-SHA256 sessionAuthTag 防止中间人(SessionAuth)
- 设备码 + 密码:9 位设备 ID + 临时会话密码双重验证
- 入站审批:密码不匹配时需人工确认,超时自动拒绝
- 跨账户保护:无会话密码时跨账户 CONNECT 被拒绝
- 单实例:SingleInstance 防止同一角色多开
- 防火墙:--ensure-firewall-rule 自动添加 Windows 防火墙入站规则
5. 附录
5.1 端口一览
| 端口 | 协议 | 服务 | 方向 |
|---|---|---|---|
| 21080 | TCP (TLS) | UCCSignaling | 客户端 → 信令服务器 |
| 21081 | UDP | UCCRelay | 客户端 ↔ 中继 |
| 21082 | TCP (WS) | UCCWsRelay | 客户端 ↔ WS 中继 |
| 3478 | UDP | coturn (可选) | 客户端 ↔ TURN |
| 19302 | UDP | Google STUN | 客户端 → STUN(NAT 探测) |
| 动态 | UDP/TCP | UCCRemote P2P | 客户端 ↔ 客户端(打洞后) |
5.2 第三方依赖
| 库 | 用途 | 位置 | 编译宏 |
|---|---|---|---|
| Qt 5.15.2 | GUI/网络/事件循环 | 系统安装 | — |
| OpenSSL 3.x | TLS + ECDH + HMAC | third_party/openssl-mingw64 | UCC_USE_OPENSSL |
| FFmpeg | H.264 编解码 | third_party/ffmpeg-static | UCC_USE_FFMPEG, UCC_FFMPEG_STATIC |
| libyuv | YUV/RGB 转换 | third_party/libyuv-static | UCC_USE_LIBYUV |
| KCP (ikcp) | 可靠 UDP 传输 | third_party/kcp | 内置 |
| libudt | UDT 传输 | third_party/libudt | UCC_USE_LIBUDT |
| qrcodegen | QR 码生成 | third_party/qrcodegen | 内置 |
| x264 | H.264 软编码 | FFmpeg 静态链接 | — |
5.3 功能路线图(已实现)
| 阶段 | 功能 | 状态 |
|---|---|---|
| P0 | 出站优先级队列、解码工作线程、QoS 丢包反馈、DXGI 恢复 | ✅ 已实现 |
| P1 | 脏矩形增量、OpenGL 渲染、x264 低延迟、关键帧请求 | ✅ 已实现 |
| P2 | ECDH 会话密钥、双 KCP 通道、XOR/RS FEC、NACK 重传、多显示器、DPI 映射 | ✅ 已实现 |
| P3 | E2E 验证脚本、NVENC 探测、文件 E2E、信令日志、自动重连 | ✅ 已实现 |
5.4 生产部署检查清单
- 修改默认密码(
AppConfig::defaultPassphrase()) - 替换
certs/为正式 CA 证书 - 在 VPS 部署 UCCSignaling + UCCRelay
- 开放 TCP 21080、UDP 21081、UDP 3478(如用 coturn)
- 被控端安装 NVENC 版 FFmpeg 以启用硬件编码
- 运行 E2E 验证:
verify_e2e_p2p.bat
5.5 线程模型
- GUI 线程:MainWindow、RemoteWindow、设置 UI、帧显示
- Net 线程:P2pConnector、ConnectionManager、SignalingRegistrar、传输 IO
- Connect 线程:出站连接建立(避免阻塞 GUI)
- Session IO 线程:SessionIoPump 入站/出站队列处理
- Capture 线程:Host 端屏幕采集循环
- Cursor 线程:Host 端光标更新
- Encode 线程:VideoEncodeWorker H.264 编码
- Decode 线程:VideoDecodeWorker H.264 解码
5.6 相关文档
docs/INDUSTRIAL.md— 工业部署详细说明docs/REFERENCE_ANALYSIS.md— 参考项目分析docs/coturn.example.conf— coturn 配置示例scripts/deploy/README.txt— 部署快速指南README.md— 项目简要说明