摘要
本文先介绍基于 TUIC 实现的双端代理敏捷部署方案,以 Ubuntu20.04 为例介绍服务端代理架设的步骤,再分别介绍在 Windows(V2RayN/NekoRay),Android(SagerNet/Matsuri) 以及 iOS(Shadowrocket) 启动客户端代理的方案。最后介绍 TUIC 协议的特性、适用场景以及与 Hysteria 协议的区别。
本文涉及的开源项目如下:
项目名 | 发行版本号 | 备注 |
---|---|---|
EAimTY/tuic | v0.8.5 | 双端代理核心 |
acmesh-official/acme.sh | v3.0.4 | 证书申请 |
2dust/v2rayN | v5.36 | 核心承载客户端(Windows) |
MatsuriDayo/nekoray | v2.3 | 核心承载客户端(Windows) |
SagerNet/SagerNet | v0.8.1-rc03 | 核心承载客户端(Android) |
MatsuriDayo/Matsuri | v0.5.2 | 暂不支持 |
服务端配置
Step1: 下载预编译的 tuic-server
创建工作目录 /home/tuic/
,拉取预编译的 tuic-server v0.8.5,安装 ACME,调整默认 CA letsencrypt
。
|
|
Step2: 申请证书
申请证书,将证书移至 /home/tuic/
工作目录。
一个 A 域名每 170h 最多申请 5 次证书,如果你玩的太花被限制了,开一个新的 A 域名到本机 IPv4 即可。
|
|
Step3: 编辑服务配置文件
|
|
添加配置信息:
|
|
Step4: 添加系统服务
|
|
创建并编辑配置文件:
|
|
更新系统服务缓存,允许 tuic service
开机自启
|
|
启动系统服务
|
|
其他常用命令
|
|
客户端配置
配置模版
建议在开始配置之前将客户端升级到最新版本。在文档中未出现的 field 将保持默认设置。
|
|
NekoRay[推荐]
如果你是首次使用 NekoRay,可看这篇文章以及官方文档快速上手。
下载预编译的 tuic-client(windows-gnu),放置到 NekoRay config 目录下。务必下载 client,而不是 server。
「首选项 - 基本设置 - 核心」添加自定义核心,命名「tuic」,添加 tuic-client 的绝对路径,如果你已将核心放置在 config 目录下,点击「选择」可以直接看见。
- 在空白处右键「手动输入配置 - 编辑」在「类型」中选择「自定义(其他核心)」,模版配置如下图所示。替换掉占位符
YOUR SERVER DOMAIN
以及YOUR SERVER IP
。如果你改变了上文给出的服务端口ip
以及身份令牌token
,则此处对照改变即可。
V2RayN
- 下载预编译的 tuic-client(windows-gnu),放置到 V2RayN 工程根目录下。
- 添加自定义配置服务器,复制粘贴配置模版,替换掉占位符
YOUR SERVER DOMAIN
以及YOUR SERVER IP
,修改 local port 为 50001。如果你改变了上文给出的服务端口ip
以及身份令牌token
,则此处对照改变即可。
SagerNet
从 Google Play 下载软件(搜索关键词 SagerNet),或从项目仓库拉取 apk 程序。
添加服务器配置「手动输入 - TUIC」,对照配置模版填入必要信息:
- 首次使用时根据提示下载 SagerNet - TUIC 插件,主流安卓设备选择 arm64-v8a 的版本。参考这篇文章的软件配置,解除插件和主程序的限制。首先,长按 SagertNet,设置应用信息,提供自启动,联网控制和无限制省电的权限,然后再通过「系统设置 - 应用管理」查找 TUIC Plugin,给予自启动和无限制省电的权限。
网络对比测试
使用 NekoRay 对同一服务器上监听不同端口的代理服务进行对比测试,核心版本及客户端配置如下:
|
|
下方对比中,选用来自 PacificRack 提供商的网络环境较有挑战的云服务器,本地带宽 300Mbps,调整 Hysteria down_mbps: 110
,YouTube 4K 视频,大文件下载速度测试选用 Open Images Dataset V7 的 Boxes 训练集。
- Speedtest :两种协议均能跑满理论上限,微量损耗误差忽略不计。
- YouTube4K:两种协议连接速度均溢出(一般认为连接速度超过 2W Kbps 即可流畅播放)。其中,Hysteria 略有优势,但实测中连接速度不稳定,出现「间接抽风」的情况,波动非常大。
- FileDownload:Hysteria 下载速度接近
down_mbps
理论上限,而 TUIC 的下载速度则稳定在 3~5 MB/s。
来源/协议 | TUIC | Hysteria |
---|---|---|
Speedtest | ||
YouTube Connection Speed | ||
Download |
现将服务器调整为 V.PS 提供的线路质量较好的 Tokyo Micro Pro 服务器,调整 Hysteria down_mbps: 187
,其他环境条件不变。
- Speedtest:趋势相同。
- YouTube4K:连接速度同样已溢出,但 Hysteria 已能跑出一倍之差的测试成绩
- FileDownload:Hysteria 下载速度接近
down_mbps
理论上限,而 TUIC 的下载速度稳定在 9MB/s 左右。
值得一提的是,先前 Hysteria 在 YouTube 测试中的抖动情况不再出现。
来源/协议 | TUIC | Hysteria |
---|---|---|
Speedtest | ||
YouTube Connection Speed | ||
Download |
TUIC
协议简介
TUIC 是一个基于 QUIC 的有状态协议,目前的版本是 0x04
。
协议特性
- 1-RTT TCP 中继
- 0-RTT UDP 中继,且 NAT 类型为 FullCone
- 在用户空间的拥塞控制,也就是说可以在任何系统平台实现双向的 BBR
- 两种 UDP 中继模式:
native
(原生 UDP 特性,数据仍被 TLS 加密)和quic
(100% 送达率,每个包单独单独作为一个 QUIC 「流」,一个包的确认重传不会阻塞其它包) - 完全多路复用,服务器和客户端之间始终只需要一条 QUIC 连接,所有任务作为这个连接中的 “流” 进行传输(一个流的暂时阻塞不会影响其它流),所以除连接第一个中继任务外的其它任务都不需要经过 QUIC 握手和 TUIC 的鉴权
- 网络切换时的会话平滑转移,例如在从 Wi-Fi 切换到移动数据时连接不会像 TCP 一样直接断开
- 0-RTT 、与中继任务并行的鉴权
- 支持 QUIC 的 0-RTT 握手(开启之后能达到 真・ 1 -RTT TCP 和 0-RTT UDP ,但是就算不开启,多路复用的特性也能保证在绝大多数情况下 1-RTT 和 0-RTT )
总结对比
TUIC 设计目标是「尽可能减少握手造成的网络往返时延」,相比之下,更加适合「湍流」应用场景,即,快速响应的持续不断的小流量请求,如快速加载 YouTube/TikTok/Twitter 首帧内容,访问素材网站快速加载缩略图等。
Hysteria 的设计目标是「最大化数据吞吐量」,相比之下,社区更加活跃,协议完成度更高,例如:已于 1.3.0 支持 port-hopping,可在一定程度上缓解 UDP 单端口长连接被运营商丢包的风险;支持 obfs 流量混淆;内部实现 TUN 以及ACL路由;相比之下,Hysteria 更加适合「激流」应用场景,即,非即时响应的高速流量,如数据集拉取,YouTube 8K 视频播放。
总得来说,TUIC 更适合移动端(蜂窝流量)使用场景。TUIC 的较低的网络往返时延,性能损耗以及带宽开销能够在短视频,即时通信等应用场景带来不错的体感升级,而当 VPS 线路质量较差时(如骨干网晚高峰)TUIC 发挥的作用非常有限。
Hysteria 更适合大流量应用场景,绝大多数的单节点 VPS 直连线路质量都很一般,Hysteria 微调后的拥塞控制策略的确能给劣质网络环境带来质变,但也需警惕错误的客户端配置带来的负优化。在服务器带宽盈余时,Hysteria 更符合大多数普通用户的综合需求,尤其在链路拥堵时段,代理中继延时在用户层面感知不强,反倒是数倍之差的下载速度体验成为矛盾焦点。
最后,在条件允许的情况下,直连线路搭配使用 QUIC 变种协议簇而非 VMESS,Trojan,VLESS 是更加明智的选择。如果你喜欢或依赖 CDN/Relay 则可以选择 「Shadowsocks + ShadowTLS」 或 「VMESS + TLS + WS + CDN」 等更加复杂的解决方案。