Skip to content

refactor: verify client CONNECT state machine and error propagation with standard RFC 9110 server #4

Description

@ssharkkky

背景与根因关联

在与 forwardproxy 配套使用时,客户端在访问双栈目标(如 CDN 托管站点、模型 API 等)时,偶发遭遇上层连接超时(如 10 秒卡死)或 ECONNRESET

经排查,该问题为原版 Naive 架构在客户端与服务端之间的时序协同缺陷:

  1. 服务端提前回送 200 OK(Fast Open)与客户端握手时序冲突
    • 客户端在 src/net/quic/quic_proxy_client_socket.cc 中处理 CONNECT 响应;
    • 原版设计中客户端收到提前 200 OK 即向应用层声明连接完成,应用层立即发出 TLS ClientHello
    • 但此时服务端可能正处于目标多 IP 的串行阻塞拨号中,一旦出现单栈卡死或最终失败,客户端只能在被动超时或连接重置之间摇摆。

协同修复与适配规划

配合服务端 forwardproxy 纠正 RFC 9110 / RFC 8305 规范时序,客户端侧需完成以下适配与验证:

1. 客户端 CONNECT 状态机与错误处理审查

  • 审查 src/net/quic/quic_proxy_client_socket.cc 中关于 use_fastopen_read_headers_pending_ 以及 STATE_READ_REPLY_COMPLETE 的状态流转;
  • 确保当服务端调整为“真实目标建连成功后再返回 200 OK”的标准时序时,客户端无死锁、无时序竞争,状态机平滑进入 STATE_CONNECT_COMPLETE
  • 验证当目标不可达、服务端按标准返回 502/504 响应码时,客户端能合规地将网络错误映射回上层应用,使上层应用能及时感知并进行正确的退避重试,而非挂死在 TLS 握手阶段。

2. 回归与端到端验证

  • 跑通客户端所有现存的单元测试与回归套件;
  • 在真实多 IP 双栈网络环境下发起高并发新建连接压力测试,验证 10s 超时与非预期 RST 彻底消除。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions