2026 最新 VLESS-XTLS-Vision 与 Hysteria2 协议底层对比与握手耗时实测

7877 字
20 分钟

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。这是它冷启动快的根本原因。

代价也很明显:

  1. UDP 天然被运营商歧视。很多省网的 QoS 策略对 UDP 大流量直接限速,尤其是晚高峰。
  2. QUIC 的包头特征。虽然 QUIC 加密了大部分内容,但 Initial 包的固定头部模式(长包头、版本号、连接 ID 长度)在被动 DPI 下是有指纹的。GFW 对 QUIC 的识别在 2024 年后明显加强,这也是为什么 Hysteria2 需要配合 obfs: salamander 做混淆。
  3. Brutal 拥塞控制的双刃剑。它不遵循丢包退让,而是按你设定的 up/down 带宽硬推。链路干净时爽到飞起,链路一丢包就是灾难性重传。

1.3 一张表看清两者定位

维度VLESS-XTLS-VisionHysteria2
传输层TCPQUIC (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。

协议平均握手P50P95最差备注
Vision(完整 TLS)312308421890含 TCP+TLS+内层
Vision(会话复用)165162198340TLS session ticket
Hysteria2(1-RTT)158155189420QUIC 首连
Hysteria2(0-RTT)12111895票据复用,含首个数据

结论很清晰:冷启动 Hysteria2 快约 1 个 RTT,会话复用后差距缩小,0-RTT 场景下 Hysteria2 碾压。

但别急着下结论,看吞吐。

2.3 持续吞吐对比(单位:Mbps)

同样链路,iperf3 单流,测试 60 秒取平均。

时段Vision (BBR)Vision (Cubic)Hysteria2 (Brutal)Hysteria2 丢包率
凌晨 03:004123563880.2%
上午 10:003983414020.5%
晚高峰 21:002871981769.4%
晚高峰 22:302451528914.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 丢包结论
电信 1632871769.4%Vision 胜
联通 AS99293563412.1%接近
移动 CMI3122983.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。

排查链路:

  1. openssl s_client -connect 落地IP:443 -servername www.microsoft.com 检查证书链是否完整。我们发现证书只配了 cert.pem 没配中间证书,导致部分客户端校验失败。
  2. 修复:把中间证书合并进 cert.pem:
cat cert.pem intermediate.pem > fullchain.pem
  1. 客户端 skip-cert-verify 保持 false,不要图省事关掉,否则伪装域名和证书不匹配的问题会被掩盖。

案例二:Hysteria2 晚高峰频繁断流,mtr 显示 UDP 丢包

现象:晚高峰 Hysteria2 每隔几分钟断一次,重连后短暂恢复。

排查链路:

  1. mtr --udp -P 443 落地IP 发现中间跳丢包率 8%~15%。
  2. tcpdump -i eth0 udp port 443 -w hy2.pcap 抓包,Wireshark 分析发现大量重复的 QUIC Initial 包。
  3. 判断为运营商 UDP QoS 限速。解决方案:换 TCP 协议(Vision),或改用联通/移动中转。

案例三:Vision 伪装域名被识别

现象:某段时间 Vision 频繁被封端口,换 IP 后依旧。

排查链路:

  1. 检查伪装域名:当时用的是 www.cloudflare.com,但这个域名在部分区域解析到的是 Cloudflare 的 IP,而我们的落地 IP 是普通 VPS,SNI 和 IP 归属地不匹配。
  2. 修复:换一个和落地 IP 归属地一致的伪装域名,或使用真实存在、且该 IP 段常见的域名。
  3. 补充:alpn 也要和伪装域名一致。www.microsoft.com 支持 h2,你填 http/1.1 就露馅。

案例四:Hysteria2 0-RTT 复用失败

现象:配置了 0-RTT 但握手耗时不降反升。

排查链路:

  1. 检查服务端 maxIdleTimeout,发现设成了 5s,会话票据还没复用就过期了。
  2. 改为 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 的人说的。