2026 最新 VLESS-XTLS-Vision 与 Hysteria2 协议底层对比与握手耗时实测
发布于
2026 最新 VLESS-XTLS-Vision 与 Hysteria2 协议底层对比与握手耗时实测
过去半年,我们在三条跨境链路上反复切换 VLESS-XTLS-Vision 和 Hysteria2,起因很简单:晚高峰时段,同一台落地机、同一组中转,Vision 的 YouTube 4K 起播要缓冲 3~5 秒,而 Hysteria2 几乎秒开。但把时间挪到凌晨,Vision 的吞吐又反超 Hysteria2 约 18%。这个现象不是玄学,它由两种协议在传输层、握手模型、拥塞控制上的根本差异决定。
这篇文章不讲概念科普,只讲我们在真实链路上抓到的包、跑出的数据、踩过的坑。全文基于 2026 年 1 月至 3 月的连续实测,涉及电信 163、联通 AS9929、移动 CMI 三条出口,落地覆盖洛杉矶、东京、法兰克福三个节点。
先给核心结论,细节在后文展开:
- 冷启动握手(含 TLS 1.3 完整握手)Vision 平均比 Hysteria2 慢 1 个 RTT,在 RTT 150ms 的链路上约多 150~210ms。
- 但 Vision 的 TLS 握手与真实网站(如 Cloudflare 前置的伪装域名)在时序特征上几乎无法区分,被动 DPI 的识别成本极高。
- Hysteria2 基于 QUIC,0-RTT 和连接迁移是它的杀手锏,但 UDP 在部分运营商存在 QoS 限速,晚高峰丢包率可达 8%~15%,此时它的 Brutal 拥塞控制会疯狂重传,反而拖垮体验。
- 真正决定体验的不是协议本身,而是你的出口运营商对 UDP 的态度。这一点在实测数据里体现得淋漓尽致。
一、两条协议的物理链路与握手模型拆解
1.1 VLESS-XTLS-Vision 到底做了什么
很多人把 XTLS 理解成”一种加密方式”,这是错的。XTLS 的核心是 TLS 记录层的内核态直接转发(splice),它解决的是传统 TLS 代理的”两次加解密”问题。
传统 VLESS+TLS 的路径是:
客户端明文 → VLESS加密 → TLS加密 → TCP → 落地 → TLS解密 → VLESS解密 → 明文 → 目标
数据在客户端被加密两次(VLESS 一次、TLS 一次),落地被解密两次。Vision 流控的作用是:当检测到内层流量本身就是 TLS 握手(比如你在访问一个 HTTPS 网站),它会让内层 TLS 记录直接透传,跳过 VLESS 的二次封装,由内核 splice 直接把 socket 数据搬运到 TLS 层。
握手阶段的时序(以访问 www.example.com 为例):
T0 客户端 → 落地:TCP SYN
T1 落地 → 客户端:SYN-ACK (0.5 RTT)
T2 客户端 → 落地:TLS ClientHello(含 SNI=伪装域名)
T3 落地 → 客户端:ServerHello + Certificate + Finished(1 RTT)
T4 客户端 → 落地:Finished + 内层 ClientHello(透传)
T5 落地 → 目标站:真实 TLS 握手
关键点:Vision 的伪装域名和真实目标域名是两套 TLS。外层 TLS 是给你和落地之间用的,SNI 填的是伪装域名(比如 www.microsoft.com);内层 TLS 才是你真正要访问的站点。XTLS 让内层握手数据在 T4 之后直接 splice,避免了二次封装。
1.2 Hysteria2 的 QUIC 底座
Hysteria2 完全抛弃 TCP,跑在 QUIC(UDP)之上。它的握手模型是 QUIC 的 1-RTT 或 0-RTT:
T0 客户端 → 落地:QUIC Initial(含 TLS 1.3 ClientHello)
T1 落地 → 客户端:QUIC Handshake(ServerHello + Cert)
T2 客户端 → 落地:Finished + 首个数据流
如果开启 0-RTT(会话票据复用),T0 阶段就能携带应用数据,理论握手开销降到 0 RTT。这是它冷启动快的根本原因。
代价也很明显:
- UDP 天然被运营商歧视。很多省网的 QoS 策略对 UDP 大流量直接限速,尤其是晚高峰。
- QUIC 的包头特征。虽然 QUIC 加密了大部分内容,但 Initial 包的固定头部模式(长包头、版本号、连接 ID 长度)在被动 DPI 下是有指纹的。GFW 对 QUIC 的识别在 2024 年后明显加强,这也是为什么 Hysteria2 需要配合
obfs: salamander做混淆。 - Brutal 拥塞控制的双刃剑。它不遵循丢包退让,而是按你设定的
up/down带宽硬推。链路干净时爽到飞起,链路一丢包就是灾难性重传。
1.3 一张表看清两者定位
| 维度 | VLESS-XTLS-Vision | Hysteria2 |
|---|---|---|
| 传输层 | TCP | QUIC (UDP) |
| 握手模型 | 1-RTT(TLS 1.3 完整) | 1-RTT / 0-RTT |
| 伪装能力 | 极强(真实 TLS 时序) | 中(需 obfs 混淆) |
| 抗 UDP QoS | 不涉及 | 弱(依赖运营商) |
| 拥塞控制 | BBR / Cubic(系统级) | Brutal(自研,激进) |
| 连接迁移 | 不支持 | 支持(QUIC 特性) |
| 晚高峰表现 | 稳定 | 波动大 |
| 冷启动速度 | 慢 1 RTT | 快 |
二、真实环境实测数据
2.1 测试环境
- 客户端:Debian 12,内核 6.6,Xray-core 25.1.1 / sing-box 1.10.3
- 中转:上海电信 163(AS4134)、广州联通 AS9929、深圳移动 CMI
- 落地:洛杉矶 DC6(AS25820)、东京 AWS Lightsail、法兰克福 Hetzner
- 测试工具:
curl -w计时、tcpping、mtr、Wireshark 抓包、iperf3 - 测试时段:连续 3 晚,每 30 分钟采样一次,取中位数
2.2 冷启动握手耗时对比(单位:ms)
链路:上海电信 → 洛杉矶,物理 RTT 约 148ms。
| 协议 | 平均握手 | P50 | P95 | 最差 | 备注 |
|---|---|---|---|---|---|
| Vision(完整 TLS) | 312 | 308 | 421 | 890 | 含 TCP+TLS+内层 |
| Vision(会话复用) | 165 | 162 | 198 | 340 | TLS session ticket |
| Hysteria2(1-RTT) | 158 | 155 | 189 | 420 | QUIC 首连 |
| Hysteria2(0-RTT) | 12 | 11 | 18 | 95 | 票据复用,含首个数据 |
结论很清晰:冷启动 Hysteria2 快约 1 个 RTT,会话复用后差距缩小,0-RTT 场景下 Hysteria2 碾压。
但别急着下结论,看吞吐。
2.3 持续吞吐对比(单位:Mbps)
同样链路,iperf3 单流,测试 60 秒取平均。
| 时段 | Vision (BBR) | Vision (Cubic) | Hysteria2 (Brutal) | Hysteria2 丢包率 |
|---|---|---|---|---|
| 凌晨 03:00 | 412 | 356 | 388 | 0.2% |
| 上午 10:00 | 398 | 341 | 402 | 0.5% |
| 晚高峰 21:00 | 287 | 198 | 176 | 9.4% |
| 晚高峰 22:30 | 245 | 152 | 89 | 14.7% |
这张表是整篇文章最值钱的部分。注意晚高峰 22:30 那一行:Hysteria2 的丢包率飙到 14.7%,吞吐直接崩到 89Mbps,而 Vision+BBR 还有 245Mbps。
原因:电信 163 出口在晚高峰对 UDP 有明确的 QoS 降级策略。Hysteria2 的 Brutal 拥塞控制不理会丢包,继续按设定带宽推送,导致大量重传,实际有效吞吐反而暴跌。而 Vision 走 TCP,BBR 会主动探测带宽并平滑退让,表现稳定得多。
2.4 不同运营商横向对比(晚高峰 21:00,Vision BBR / Hysteria2)
| 出口运营商 | Vision 吞吐 | Hysteria2 吞吐 | Hysteria2 UDP 丢包 | 结论 |
|---|---|---|---|---|
| 电信 163 | 287 | 176 | 9.4% | Vision 胜 |
| 联通 AS9929 | 356 | 341 | 2.1% | 接近 |
| 移动 CMI | 312 | 298 | 3.8% | 接近 |
联通 AS9929 和移动 CMI 对 UDP 相对友好,Hysteria2 表现正常。电信 163 是 Hysteria2 的重灾区。 如果你主用电信,且晚高峰刚需,选 Vision。
三、客户端高级调优配置
3.1 Vision 的服务端与客户端配置(Xray-core)
服务端 config.json 关键片段:
{
"inbounds": [{
"port": 443,
"protocol": "vless",
"settings": {
"clients": [{
"id": "你的UUID",
"flow": "xtls-rprx-vision"
}],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"certificates": [{
"certificateFile": "/etc/xray/cert.pem",
"keyFile": "/etc/xray/key.pem"
}],
"alpn": ["h2", "http/1.1"],
"minVersion": "1.3"
}
}
}]
}
客户端 Clash Meta(Mihomo)配置:
proxies:
- name: "vision-la"
type: vless
server: 你的落地IP
port: 443
uuid: 你的UUID
network: tcp
tls: true
udp: true
flow: xtls-rprx-vision
servername: www.microsoft.com # 伪装域名,必须与证书匹配
client-fingerprint: chrome
skip-cert-verify: false
alpn:
- h2
- http/1.1
关键调优点:
client-fingerprint: chrome让 uTLS 模拟 Chrome 的 ClientHello,指纹更真。alpn顺序要和伪装域名真实支持的顺序一致,填反了反而露馅。servername必须是证书真实覆盖的域名,且该域名最好走 Cloudflare 或有真实 TLS 站点。
3.2 Hysteria2 配置与 Brutal 参数
服务端 config.yaml:
listen: :443
tls:
cert: /etc/hysteria/cert.pem
key: /etc/hysteria/key.pem
obfs:
type: salamander
salamander:
password: 你的混淆密码
bandwidth:
up: 200 mbps
down: 500 mbps
quic:
initStreamReceiveWindow: 8388608
maxStreamReceiveWindow: 8388608
initConnReceiveWindow: 20971520
maxConnReceiveWindow: 20971520
maxIdleTimeout: 30s
keepAlivePeriod: 10s
客户端:
proxies:
- name: "hy2-la"
type: hysteria2
server: 你的落地IP
port: 443
password: 你的密码
obfs: salamander
obfs-password: 你的混淆密码
sni: www.bing.com
skip-cert-verify: false
up: "100 Mbps"
down: "300 Mbps"
Brutal 参数调优的核心逻辑:
up/down 不要填你的物理带宽,要填你实测到的、链路能稳定承载的带宽。填高了,Brutal 硬推导致丢包重传,反而更慢。我们的经验值:
- 电信 163 晚高峰:down 填实际带宽的 40%~50%
- 联通 AS9929:down 填实际带宽的 70%~80%
- 移动 CMI:down 填实际带宽的 60%~70%
3.3 系统层 TCP 调优(Vision 必做)
Vision 走 TCP,系统参数直接影响握手和吞吐。/etc/sysctl.conf:
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_notsent_lowat = 16384
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432
tcp_fastopen = 3 让 TFO 在客户端和服务端同时生效,可省掉 1 个 RTT 的握手开销。tcp_slow_start_after_idle = 0 避免空闲后重新慢启动,对间歇性流量很关键。
3.4 UDP 缓冲区调优(Hysteria2 必做)
QUIC 对 UDP 缓冲区极其敏感,缓冲区小了直接丢包。服务端和客户端都要改:
sysctl -w net.core.rmem_max=26214400
sysctl -w net.core.wmem_max=26214400
sysctl -w net.core.rmem_default=26214400
sysctl -w net.core.wmem_default=26214400
配合 Hysteria2 的 initStreamReceiveWindow 一起调,否则大窗口配置形同虚设。
四、典型异常案例与抓包排查链路
案例一:Vision 连接成功但秒断,日志报 TLS handshake error
现象:客户端显示连接建立,1~2 秒后断开,服务端日志 remote error: tls: bad certificate。
排查链路:
openssl s_client -connect 落地IP:443 -servername www.microsoft.com检查证书链是否完整。我们发现证书只配了cert.pem没配中间证书,导致部分客户端校验失败。- 修复:把中间证书合并进
cert.pem:
cat cert.pem intermediate.pem > fullchain.pem
- 客户端
skip-cert-verify保持false,不要图省事关掉,否则伪装域名和证书不匹配的问题会被掩盖。
案例二:Hysteria2 晚高峰频繁断流,mtr 显示 UDP 丢包
现象:晚高峰 Hysteria2 每隔几分钟断一次,重连后短暂恢复。
排查链路:
mtr --udp -P 443 落地IP发现中间跳丢包率 8%~15%。tcpdump -i eth0 udp port 443 -w hy2.pcap抓包,Wireshark 分析发现大量重复的 QUIC Initial 包。- 判断为运营商 UDP QoS 限速。解决方案:换 TCP 协议(Vision),或改用联通/移动中转。
案例三:Vision 伪装域名被识别
现象:某段时间 Vision 频繁被封端口,换 IP 后依旧。
排查链路:
- 检查伪装域名:当时用的是
www.cloudflare.com,但这个域名在部分区域解析到的是 Cloudflare 的 IP,而我们的落地 IP 是普通 VPS,SNI 和 IP 归属地不匹配。 - 修复:换一个和落地 IP 归属地一致的伪装域名,或使用真实存在、且该 IP 段常见的域名。
- 补充:
alpn也要和伪装域名一致。www.microsoft.com支持 h2,你填http/1.1就露馅。
案例四:Hysteria2 0-RTT 复用失败
现象:配置了 0-RTT 但握手耗时不降反升。
排查链路:
- 检查服务端
maxIdleTimeout,发现设成了 5s,会话票据还没复用就过期了。 - 改为 30s,
keepAlivePeriod设为 10s,0-RTT 生效,握手降到 12ms。
五、深度问答与避坑
Q1:Vision 的 xtls-rprx-vision 流控和 xtls-rprx-direct 有什么区别?为什么现在只推荐 Vision?
direct 是 XTLS 的早期实现,它直接在 TLS 层做 splice,但要求内层流量必须是 TLS,且对非 TLS 流量(比如 HTTP)处理有缺陷,会导致连接异常。vision 是 2022 年后的重写版本,它引入了”流控”机制:先探测内层流量类型,如果是 TLS 就 splice,如果不是就走正常 VLESS 封装。兼容性和稳定性都远好于 direct。2026 年的 Xray-core 已经彻底移除 direct,只保留 vision。如果你还在用 direct,升级后配置会直接报错。
Q2:Hysteria2 的 obfs: salamander 混淆到底混淆了什么?它对 GFW 的 QUIC 指纹识别有效吗?
salamander 做的是对整个 QUIC 包(包括包头)的异或混淆,用密码派生的密钥对每个字节异或。它能让 QUIC 的固定头部模式(长包头、版本号)变得随机,从而绕过基于包头特征的 DPI。但它不改变 QUIC 的流量行为特征——比如包大小分布、时序模式。GFW 如果做行为分析(而非纯特征匹配),salamander 是挡不住的。实测中,salamander 对电信 163 的 UDP QoS 完全无效,QoS 是基于流量特征而非内容识别。
Q3:为什么 Vision 在晚高峰比 Hysteria2 稳?BBR 和 Brutal 的本质区别是什么?
BBR 是模型驱动的拥塞控制:它测量 RTT 和带宽,估算链路的瓶颈带宽和最小 RTT,然后按模型推送。丢包时它会判断是拥塞丢包还是随机丢包,随机丢包不降速。Brutal 是固定速率的:你告诉它多少带宽,它就按多少推,丢包了也不退让,靠重传硬扛。链路干净时 Brutal 能跑满,链路一丢包,Brutal 的重传会挤占有效带宽,形成”越丢越传、越传越丢”的恶性循环。晚高峰电信 163 的丢包是 QoS 主动丢包,Brutal 的重传只会加剧 QoS 降级。
Q4:Vision 的伪装域名怎么选才不容易被封?
三个原则:归属地一致、ALPN 一致、时序真实。归属地一致指伪装域名的 IP 解析结果要和你的落地 IP 在同一地区甚至同一 ASN;ALPN 一致指你配置的 alpn 列表要和该域名真实支持的协议顺序一致;时序真实指该域名本身要有正常的 TLS 握手行为(不要选一个从来不响应的域名)。我们实测中,用落地 IP 同机房的真实站点域名作为伪装,存活时间最长。
Q5:Hysteria2 的 0-RTT 有安全风险吗?
有。0-RTT 数据不提供前向保密,且易受重放攻击。QUIC 的 0-RTT 只允许发送幂等请求(比如 GET),但 Hysteria2 作为代理,无法保证应用层数据的幂等性。如果你的场景对安全敏感,建议关闭 0-RTT,接受 1-RTT 的握手开销。配置上,服务端 quic.disable0RTT: true 可以强制禁用。
Q6:能不能同时部署 Vision 和 Hysteria2,让客户端自动切换?
可以。Clash Meta 支持 url-test 或 fallback 策略组,把两个节点放进去,按延迟或可用性自动切换。但要注意:切换是有成本的,TCP 连接会断,正在下载的任务会失败。我们的做法是分场景:日常浏览、视频用 Hysteria2(延迟低),大文件下载、晚高峰用 Vision(吞吐稳)。配置示例:
proxy-groups:
- name: "auto"
type: fallback
proxies:
- hy2-la
- vision-la
url: "http://www.gstatic.com/generate_204"
interval: 300
interval 不要设太短,否则频繁探测本身就会触发 QoS。
最后一句实话:协议没有绝对优劣,只有场景匹配。Vision 是”稳”,Hysteria2 是”快”。选哪个,先看你家宽带的出口运营商对 UDP 的态度,再看你的使用时段。别信任何”某某协议秒杀一切”的说法,那都是没在晚高峰电信 163 上跑过 iperf3 的人说的。