我正在尝试使用与 Web 浏览器所采用的技术类似的技术来实现 HTTP 隧道,以使用 Netty 框架在 Java 中模拟全双工连接。我希望以这样的方式实现它,它可以在现实世界的 HTTP 代理存在的情况下工作。我试图在不使用 servlet 容器的情况下执行此操作,以避免在库依赖方面产生不必要的开销,并且因为 servlet API 不适合全双工 http 隧道的使用模式。
我知道 HTTP 代理施加的一些限制“破坏”了 HTTP 协议的一些潜在用途:
- 在客户端和代理之间的连接之外,可能无法使用 HTTP 管道。即代理可以发送一个请求并在发送下一个请求之前等待响应,即使客户端已经向代理发送了多个流水线请求。
- 分块编码可能不会以类似的方式在代理之间的连接之外得到尊重:服务器可能会以块的形式发回响应,但代理可能会在将完整的、去块的响应分派给客户端之前等待结束块。
- HTTP CONNECT 通常只允许用于 SSL/TLS 端口,通常只允许端口 443,因此这不能用作一种偷偷摸摸的方式来获得与外界的不受限制的 TCP 连接。
但是,我不确定还有另一种可能性:现实世界的 HTTP 代理是否也在多个客户端之间共享到服务器的持久连接?例如:
- 客户端 A 向服务器 X 发送请求 A1、A2 和 A3
- 客户端 B 向服务器 X 发送请求 B1 和 B2
- 客户端 C 向服务器 X 发送请求 C1、C2 和 C3
然后代理是否可能会打开到服务器 X 的单个连接并按以下顺序发送消息:
A1、A2、B1、C1、B2、A3、C2、C3
还是保留每个客户的订单但可能交错的类似订单?或者更糟糕的是,代理是否可以打开到服务器的多个连接并在连接之间分散来自每个客户端的消息,即
Connection 1: A1, C1, C2, C3
Connection 2: B1, B2, A2, A3
如果是这样,我的方法需要更多考虑,因为我可能需要将这些消息多路分解到每个隧道的不同队列中,并且不能简单地依赖于将连接识别为用于特定客户端。
有谁知道任何描述常用 HTTP 代理和状态检查防火墙的怪癖的好资源?