HTTP代理连接共享

时间:2009-08-10 14:40:03

标签: java http networking proxy tunneling

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

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

  1. 除了客户端和代理之间的连接之外,HTTP管道传输可能不受支持。即代理可以发送单个请求并在发送下一个请求之前等待响应,即使客户端已向代理发送了多个流水线请求。
  2. 分块编码可能不会以类似的方式超出代理之间的连接:服务器可以以块的形式发回响应,但是代理可以在将完整的,去块的响应分派给客户端之前等待结束块。
  3. HTTP CONNECT通常只允许用于SSL / TLS端口,通常只允许端口443,因此不能将其用作获取与外界无限制的TCP连接的偷偷摸摸的方式。
  4. 但是还有一种可能性我不确定:真实世界的HTTP代理是否也在多个客户端之间共享与服务器的持久连接?例如:

    • 客户端A将请求A1,A2和A3发送到服务器X
    • 客户端B将请求B1和B2发送到服务器X
    • 客户端C将请求C1,C2和C3发送到服务器X

    然后代理可能会打开到服务器X的单个连接并按顺序发送消息:

    A1,A2,B1,C1,B2,A3,C2,C3

    或类似的订单,保留每个客户端的排序,但可能是交错的?或者更糟糕的是,代理可以打开与服务器的多个连接,并在连接之间分散来自每个客户端的消息,即

    Connection 1: A1, C1, C2, C3
    Connection 2: B1, B2, A2, A3
    

    如果是这样,我的方法需要更多思考,因为我可能需要将这些消息解复用到每个隧道的不同队列中,并且不能简单地依赖于将连接识别为用于特定客户端。

    有没有人知道描述常用HTTP代理和状态检查防火墙的怪癖的任何好资源?

2 个答案:

答案 0 :(得分:1)

HTTP 1.1 spec包含此段落为 8.1.4实际考虑因素

  

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

我不知道现实世界的代理实现是如何处理这个要求的。

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

答案 1 :(得分:0)

我知道NetScaler可以配置为在它和服务器之间使用keepalive,无论客户端上的keepalive设置如何。