1

我正在尝试使用与 Web 浏览器所采用的技术类似的技术来实现 HTTP 隧道,以使用 Netty 框架在 Java 中模拟全双工连接。我希望以这样的方式实现它,它可以在现实世界的 HTTP 代理存在的情况下工作。我试图在不使用 servlet 容器的情况下执行此操作,以避免在库依赖方面产生不必要的开销,并且因为 servlet API 不适合全双工 http 隧道的使用模式。

我知道 HTTP 代理施加的一些限制“破坏”了 HTTP 协议的一些潜在用途:

  1. 在客户端和代理之间的连接之外,可能无法使用 HTTP 管道。即代理可以发送一个请求并在发送下一个请求之前等待响应,即使客户端已经向代理发送了多个流水线请求。
  2. 分块编码可能不会以类似的方式在代理之间的连接之外得到尊重:服务器可能会以块的形式发回响应,但代理可能会在将完整的、去块的响应分派给客户端之前等待结束块。
  3. 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 代理和状态检查防火墙的怪癖的好资源?

4

2 回答 2

1

HTTP 1.1 规范包含这一段作为8.1.4 实际考虑

使用持久连接的客户端应该限制他们维护到给定服务器的同时连接的数量。单用户客户端不应与任何服务器或代理保持超过 2 个连接。一个代理应该使用最多 2*N 个连接到另一个服务器或代理,其中 N 是同时活跃的用户数。这些指南旨在改善 HTTP 响应时间并避免拥塞。

不过,我不知道现实世界的代理实现对这个要求做了什么。

也许你会在缓存教程中找到一些东西,即使它只是有用的链接。最终的行动可能是向 Mark Nottingham (mnot@pobox.com) 发送邮件。如果他不知道,没人知道。

于 2009-08-10T14:53:52.000 回答
0

I do know that NetScaler can be configured to use keepalive between it and the server, regardless of the keepalive setting on the client.

于 2009-08-11T02:28:56.373 回答