协议支持

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)。
  • 规则可以 MockWebSocketMessageDropWebSocketMessage
  • 脚本 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 形式被记录但事件边界不会被单独标注。