更新时间 2025-08-07 适用场景:在 WebSocket/WSS 信道中高效传输 HTTP Request / Response(含大文件分片)
| 编号 | 痛点 | 描述 |
|---|---|---|
| P1 | 私网 / 局域网 Agent 无公网 HTTP 入口 | 外部无法直接调用,能力孤岛化 |
| P2 | HTTP 报文元素多且不定长 | 需一次性封装 method / path / headers / query / body 并保持顺序与完整性 |
| P3 | NAT / 防火墙穿透复杂 | 传统端口映射或 VPN 成本高;WebSocket 可用单出站端口直连 |
| P4 | 大文件 & 流式内容 | 需要分片传输,边收边处理,且保证顺序和完整性 |
| P5 | 多语言 / 多框架异构 | 希望协议层统一,前后端任意技术栈均可解析 |
| P6 | 数据完整性 & 调试友好 | 必须提供端到端校验 (HeaderCRC / BodyCRC) 且抓包易读 |
| P7 | 长期扩展与兼容 | 新增字段不破坏旧实现,可平滑演进 |
ANPX 通过“固定 24 B 头 + 可扩展 TLV”设计,将任意 HTTP 请求/响应安全隧道化至 WebSocket/WSS,支持 GB 级文件分片与跨语言互操作。
| 关键词 | 说明 |
|---|---|
| HTTP Req | Type 0x01:HTTP 请求帧 |
| HTTP Resp | Type 0x02:HTTP 响应帧 |
| Error | Type 0xFF:错误帧 |
| http_meta | Tag 0x02:将 method / path / headers / query 打包为 JSON |
| http_body | Tag 0x03:HTTP 原始 Body(二进制) |
| resp_meta | Tag 0x04:将 status / reason 打包为 JSON |
┌──────────── 固定 24 B Header ────────────┐┌──── 可变长 TLV Body ────┐
│ Magic(4) │Ver(1)│Type(1)│Flag(1)│Res(1)││ TLV #1 │ TLV #2 │ ... │
│ TotalLen(4) │ HeaderCRC(4) │ BodyCRC(4) │└─────────────────────────┘
└──────────────────────────────────────────┘
| 偏移 | 字段 | 长度 | 描述 |
|---|---|---|---|
| 0 | Magic | 4 B | ASCII "ANPX" |
| 4 | Ver | 1 B | 协议版本,当前 0x01 |
| 5 | Type | 1 B | 0x01=HTTP Req 0x02=HTTP Resp 0xFF=Error |
| 6 | Flag | 1 B | bit 0 = 1 ⇒ 分片帧;其余位恒 0 |
| 7 | Resv | 1 B | 预留 0x00 |
| 8 | TotalLen | 4 B | Header + Body 总长度(大端) |
| 12 | HeaderCRC | 4 B | CRC-32(字节 0 ~ 11) |
| 16 | BodyCRC | 4 B | CRC-32(完整 Body;分片时对 重组后的整体 计算) |
| 20 | — | — | Header 固定 24 B |
┌ Tag(1) ┬ Len(4,BE) ┬ Value(变长) ┐
| Tag | Req 用途 | Resp 用途 | Value 类型 | 说明 |
|---|---|---|---|---|
| 0x01 | request_id | request_id | UTF-8 | UUID-v4 |
| 0x02 | http_meta | — | JSON | 方法、路径、头、查询 |
| 0x03 | http_body | http_body | Binary | 原始字节 |
| 0x04 | — | resp_meta | JSON | 状态码 & 原因 |
| 0x0A | chunk_idx | chunk_idx | UInt32 | 分片序号 (0-based) |
| 0x0B | chunk_tot | chunk_tot | UInt32 | 总片数(可选) |
| 0x0C | final_chunk | final_chunk | UInt8 | 0x01=最后一片 |
| 0xF0-0xFF | 预留 | 预留 | — | 用户扩展区 |
未知 Tag → 直接跳过
1 + 4 + Len,保证向前兼容。
{
"method": "POST",
"path": "/api/v1/run",
"headers": { "content-type": "application/json" },
"query": { "q": "test" }
}{
"status": 200,
"reason": "OK"
}-
组装 TLV
- 必带:
0x01 request_id - HTTP Req 需
0x02 http_meta+0x03 http_body - HTTP Resp 需
0x03 http_body+0x04 resp_meta - 分片帧再加
0x0A / 0x0B / 0x0C
- 必带:
-
Flag.bit0= 1 ⇔ 分片帧 -
计算
BodyCRC,填写 Header 全字段 -
Header + Body 拼接发送
-
读 24 B Header → 校验 Magic & HeaderCRC
-
读取 Body (TotalLen-24) → 校验 BodyCRC
-
逐 TLV 解析;未知 Tag 跳过
-
若
Flag.bit0==1→ 分片重组:- 以
request_id为键累积分片 - 完成条件:已收齐
chunk_tot片 或 收到final_chunk=1 - 重组后校验整体 CRC,再交上层处理
- 以
| Tag | Value |
|---|---|
| 0x01 | "550e8400-e29b-41d4-a716-446655440000" |
| 0x02 | {"method":"POST","path":"/api/v1/run","headers":{"content-type":"application/json"},"query":{"q":"test"}} |
| 0x03 | { "foo": "bar" } |
| 片序 | 关键 TLV |
|---|---|
| 0 | 0x01 rid, 0x0A idx=0, 0x03 body_part |
| 1 | 0x01 rid, 0x0A idx=1, 0x03 body_part |
| 2 | 0x01 rid, 0x0A idx=2, 0x03 body_part, 0x0C final_chunk=1, 0x04 {"status":200,"reason":"OK"} |
41 4E 50 58 01 01 00 00 ← Magic "ANPX", Ver, Type=0x01, Flag=0x00
00 00 00 F0 ← TotalLen (240 B)
12 34 56 78 ← HeaderCRC
9A BC DE F0 ← BodyCRC
… TLV 序列 …
- 固定 24 B 头 → 零拷贝、抓包易读
- TLV 可扩展 → 新字段无痛升级
- 分片流 → 轻松搬运 GB 级文件
- CRC 双层校验 → 端到端完整性保障
如需 多语言 SDK、解析脚本或参考代码,留言即可!