跳到主要内容

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 v5Hysteria 2
拥塞控制标准(BBR/CUBIC)Brutal(激进主动)
高丢包性能较强极强
带宽占用行为自适应,友好主动占用,可能触发告警
0-RTT 支持
UDP 代理原生支持原生支持
端口跳跃不支持支持
流量伪装标准 QUIC/TLS 1.3HTTP/3 + 可选混淆
需要域名
需要证书
配置复杂度
客户端支持较广更广
主动维护状态活跃活跃

总结:

  • 如果你的线路丢包率较高(>3%),或者需要端口跳跃功能,优先选择 Hysteria 2
  • 如果你的线路条件尚可,或者担心 Brutal 算法被机场/运营商检测,TUIC 是更保守但仍然出色的选择
  • 两者并不互斥,可以同时部署,根据网络状况切换

与 TCP 协议的对比

对比维度TUIC v5VLESS + 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_keyTLS 证书和私钥路径
congestion_control拥塞控制算法,推荐 bbr,也可以选 cubicnew_reno
alpnQUIC 的 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 / LinuxMihomo支持
Windows / macOS / Linuxsing-box / v2rayN支持
iOSShadowrocket支持
iOSStash支持
iOSLoon支持(需较新版本)
iOSSurge支持
iOSQuantumult X不支持
AndroidNekoBox支持
AndroidHusi支持
AndroidExclave支持
Linuxdae支持
macOSStash支持

常见问题

Q:TUIC v5 和 v3 能互通吗?

不能。TUIC v3 和 v5 是完全不兼容的两个协议版本,客户端和服务端必须使用同一版本。目前应全面迁移到 v5。

Q:连接提示认证失败怎么排查?

依次检查以下几点:

  1. UUID 格式是否正确(标准的 8-4-4-4-12 格式)
  2. 密码是否与服务端配置一致
  3. 服务端配置文件中的 UUID 和密码键值对是否对应正确
  4. 服务端是否已重启使配置生效

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)是完全支持的。

延伸阅读