28

Web Socket 检测到代理服务器的存在并自动设置隧道以通过代理。通过向代理服务器发出 HTTP CONNECT 语句来建立隧道,该语句请求代理服务器打开到特定主机和端口的 TCP/IP 连接。一旦建立了隧道,通信就可以畅通无阻地通过代理。由于 HTTP/S 以类似的方式工作,因此 SSL 上的安全 Web 套接字可以利用相同的 HTTP CONNECT 技术。[1]

好的,听起来很有用!但是,在我迄今为止看到的客户端实现中(Go [2]、Java [3])我没有看到任何与代理检测相关的内容。

我错过了什么还是这些实现还很年轻?我知道 WebSockets 是非常新的,客户端实现可能同样年轻和不成熟。我只想知道我是否遗漏了有关代理检测和处理的内容。

[1] http://www.kaazing.org/confluence/display/KAAZING/What+is+an+HTML+5+WebSocket

[2] http://golang.org/src/pkg/websocket/client.go

[3] http://github.com/adamac/Java-WebSocket-client/raw/master/src/com/sixfire/websocket/WebSocket.java

4

6 回答 6

44

让我试着解释一下您可能遇到的不同成功率。虽然 HTML5 Web Socket 协议本身不知道代理服务器和防火墙,但它具有与 HTTP 兼容的握手功能,因此 HTTP 服务器可以与 Web Sockets 网关或服务器共享其默认的 HTTP 和 HTTPS 端口(80 和 443)。

Web Socket 协议定义了一个 ws:// 和 wss:// 前缀,分别表示一个 WebSocket 和一个 WebSocket 安全连接。两种方案都使用 HTTP 升级机制来升级到 Web Socket 协议。一些代理服务器是无害的,并且可以与 Web Socket 一起正常工作;其他将阻止 Web Sockets 正常工作,导致连接失败。在某些情况下,可能需要额外的代理服务器配置,并且某些代理服务器可能需要升级以支持 Web 套接字。

如果未加密的 WebSocket 流量在到达 WebSocket 服务器的途中流经显式或透明的代理服务器,那么,无论代理服务器是否按照应有的方式运行,今天的连接几乎肯定会失败(将来,代理服务器可能成为 Web Socket 感知)。因此,未加密的 WebSocket 连接应仅用于最简单的拓扑。

如果使用加密的 WebSocket 连接,则在 Web Sockets Secure 连接中使用传输层安全性 (TLS) 可确保在将浏览器配置为使用显式代理服务器时发出 HTTP CONNECT 命令。这会在 Web Sockets Secure 客户端和 WebSocket 服务器之间建立一个隧道,通过 HTTP 代理提供低级别的端到端 TCP 通信。在透明代理服务器的情况下,浏览器不知道代理服务器,因此不会发送 HTTP CONNECT。但是,由于有线流量是加密的,中间透明代理服务器可能会简单地允许加密流量通过,因此如果使用 Web Sockets Secure,WebSocket 连接成功的可能性会大得多。当然,使用加密不是免费的,但通常可以提供最高的成功率。

一种查看实际效果的方法是下载并安装 Kaazing WebSocket 网关——一个高度优化、代理感知的 WebSocket 网关,它提供原生 WebSocket 支持以及对旧浏览器标准的完整模拟。

于 2010-02-18T19:03:25.133 回答
2

答案是这些客户端根本不支持代理。-奥卡姆

于 2010-02-19T04:36:33.357 回答
1

在 WebSocket 协议进入场景时,通信通道已经建立。WebSocket 建立在 TCP 和 HTTP 之上,因此您不必关心这些协议已经完成的事情,包括代理。

当建立 WebSocket 连接时,它总是以 HTTP/TCP 连接开始,稍后在 WebSocket 的“握手”阶段“升级”。此时隧道已建立,因此代理是透明的,无需关心它们。

于 2010-02-04T21:35:53.563 回答
0

关于 websocket 客户端和透明代理,我认为 websocket 客户端连接大部分时间会失败,原因如下(未经测试):

  • 如果连接是明确的,由于客户端不知道它正在与http代理服务器通信,它不会发送将http代理变为tcp代理的“CONNECT TO”指令(客户端需要在websocket之后握手)。如果代理支持本机 websocket 并且使用 ws 方案而不是 http 处理 URL,它可能会工作。

  • 如果连接是 SSL,透明代理无法知道它应该连接到哪个服务器,因为它已经解密了 https 请求中的主机名。它可以通过动态生成自签名证书(如 SSLStrip)或提供自己的静态证书并解密通信,但如果客户端验证服务器证书,它将失败(请参阅https://serverfault.com/questions /369829/setting-up-a-transparent-ssl-proxy)。

于 2013-04-04T02:30:26.063 回答
0

您提到了 Java 代理,作为回应,我想提一下 Java-Websocket 现在支持代理。

您可以在此处查看相关信息:http: //github.com/TooTallNate/Java-WebSocket/issues/88

于 2013-05-10T03:40:23.590 回答
0

websocket-client,一个 Python 包,支持代理,至少在安全的方案wss://,因为在这种情况下代理不需要知道它转发的流量。

https://github.com/liris/websocket-client/commit/9f4cdb9ec982bfedb9270e883adab2e028bbd8e9

于 2014-12-10T10:55:27.913 回答