一、先给结论:HTTP 和 XHTTP 不是一个层级
把整个链路拆开,会清楚很多。
普通 Web 访问通常可以抽象为:
Browser / App ↓ HTTP/1.1 / HTTP/2 / HTTP/3 ↓ TLS ↓ TCP / QUIC ↓ IP而 Xray 中常见的:
VLESS + XHTTP + REALITY更准确的分层是:
应用流量 ↓ VLESS ← 代理协议 Proxy Protocol ↓ XHTTP ← 传输方式 Transport Method ↓ HTTP/1.1 / H2 / H3 ← HTTP 承载 ↓ REALITY / TLS ← 传输安全 ↓ TCP / QUIC ↓ IP所以,最重要的一句话是:
XHTTP ≠ HTTP/2,也不是 HTTP 的替代品。XHTTP 更像是建立在 HTTP 能力之上的“代理数据运输系统”。
二、普通 HTTP 到底在解决什么问题?
HTTP 的主要职责,是定义客户端和服务器如何交换 Web 资源。
例如浏览器请求:
GET /api/user HTTP/1.1 Host: example.com Accept: application/json服务端返回:
HTTP/1.1 200 OK Content-Type: application/json {"id":1,"name":"Alice"}这个模型非常清晰:
Client │ │ HTTP Request ▼ Server │ │ HTTP Response ▼ ClientHTTP 规范负责定义:
- Request Method;
- URL;
- Header;
- Body;
- Status Code;
- Cache;
- Content Negotiation;
- Connection Reuse;
- Streaming;
- HTTP/2 Multiplexing;
- HTTP/3 over QUIC。
但是 HTTP 并不会告诉你:
“如何把 SOCKS/TUN 接收到的任意 TCP/UDP 代理流量映射到 HTTP 请求和响应里。”
这恰恰是 XHTTP 所做的事情之一。
三、XHTTP 到底是什么?
在 Xray 的配置体系中,XHTTP 属于Transport Method。
也就是说,一条完整代理链路可以拆成:
Proxy Protocol + Transport Method + Transport Security + Network Transport例如:
VLESS + XHTTP + REALITY + TCP或者:
VLESS + XHTTP + TLS + HTTP/3 / QUIC这样理解之后,很多概念就不会再混淆:
| 技术 | 所属层级 | 作用 |
|---|---|---|
| VLESS | Proxy Protocol | 描述代理连接、用户、目标地址等 |
| XHTTP | Transport Method | 把代理数据映射到 HTTP 传输模型 |
| HTTP/2 | HTTP Protocol | 提供 HTTP 流、多路复用等能力 |
| HTTP/3 | HTTP Protocol | 基于 QUIC 的 HTTP |
| TLS | Transport Security | 标准 TLS 加密 |
| REALITY | Transport Security | Xray 的 TLS 派生安全机制 |
| TCP | Transport | 可靠字节流 |
| QUIC | Transport | 基于 UDP 的现代传输协议 |
所以:
VLESS + XHTTP + REALITY不是三个互相竞争的协议,而是三层组合。
四、为什么 XHTTP 不直接使用“一条普通 HTTP 连接”?
代理流量和普通 Web 请求有一个天然区别:
普通 Web 请求往往具有明确边界:
Request → Response → Done代理连接却可能持续很久:
TCP Connection ──────────────────────────────> 持续上传 <────────────────────────────── 持续下载例如:
- SSH;
- WebSocket;
- 视频流;
- 下载;
- API 长连接;
- 数据库连接;
- 游戏连接。
因此,一个代理 transport 必须解决:
- 如何持续上传;
- 如何持续下载;
- 如何穿过 HTTP 反向代理/CDN;
- 如何处理 HTTP 请求缓冲;
- 如何处理多路复用;
- 如何避免某一条长连接永久占用;
- 如何支持 H1/H2/H3;
- 如何在需要时把上下行拆成两个独立链路。
XHTTP 的三种主要模式,就是围绕这些问题设计出来的。
五、packet-up:分包上行 + 流式下行
packet-up 是理解 XHTTP 最重要的一步。
它的设计可以概括成:
上传: POST POST POST POST POST 下载: 一个持续返回数据的 Response Stream假设当前会话 ID 为:
abcdef123456客户端可能通过多个请求发送数据:
POST /api/x/abcdef123456/0 POST /api/x/abcdef123456/1 POST /api/x/abcdef123456/2 POST /api/x/abcdef123456/3其中:
0 1 2 3相当于 sequence。
服务端收到以后,根据:
session id + sequence重新恢复原来的上行字节流。
与此同时,下行可以建立类似:
GET /api/x/abcdef123456服务器保持响应:
HTTP Response ──────────────────────────────────── data data data data data data ...这就是:
Packet Upload + Streaming Download
packet-up 为什么有意义?
很多 HTTP 中间层对上传请求的处理方式比较保守。
例如某些:
- CDN;
- WAF;
- Reverse Proxy;
- HTTP Gateway;
- Load Balancer。
可能倾向于:
Client POST ↓ 完整读取 Request Body ↓ 再发送给 Origin如果上传是无限流:
POST Body ──────────────────────────────>中间层可能无法很好处理。
但是:
POST 300 KB POST 500 KB POST 800 KB就是普通 HTTP 请求。
因此 packet-up 的核心思想,是:
把难以兼容的“无限上传流”转换成多个具有边界的普通 HTTP 请求。
为什么下载不也切成很多包?
因为下载方向通常可以很好地利用 HTTP Streaming。
例如下载一个 20GB 文件时,CDN 不需要:
先把 20GB 全部下载完 再发给用户更常见的做法是:
Origin ↓ data CDN ↓ data Client边收到边发送。
因此 XHTTP 可以保留下行的流式效率。
六、stream-up:流式上行 + 流式下行
packet-up 很兼容,但毕竟会产生多个 HTTP 请求。
如果持续上传量较大,例如:
100 MB 500 MB 2 GB不断拆成:
POST POST POST POST ...会产生额外的:
- HTTP Header;
- Request Scheduling;
- 请求管理;
- 中间层处理;
- CPU 开销。
于是 XHTTP 又提供:
stream-upstream-up 可以理解成:
上行: Client ================================> Server 下行: Client <================================ Server但它不是 stream-one。
stream-up 中,上下行仍然是相互独立的逻辑方向。
典型理解:
POST /path/session ↓ 持续上传 GET /path/session ↓ 持续下载这带来一个非常重要的能力:
上下行可以进一步拆成不同网络路径。
这也是downloadSettings能工作的基础。
七、stream-one:一个 HTTP 请求完成双向通信
第三种模式是:
stream-one它更加容易理解。
可以抽象为:
POST /path/ Request Body Client ==================> Server Response Body Client <================== Server也就是:
一个 HTTP 请求,同时承担上行和下行。
这种方式结构非常漂亮:
1 个 Request + 1 个 Response = 1 条双向代理流与 packet-up 相比,它没有大量独立 POST。
与 stream-up 相比,它又不需要另外维护一个独立下行请求。
因此如果:
- 不需要上下行分离;
- 网络环境支持;
- CDN/反代兼容;
stream-one 通常是非常自然的模式。
需要特别注意:
stream-one本身已经把上行和下行绑定在同一个请求/响应中,因此不能再通过downloadSettings把下行拆出去。
八、三种模式放在一起比较
| 特性 | packet-up | stream-up | stream-one |
|---|---|---|---|
| 上行 | 多个 HTTP 请求 | 流式 | 流式 |
| 下行 | 流式 | 独立流式 | Response 流 |
| HTTP 请求数量 | 较多 | 中等 | 最少 |
| 上传效率 | 较好 | 高 | 高 |
| 中间层兼容性 | 很高 | 高 | 取决于链路 |
| 上下行分离 | 支持 | 支持 | 不支持 |
| H3/CDN 灵活性 | 很强 | 视环境 | 视环境 |
| 典型用途 | CDN/兼容优先 | 高上传/分离 | 简洁直连 |
可以简单记忆成:
packet-up = 小块上传 + 大流下载 stream-up = 大流上传 + 独立大流下载 stream-one = 一个 Request/Response 完成双向流九、mode=auto 到底会怎么选择?
XHTTP 提供:
{"mode":"auto"}这不是第四种传输模式。
auto的意思是:
根据当前连接条件选择 packet-up、stream-up 或 stream-one。
按照当前 XHTTP 设计逻辑,可以大致理解为:
REALITY │ ├─ 没有 downloadSettings │ └─ stream-one │ └─ 有 downloadSettings └─ stream-up而 TLS H2 场景通常会优先考虑:
stream-up其它不满足相应流式条件的环境,则可能回到:
packet-up因此对于普通用户:
"mode":"auto"是一个非常重要的起点。
不要一开始就堆几十个所谓“优化参数”。
正确做法通常应该是:
先跑通 ↓ 测延迟 ↓ 测下载 ↓ 测上传 ↓ 看日志 ↓ 再针对问题调整十、XHTTP、HTTP/1.1、HTTP/2、HTTP/3 到底是什么关系?
这是第二个高频误区。
很多人会问:
XHTTP 和 HTTP/2 哪个快?
这个问题本身就不完全成立。
因为:
XHTTP是 Xray transport。
而:
HTTP/2是 HTTP 协议版本。
更加准确的问题应该是:
XHTTP 使用 H2 和 XHTTP 使用 H3,有什么区别?
HTTP/1.1
底层:
HTTP/1.1 ↓ TCP特点:
- 历史最久;
- 兼容性非常广;
- 每条连接上的并发能力不如 H2/H3;
- 某些代理链路仍大量存在。
HTTP/2
底层:
HTTP/2 ↓ TCP核心能力:
Multiplexing Header Compression Stream多个逻辑 HTTP Stream 可以复用同一个 TCP 连接。
对于 XHTTP 而言,H2 是非常重要的承载方式。
HTTP/3
底层:
HTTP/3 ↓ QUIC ↓ UDPQUIC 自己提供:
- Encryption;
- Multiplexing;
- Loss Recovery;
- Congestion Control;
- Connection Migration。
H3 的优势之一是:
不同 Stream 不再全部依赖一个 TCP 字节流。
但这并不意味着:
H3 永远比 H2 快真实网络性能仍受:
- UDP QoS;
- NAT;
- ISP;
- CDN;
- RTT;
- Packet Loss;
- QUIC 实现;
- CPU;
- MTU;
影响。
十一、一个非常有意思的地方:H3 可以在中间被转换成 H2/H1
假设:
Client ↓ HTTP/3 ↓ CDNCDN 到 Origin 不一定也是 H3。
完全可能:
Client │ │ H3 / QUIC ▼ CDN │ │ H2 / TCP ▼ Origin甚至:
H3 ↓ CDN ↓ H1因此整个链路可能是:
XHTTP Client ↓ HTTP/3 ↓ CDN ↓ HTTP/2 ↓ Reverse Proxy ↓ XHTTP Server这也是为什么分析 XHTTP 时不能只看:
客户端配置写的是 h3你必须同时看:
Client → CDN CDN → Origin Reverse Proxy → Xray三段链路。
十二、XHTTP 最有特色的能力之一:上下行分离
传统代理通常是:
Client ⇅ Connection ⇅ Server上传和下载共享一个网络路径。
XHTTP 的 packet-up / stream-up 可以做到:
Upload Client ───────────────→ Server Download Client ←─────────────── Server进一步可以:
Upload: IPv4 → H2 → Route A Download: IPv6 → H3 → Route B在 XHTTP 中,客户端可以通过:
downloadSettings为下行定义另一套连接配置。
概念上:
{"xhttpSettings":{"path":"/api/v1/data","mode":"auto","extra":{"downloadSettings":{"address":"download.example.com","port":443,"network":"xhttp","security":"tls"}}}}注意:
这只是帮助理解结构的简化示例,实际字段请以当前 Xray Core 与客户端支持的配置 schema 为准。
十三、为什么上下行分离在工程上很有价值?
先不谈任何特殊网络环境,只从正常网络工程角度看。
现实网络经常存在:
A → B 很好 B → A 很差也就是:
去程 ≠ 回程例如:
用户 → 新加坡 延迟 40ms 新加坡 → 用户 绕路 延迟 180ms如果能够:
上行走 Route A 下行走 Route B理论上就可以分别优化:
- 上传路径;
- 下载路径;
- IPv4;
- IPv6;
- H2;
- H3;
- CDN;
- Origin。
这个设计理念和传统的:
一个 TCP 连接包办全部明显不同。
十四、XHTTP 中的 Session 是怎么把上下行重新关联起来的?
假设:
Upload Connection和:
Download Connection已经不是同一个连接。
那么服务端怎么知道:
这两个属于同一个代理会话?答案是:
Session ID概念上:
Upload: POST /path/{session_id}/... Download: GET /path/{session_id}服务器:
┌─ Upload session_id ───────┤ └─ Download最终恢复为:
Bidirectional Proxy Stream因此 XHTTP 真正做的是:
在 HTTP Request/Response 之上实现一套代理 Session 与数据流重组机制。
这就是为什么简单说:
XHTTP = HTTP是不准确的。
十五、Header Padding 是干什么的?
如果每一个请求都长得非常固定,例如:
POST /abcdef/session/0 Content-Length: 1000000Header 长度永远近似固定,就会形成比较机械的通信模式。
XHTTP 提供 Header Padding 机制。
核心思路:
Request Header Length不总是固定。
例如:
100 bytes 387 bytes 810 bytes 241 bytes ...对应配置中常见:
{"xPaddingBytes":"100-1000"}设计目标可以概括成:
减少过于稳定、机械的 Header 长度模式。
这里不建议为了“越随机越好”盲目扩大。
例如:
100-100000显然可能给:
- CDN;
- WAF;
- Nginx;
- 网关;
带来额外问题。
默认值或合理范围通常更稳妥。
十六、XMUX 是什么?
XHTTP 还有一个很重要的机制:
XMUX先回忆 H2/H3。
一个底层连接:
H2 Connection可以同时承载:
Stream 1 Stream 2 Stream 3 Stream 4 ...如果无限复用同一连接:
Connection A ├── Proxy 1 ├── Proxy 2 ├── Proxy 3 ├── Proxy 4 ├── Proxy 5 └── ...虽然连接数少,但是可能产生:
- 单连接生命周期过长;
- 某条连接故障影响较大;
- 服务端资源长期占用;
- 中间网络清理长连接;
- 某些场景断流后恢复不理想。
XMUX 的思路并不是简单追求:
连接越少越好而是控制:
一个连接可以复用多少次 活多久 承载多少并发 什么时候换新连接因此它更接近:
Connection Pool + Multiplexing Policy + Lifecycle Management而不是传统意义上的“开一个 mux=true”。
十七、为什么不建议 XHTTP 再叠加传统 mux.cool?
因为:
H2 / H3本身已经具有 Multiplexing。
XHTTP 又有:
XMUX如果上面再套一层传统代理 Mux:
Application ↓ Proxy Mux ↓ XHTTP XMUX ↓ HTTP/2 Multiplexing ↓ TCP会出现:
Mux on Mux on Mux这种设计未必提高性能,反而可能:
- 增加 Head-of-Line 影响;
- 增加队列;
- 增加复杂度;
- 放大某条底层连接失败的影响。
因此不要看到:
Mux就默认:
开启 = 更快代理优化最忌讳这种思路。
十八、XHTTP 和 gRPC 有什么区别?
gRPC transport 的典型结构:
VLESS ↓ gRPC ↓ HTTP/2 ↓ TLS ↓ TCPXHTTP:
VLESS ↓ XHTTP ↓ H1 / H2 / H3 ↓ TLS / REALITY ↓ TCP / QUIC从能力范围看,XHTTP 更宽。
| 项目 | gRPC | XHTTP |
|---|---|---|
| HTTP/2 | 是 | 是 |
| HTTP/1.1 | 否 | 可 |
| HTTP/3 | 非典型 | 可 |
| 专用 gRPC Library | 是 | 不依赖 gRPC transport 实现 |
| packet-up | 否 | 是 |
| stream-up | 类似流式能力 | 是 |
| stream-one | 否 | 是 |
| 上下行分离 | 否 | 是 |
| XMUX | 否 | 是 |
| Header Padding | 非 XHTTP 机制 | 是 |
这也是当前 Xray 官方文档在 gRPC transport 页面中建议迁移/优先考虑 XHTTP 的原因之一。
十九、XHTTP 和 WebSocket 有什么区别?
WebSocket:
HTTP/1.1 ↓ Upgrade: websocket ↓ 长期双向连接握手成功以后,后面不再是普通 HTTP Request/Response,而是 WebSocket Frame。
结构:
VLESS ↓ WebSocket ↓ TLS ↓ TCPXHTTP:
VLESS ↓ XHTTP ↓ H1/H2/H3 ↓ TLS/REALITYXHTTP 可以更加充分地利用:
- H2;
- H3;
- HTTP Stream;
- CDN HTTP 基础设施;
- 独立上下行;
- 多连接策略。
所以两者不是简单的:
WS 新 XHTTP 更新区别在于整个 transport 思路已经发生变化。
二十、XHTTP、RAW、WebSocket、gRPC 怎么选?
可以按照需求选择。
场景 1:纯直连,追求简单
优先考虑:
VLESS + RAW + REALITY优点:
- 链路短;
- 配置简单;
- 额外 HTTP 开销少。
场景 2:需要 HTTP/CDN/反代能力
考虑:
VLESS + XHTTP + TLS或者:
VLESS + XHTTP + REALITY场景 3:现有系统已经是 gRPC
没有必要因为看到 XHTTP 就立刻全部迁移。
先做:
A/B Test比较:
Latency Throughput Upload Packet Loss CPU RAM Disconnect Rate再迁移。
二十一、VLESS + XHTTP + REALITY 应该怎么理解?
最推荐的理解方式:
VLESS 负责“代理” XHTTP 负责“怎么运输” REALITY 负责“传输安全” H2/H3 负责“HTTP 承载” TCP/QUIC 负责“真正发包”因此:
VLESS + XHTTP + REALITY并不是一个巨大黑盒协议。
它实际上是:
┌─────────────────────┐ │ VLESS │ ├─────────────────────┤ │ XHTTP │ ├─────────────────────┤ │ H2 / H3 │ ├─────────────────────┤ │ REALITY │ ├─────────────────────┤ │ TCP / QUIC │ ├─────────────────────┤ │ IP │ └─────────────────────┘这就是做网络架构时最应该建立的思维方式:
永远分层分析。
二十二、一个简化的 XHTTP 配置
不同 Xray Core 版本、客户端以及管理面板对字段封装可能存在差异。
因此这里重点展示:
XHTTP 的结构而不是鼓励机械复制。
服务端核心部分:
{"inbounds":[{"listen":"0.0.0.0","port":443,"protocol":"vless","settings":{"clients":[{"id":"YOUR-UUID"}],"decryption":"none"},"streamSettings":{"network":"xhttp","security":"reality","xhttpSettings":{"path":"/api/v1/assets","mode":"auto"},"realitySettings":{"target":"TARGET.example:443","serverNames":["TARGET.example"],"privateKey":"YOUR_PRIVATE_KEY","shortIds":["YOUR_SHORT_ID"]}}}]}客户端概念配置:
{"outbounds":[{"protocol":"vless","settings":{"vnext":[{"address":"SERVER_IP","port":443,"users":[{"id":"YOUR-UUID","encryption":"none"}]}]},"streamSettings":{"network":"xhttp","security":"reality","xhttpSettings":{"path":"/api/v1/assets","mode":"auto"},"realitySettings":{"serverName":"TARGET.example","fingerprint":"chrome","password":"SERVER_X25519_PUBLIC_KEY","shortId":"YOUR_SHORT_ID"}}}]}一个重要版本提示
你会在不同版本文档、代码与客户端封装里看到传输字段写法存在差异。当前 Xray Core 源码配置结构仍可见:
"network":"xhttp"而新的官方文档页面也展示了:
"method":"xhttp"因此,不要只凭博客里的字段名判断你的客户端一定支持哪一种写法,应以实际 Core 版本的配置 schema 为准。
REALITY 客户端认证字段也经历过命名调整:当前官方文档使用password保存服务端 X25519 公钥对应的客户端认证材料;旧资料中常见的publicKey已被重命名。
因此生产环境不要从旧博客直接复制完整 JSON。
正确流程:
确认 Xray Core 版本 ↓ 查看该版本官方配置 Schema ↓ 确认客户端 Core 版本 ↓ 生成密钥/UUID ↓ 先做最小配置 ↓ 运行 xray run -test ↓ 再上线二十三、配置检查
Xray 配置修改完成后,建议先执行配置测试。
例如:
xray run-test-config/usr/local/etc/xray/config.json如果 Core 或安装路径不同,请按实际路径执行。
不要直接:
systemctl restart xray然后才去看:
为什么服务挂了正确步骤:
xray run-test-config/usr/local/etc/xray/config.json systemctl restart xray systemctl status xray journalctl-uxray-n100--no-pager二十四、怎么判断实际跑的是 H2 还是 H3?
最可靠的方法不是看:
我配置里写了什么而是看实际连接。
Linux:
ss-ntp如果是 TCP 443:
TCP通常意味着:
H1/H2如果看到:
ss-nup存在 UDP 443:
UDP则可能涉及:
QUIC / H3还可以结合:
tcpdump例如:
tcpdump-ieth0 port443观察:
TCP 443还是:
UDP 443二十五、不要把“协议先进”直接等价成“速度更快”
一个非常典型的错误:
HTTP/3 比 HTTP/2 新 ↓ 所以一定快真实情况是:
Speed = RTT + Packet Loss + Congestion Control + ISP QoS + CDN + CPU + Route + MTU + NAT + Server Load + Client Implementation例如在一个:
0.1% 丢包 20ms RTT 高质量 TCP环境里,H2 完全可能表现很好。
而在:
移动网络 频繁切换 一定丢包环境里,QUIC/H3 可能更有优势。
所以真正正确的方法是:
Benchmark而不是:
看协议名字判断性能二十六、推荐的测试指标
测试 XHTTP 至少应该记录:
| 指标 | 意义 |
|---|---|
| TCP/QUIC Connect Time | 建连 |
| TLS/REALITY Handshake | 安全层握手 |
| TTFB | 首字节 |
| RTT | 基础延迟 |
| Download Mbps | 下载 |
| Upload Mbps | 上传 |
| P95 Latency | 尾延迟 |
| Packet Loss | 丢包 |
| CPU | Core 开销 |
| RAM | 内存 |
| Reconnect Count | 重连次数 |
| Long Connection Stability | 长连接稳定性 |
测试时间最好至少包括:
10 秒 60 秒 5 分钟 30 分钟因为:
Speedtest 跑 10 秒很快不代表:
连续看视频 2 小时稳定二十七、生产环境不要一上来就堆参数
很多配置教程喜欢这样:
{"xPaddingBytes":"...","scMaxEachPostBytes":"...","scMinPostsIntervalMs":"...","scMaxBufferedPosts":"...","scStreamUpServerSecs":"...","xmux":{"...":"..."}}看起来很专业。
但工程上最危险的就是:
不知道参数解决什么问题,却把所有参数全部写上。
正确方法:
第一步
{"path":"/your-path","mode":"auto"}跑通。
第二步
记录:
延迟 上传 下载 掉线 日志 CPU 内存第三步
只有出现明确问题才修改对应参数。
例如:
上传差 → 研究 packet-up / stream-up H3 → 检查 UDP / QUIC CDN 请求体限制 → 调整每个 POST 大小 长连接问题 → 查看 XMUX / Keepalive 需要不同回程 → downloadSettings这才是工程化调优。
二十八、我更推荐哪种模式?
如果目标是:
生产稳定 + 配置可维护 + PC / Android / iOS 多端建议第一阶段从:
VLESS + XHTTP + REALITY + mode = auto开始。
如果确认:
直连 + 无需上下行分离 + stream-one 稳定可以单独测试:
stream-one如果:
持续上传较多 + 需要上下行独立重点测试:
stream-up如果:
CDN / 中间层兼容优先 + 需要 H3 + 上传不是主要瓶颈重点测试:
packet-up二十九、最终架构建议
一个比较清晰的生产思路是:
┌──────────────────┐ │ User App │ └────────┬─────────┘ │ SOCKS/TUN │ ┌────────▼─────────┐ │ Xray Client │ │ VLESS │ └────────┬─────────┘ │ XHTTP │ ┌────────▼─────────┐ │ H2 / H3 │ │ REALITY / TLS │ └────────┬─────────┘ │ Internet │ ┌────────▼─────────┐ │ Xray Server │ │ VLESS + XHTTP │ └────────┬─────────┘ │ Freedom │ ┌────────▼─────────┐ │ Destination │ └──────────────────┘如果后续需要:
CDN则演进:
Client ↓ XHTTP H2/H3 ↓ CDN ↓ Reverse Proxy ↓ Xray如果需要:
上下行优化再升级:
Upload Client → Route A → Xray Download Client ← Route B ← Xray不要一开始直接使用最复杂架构。
三十、总结:只记住这 10 句话
- HTTP 是标准 Web 协议,XHTTP 是 Xray Transport Method。
- XHTTP 和 HTTP/2 不在同一个抽象层。
- VLESS 是代理协议。
- REALITY/TLS 是传输安全层。
- XHTTP 可以利用 H1/H2/H3。
- packet-up = 分包上行 + 流式下行。
- stream-up = 流式上行 + 独立流式下行。
- stream-one = 一个 Request/Response 双向流。
- packet-up 与 stream-up 可以支持上下行分离。
- 生产环境优先从最小配置 + auto + 实测开始,而不是堆参数。
最终,可以把它记成一句非常形象的话:
HTTP 是公路。 VLESS 是货物规则。 XHTTP 是运输系统。 HTTP/2、HTTP/3 是不同规格的高速公路。 REALITY/TLS 是运输过程的安全保护。 TCP/QUIC 才是真正负责把数据从 A 送到 B 的底层交通工具。当你真正建立这个分层模型以后:
VLESS XHTTP REALITY Vision H2 H3 QUIC XMUX这些名词就不会再混在一起了。
参考资料
本文技术机制主要依据:
- Project X / Xray 官方 Transport Configuration;
- Project X / Xray 官方 REALITY 文档;
- Project X / Xray 官方 gRPC Transport 文档;
- XTLS/Xray-core 官方 XHTTP: Beyond REALITY Discussion #4113;
- Xray-core 当前 XHTTP / SplitHTTP 配置实现。
Xray Core 仍在持续演进,字段名、默认值和客户端封装可能变化。生产部署请优先核对当前 Core 版本的官方文档与配置检查结果。