gpt4 book ai didi

java - HTTP 代理连接共享

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:20:59 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion.

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

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

关于java - HTTP 代理连接共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1255299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com