TUIC
TUIC(Tiny UDP Internet Connections)是一种基于 QUIC 协议的代理协议,于 2022 年 3 月由开发者 @EAimTY 发布。它与 Hysteria 2 同属"QUIC 系"代理协议,但在设计哲学上有所不同:TUIC 更注重协议的标准化和对网络资源的公平使用,而不是像 Hysteria 2 那样采用激进的带宽占用策略。
背景与版本
TUIC 目前有两个主要版本:
| 版本 | 状态 | 说明 |
|---|---|---|
| TUIC v3 | 已废弃 | 最初版本,存在协议设计缺陷,已不建议使用 |
| TUIC v5 | 当前推荐 | 完全重写,修复了 v3 的安全问题,协议设计更加成熟 |
关于旧版本
如果你在使用 TUIC v3 或服务端/客户端未明确标注版本,请尽快迁移到 TUIC v5。v3 存在已知的安全漏洞,社区已停止维护。
核心特性
基于标准 QUIC
与 Hysteria 2 类似,TUIC v5 构建在标准 QUIC 协议之上,流量从外观上看与 HTTP/3 流量高度相似。TUIC 不对底层 QUIC 数据包进行额外的混淆,而是直接利用 QUIC 本身的加密(TLS 1.3)和多路复用能力。
这意味着 TUIC 的流量特征与正常的 QUIC/HTTP/3 应用(如 YouTube、Google 服务)流量在统计特征上十分接近,具备一定的天然隐蔽性。
0-RTT 连接复用
TUIC 利用 QUIC 的 0-RTT 特性,在已建立连接的基础上可以实现零往返时间的请求复用:
第一次连接:
客户端 --[完整握手]--> 服务端(1-RTT)
后续连接复用:
客户端 --[0-RTT 恢复]--> 服务端(0-RTT,几乎无握手延迟)
这对于需要频繁建立新连接的浏览场景(如打开大量网页标签)尤为有利,能够显著减少连接建立的延迟开销。
UDP over QUIC 原生支持
TUIC 原生支持 UDP 流量的透明转发,这是许多 TCP 代理协议不具备的能力。UDP 数据通过 QUIC 的 Datagram 特性传输,可以用于游戏加速、DNS 查询等 UDP 场景。
标准拥塞控制
与 Hysteria 2 的 Brutal 算法不同,TUIC 使用标准的 QUIC 拥塞控制算法(如 BBR 或 CUBIC)。这意味着:
- TUIC 会主动避开网络拥塞,不会强行占用带宽
- 在高丢包线路上,TUIC 的表现不如 Hysteria 2 激进
- 对其他网络用户更加"友好",不会因为抢占带宽而触发异常告警
- 在网络条件较好的线路上,与 Hysteria 2 的性能差距不大
UUID + 密码双重认证
TUIC v5 使用 UUID 和密码的组合进行身份认证,这与 VMess/VLESS 的认证方式类似,但运行在 QUIC 层之上。
工作原理
连接建立流程
客户端
|
| 1. 向服务端发起 QUIC 握手(UDP,含 TLS 1.3)
| 2. 在 QUIC 连接上发送 TUIC 认证信息(UUID + 密码)
| 3. 认证成功后,通过 QUIC Stream 发送代理请求
v
服务端
|
| 4. 验证 UUID 和密码
| 5. 解析代理目标地址
| 6. 建立到目标的连接
v
目标服务器
多路复用架构
TUIC 在单个 QUIC 连接上通过多条独立的 Stream 并发处理多个代理请求:
QUIC 连接(单一 UDP 连接)
├── Stream 1 → 请求 A(Google)
├── Stream 2 → 请求 B(GitHub)
├── Stream 3 → 请求 C(YouTube)
└── Datagram → UDP 请求 D(DNS)
每条 Stream 的丢包和重传相互独立,不会产生 TCP 时代的"队头阻塞"问题。
与 Hysteria 2 的详细对比
TUIC 和 Hysteria 2 是目前 QUIC 系协议中最主要的两个选择,经常被放在一起比较:
| 对比维度 | TUIC v5 | Hysteria 2 |
|---|---|---|
| 拥塞控制 | 标准(BBR/CUBIC) | Brutal(激进主动) |
| 高丢包性能 | 较强 | 极强 |
| 带宽占用行为 | 自适应,友好 | 主动占用,可能触发告警 |
| 0-RTT 支持 | 是 | 是 |
| UDP 代理 | 原生支持 | 原生支持 |
| 端口跳跃 | 不支持 | 支持 |
| 流量伪装 | 标准 QUIC/TLS 1.3 | HTTP/3 + 可选混淆 |
| 需要域名 | 是 | 是 |
| 需要证书 | 是 | 是 |
| 配置复杂度 | 低 | 低 |
| 客户端支持 | 较广 | 更广 |
| 主动维护状态 | 活跃 | 活跃 |
总结:
- 如果你的线路丢包率较高(>3%),或者需要端口跳跃功能,优先选择 Hysteria 2
- 如果你的线路条件尚可,或者担心 Brutal 算法被机场/运营商检测,TUIC 是更保守但仍然出色的选择
- 两者并不互斥,可以同时部署,根据网络状况切换
与 TCP 协议的对比
| 对比维度 | TUIC v5 | VLESS + Reality |
|---|---|---|
| 传输层 | QUIC(UDP) | TCP |
| 需要域名 | 是 | 否 |
| 高丢包性能 | 优秀 | 一般 |
| UDP 封锁风险 | 有 | 无 |
| 抗 TLS 指纹检测 | 较强(标准 QUIC) | 极强(Reality) |
| 配置复杂度 | 低 | 中 |
优缺点
| 优点 | 缺点 |
|---|---|
| QUIC 传输,在高延迟/高丢包线路上表现好 | 依赖 UDP,在 UDP 封锁的网络中不可用 |
| 0-RTT 连接复用,多请求场景延迟低 | 需要域名和有效的 TLS 证书 |
| 标准拥塞控制,对线路友好,不易触发异常告警 | 在高丢包场景下不如 Hysteria 2 的 Brutal 激进 |
| 原生 UDP 代理支持 | 不支持端口跳跃 |
| 配置简单,单一配置文件 | 客户端支持不如 Shadowsocks 广泛 |
| TLS 1.3 内置加密,安全性好 | — |
| 多路复用,无队头阻塞 | — |
适用场景
推荐使用 TUIC 的场景:
- 线路丢包率在 1–5% 之间,希望比 TCP 方案更稳定
- 移动网络(4G/5G),QUIC 的连接迁移特性在网络切换时表现优秀
- 不希望 Brutal 算法占用过多带宽,对线路流量有要求
- 需要 UDP 流量透明转发(如 DNS-over-QUIC、游戏 UDP)
- 作为 VLESS + Reality 的补充,提供 UDP 场景下的更好体验
不推荐单独依赖 TUIC 的场景:
- 企业/校园网络可能封锁 UDP 出站流量
- 线路丢包率极高(>10%),此时 Brutal 算法的 Hysteria 2 可能更合适
- 需要在服务器无域名的情况下部署(考虑 VLESS + Reality)
服务端部署参考
前置条件
- 一台公网 VPS,已开放 UDP 443 端口(或其他目标端口)
- 一个指向服务器 IP 的域名
- 有效的 TLS 证书
安装 TUIC 服务端
从 GitHub Releases 下载预编译二进制文件:
# 查看最新版本,替换下面的版本号
wget https://github.com/EAimTY/tuic/releases/latest/download/tuic-server-1.x.x-x86_64-unknown-linux-musl
chmod +x tuic-server-*
mv tuic-server-* /usr/local/bin/tuic-server
申请 TLS 证书
# 使用 acme.sh 申请 Let's Encrypt 证书
curl https://get.acme.sh | sh
~/.acme.sh/acme.sh --issue -d your.domain.com --webroot /var/www/html
~/.acme.sh/acme.sh --install-cert -d your.domain.com \
--cert-file /etc/tuic/cert.crt \
--key-file /etc/tuic/private.key \
--reloadcmd "systemctl restart tuic-server"
生成 UUID
# Linux 系统工具
cat /proc/sys/kernel/random/uuid
# 或者使用 Python
python3 -c "import uuid; print(uuid.uuid4())"
服务端配置文件(/etc/tuic/config.json)
{
"server": "[::]:443",
"users": {
"your-uuid-here": "your-strong-password"
},
"certificate": "/etc/tuic/cert.crt",
"private_key": "/etc/tuic/private.key",
"congestion_control": "bbr",
"alpn": ["h3"],
"log_level": "warn"
}
配置字段说明:
| 字段 | 说明 |
|---|---|
server | 监听地址和端口,[::] 表示同时监听 IPv4 和 IPv6 |
users | 用户列表,键为 UUID,值为密码,支持多用户 |
certificate / private_key | TLS 证书和私钥路径 |
congestion_control | 拥塞控制算法,推荐 bbr,也可以选 cubic 或 new_reno |
alpn | QUIC 的 ALPN 标识,h3 表示 HTTP/3,用于流量伪装 |
多用户配置示例:
{
"server": "[::]:443",
"users": {
"uuid-for-user1": "password-for-user1",
"uuid-for-user2": "password-for-user2",
"uuid-for-user3": "password-for-user3"
},
"certificate": "/etc/tuic/cert.crt",
"private_key": "/etc/tuic/private.key",
"congestion_control": "bbr",
"alpn": ["h3"],
"log_level": "warn"
}
Systemd 服务单元
[Unit]
Description=TUIC Server
After=network.target
[Service]
Type=simple
User=nobody
ExecStart=/usr/local/bin/tuic-server -c /etc/tuic/config.json
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
启动服务
systemctl daemon-reload
systemctl enable tuic-server
systemctl start tuic-server
systemctl status tuic-server
# 查看日志
journalctl -u tuic-server -f
开放防火墙规则
# 开放 UDP 443 端口
ufw allow 443/udp
客户端配置参考
sing-box 客户端配置
{
"type": "tuic",
"tag": "tuic-node",
"server": "your.domain.com",
"server_port": 443,
"uuid": "your-uuid-here",
"password": "your-strong-password",
"congestion_control": "bbr",
"tls": {
"enabled": true,
"server_name": "your.domain.com",
"alpn": ["h3"]
}
}
Mihomo 客户端配置
proxies:
- name: "tuic-node"
type: tuic
server: your.domain.com
port: 443
uuid: your-uuid-here
password: your-strong-password
alpn:
- h3
congestion-controller: bbr
sni: your.domain.com
skip-cert-verify: false
关于 skip-cert-verify
不要将 skip-cert-verify 设置为 true。跳过证书验证会使 TLS 的安全保护形同虚设,中间人攻击将变得轻而易举。如果连接提示证书错误,应排查域名和证书的配置问题,而不是直接跳过验证。
客户端支持
| 平台 | 客户端 | 支持状态 |
|---|---|---|
| Windows / macOS / Linux | Mihomo | 支持 |
| Windows / macOS / Linux | sing-box / v2rayN | 支持 |
| iOS | Shadowrocket | 支持 |
| iOS | Stash | 支持 |
| iOS | Loon | 支持(需较新版本) |
| iOS | Surge | 支持 |
| iOS | Quantumult X | 不支持 |
| Android | NekoBox | 支持 |
| Android | Husi | 支持 |
| Android | Exclave | 支持 |
| Linux | dae | 支持 |
| macOS | Stash | 支持 |
常见问题
Q:TUIC v5 和 v3 能互通吗?
不能。TUIC v3 和 v5 是完全不兼容的两个协议版本,客户端和服务端必须使用同一版本。目前应全面迁移到 v5。
Q:连接提示认证失败怎么排查?
依次检查以下几点:
- UUID 格式是否正确(标准的 8-4-4-4-12 格式)
- 密码是否与服务端配置一致
- 服务端配置文件中的 UUID 和密码键值对是否对应正确
- 服务端是否已重启使配置生效
Q:congestion_control 用 bbr 还是 cubic?
推荐使用 bbr。BBR 是 Google 开发的现代拥塞控制算法,在高延迟链路上的表现优于传统的 CUBIC 算法。不过在 Linux 内核中使用 BBR 需要系统支持(Linux 4.9+),通常现代 VPS 系统均已满足。
Q:TUIC 是否可以在没有域名的情况下使用自签名证书?
技术上可以,但需要在客户端关闭证书验证(skip-cert-verify: true)。这会降低安全性,不推荐在生产环境中使用。如果你没有域名,建议改用 VLESS + Reality 方案。
Q:TUIC 是否支持 UDP 全锥型 NAT 穿透?
TUIC 的 UDP 代理基于 QUIC Datagram,可以用于 UDP 流量转发,但对于需要完整 NAT 穿透(如 P2P 游戏)的场景,效果因具体应用而异。简单的 UDP 查询(如 DNS)是完全支持的。
延伸阅读
- Hysteria 2 协议 — 同为 QUIC 系协议,激进拥塞控制,高丢包线路首选
- VLESS 协议 — TCP 方向的首选现代协议,无需域名的 Reality 方案
- 代理协议总览 — 回到协议总览页面