协议支持
RelayCore 是 L7 代理,关注应用层协议的解析、检查与改写。底层传输一律走 TCP(HTTP/HTTPS/WebSocket),UDP 目前仅透明代理场景支持。
HTTP/1.1
完整支持。请求/响应头、chunked 编码、Transfer-Encoding、双向 keep-alive、流式 body 都可以被解析。规则与脚本可以无差别作用于头与体。
HTTP/2
完整支持。客户端 ↔ RelayCore 走 HTTP/1.1 或 HTTP/2 都行(取决于客户端能力与 ALPN 协商结果);RelayCore ↔ 上游使用相同的协议版本。Header compression (HPACK) 在 RelayCore 内部完全展开,规则处理的是已解码的伪头(:method、:path、:scheme、:authority)。
HTTPS / TLS
对所有 HTTP-over-TLS 流量做 MITM 拦截,依赖动态签发的证书(见 证书与 HTTPS 拦截)。上游默认校验证书;可在 replay 场景中临时关闭(仅 POST /api/v1/flows/:id/replay?accept_invalid_certs=true,调试用)。
WebSocket
完整支持。基于 RFC 6455。RelayCore 解析握手、注册 Layer::WebSocket 流量、对每条消息提供消息级检查与改写:
- 每条消息记录
direction(incoming / outgoing)、opcode(text / binary / ping / pong / close / continuation)、content(含 encoding、size、base64 body)。 - 规则可以
MockWebSocketMessage、DropWebSocketMessage。 - 脚本 hook
onWebSocketMessage可读改每条消息。 - TUI 的 Messages 详情页实时显示消息日志。
- 大消息可能触发
ws-message-budget-exceeded,避免无界内存占用。
QUIC / HTTP/3
QUIC 是 UDP 之上的传输层协议,现代浏览器会优先尝试。RelayCore 通过 ProxyPolicy.quic_mode 控制其行为:
| 模式 | 说明 |
|---|---|
Downgrade(默认) | 下发 Alt-Svc 清除响应 + Clear-Site-Data,强制客户端回退到 HTTP/2 或 HTTP/1.1。可设置 quic_downgrade_clear_cache=true 强制清缓存。 |
Passthrough | 不做任何处理,QUIC 流量原样转发(不可见、不可改)。 |
ExperimentalMitm | 实验性 HTTP/3 MITM。需要 quic_mitm_experimental feature flag,且尚未生产可用。 |
QUIC 模式下没有可观察的 Flow 记录(Downgrade 除外,下发 Alt-Svc 的请求会被记为 has_error=false 的正常流)。
TCP / UDP(透明代理场景)
RelayCore 不解析 TCP 原始字节,只解析 HTTP/WebSocket 等应用层协议。透明代理模式下:
- TCP 流量:被重定向到代理端口后,RelayCore 尝试按 HTTP/1.1 解析;如果客户端发的不是 HTTP(例如裸 TCP),会被代理拒绝并记录 error。
- UDP 流量:通过
--udp-tproxy-port(仅 Linux,需要IP_TRANSPARENT)支持 UDP 透明代理,但仅做转发,不解析。
不支持的协议
- 原始 TCP 上的自定义协议(非 HTTP):RelayCore 不解析;透明代理场景下会让连接失败。
- gRPC over HTTP/2:HTTP/2 层透明,但 gRPC 的 protobuf payload RelayCore 不会解析——可以用脚本读 body 当作字节处理。
- SSE(Server-Sent Events):HTTP/1.1 长连接,RelayCore 在
GET /api/v1/events端点上自用,外部站点 SSE 流量以 HTTP 形式被记录但事件边界不会被单独标注。