眼熟吗?通过企业或云代理发送 REST 请求时一切正常,但一旦打开 WebSocket 或调用 gRPC 方法,连接要么根本无法建立,要么存活三十秒后悄然断开。同时,在浏览器或应用日志中,你会看到神秘的 101、502、504,或者突然的 connection reset。这不是玄学,也不是因果报应。这是代理处理短请求-响应事务的方式与它应对长生命周期双向流的方式之间存在根本性差异。

这篇文章是一份详尽的指南,讲解基于 TCP 的协议如何经过代理:WebSocket、gRPC,以及所有需要协议升级或端到端隧道的场景。我们会逐字节拆解其机制,展示通过 HTTP 代理使用 ws:// 与通过 CONNECT 方法使用 wss:// 的区别,解释为什么 SOCKS5 往往更简单,如何处理基于 HTTP/2 的 gRPC,如何对抗空闲超时——最重要的是,当一切都不工作时,如何调试。文末附有 Python 和 Node 的可用代码、检查清单和 FAQ。

先说明一下范围:我们在这里有意不涉及 SOCKS5 中的 UDP ASSOCIATE 机制——那是关于数据报的另一大话题,有单独的文章专门讲解。这里我们只专注于基于 HTTP 和 SOCKS 的 TCP 协议。