【问题标题】:HTTP proxy connection sharingHTTP 代理连接共享
【发布时间】:2010-11-18 07:47:13
【问题描述】:

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

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

  1. HTTP Pipelining 可能不会在客户端和代理之间的连接之外得到遵守。即代理可能会发送一个请求并在发送下一个请求之前等待响应,即使客户端已经向代理发送了多个流水线请求。
  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 代理和状态检查防火墙的怪癖的好资源?

【问题讨论】:

    标签: java http networking proxy tunneling


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      不过,我不知道现实世界中的代理实现如何处理此要求。

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

      【讨论】:

        猜你喜欢
        • 2015-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多