CONNECT 并不承诺隧道可以无限期保持打开。一次成功交换之后,连接会把持续的字节流送往所请求的主机和端口。只要参与方和网络让它保持打开,它就能在一条目标 TLS 会话内承载多次交换。

两种代理限制的行为并不相同:流量可以让 idle 计时器不超时,但无法延长 absolute 生存期限。目标协议也有发言权。内层 HTTP 客户端可以关闭自己的连接;WebSocket 应用可以结束自己的会话。此后代理无法让那个目标会话继续存活。

隧道与它的目标绑定。一旦隧道字节开始流动,连接就不再是普通的 HTTP 请求通道,不能在其上为无关目标再发一个 CONNECT。客户端需要另一条连接,或由它的库管理的另一条隧道。

对于持续的数据流,请使用客户端支持的保活与连接机制来规划重连。如果它在静默之后关闭,不活动策略是有用的线索;如果它在有流量的情况下仍于固定时长后关闭,则应排查绝对限制。对于 WebSocket 数据流,还要在重连之后恢复应用状态。

相关文章