为什么当前的websocket客户端实现不支持代理?

时间:2010-02-04 16:30:15

标签: websocket

  

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

6 个答案:

答案 0 :(得分:43)

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

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

如果未加密的WebSocket流量通过显式或透明的代理服务器流向WebSocket服务器,那么,无论代理服务器是否表现如此,该连接几乎肯定会在今天失败(将来,代理服务器可能会成为Web Socket感知的)。因此,未加密的WebSocket连接只能在最简单的拓扑中使用。

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

实现这一目标的一种方法是下载并安装Kaazing WebSocket Gateway - 一个高度优化的代理感知WebSocket网关,它提供本机WebSocket支持以及旧浏览器标准的完整仿真。 / p>

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

关于websocket客户端和透明代理, 我认为websocket客户端连接在大多数情况下会因以下原因而失败(未经测试):

  • 如果连接处于清除状态,由于客户端不知道它正在与http代理服务器通信,因此它不会发送将“http代理”转换为tcp代理的“CONNECT TO”指令(需要对于websocket握手后的客户端)。如果代理支持本机websocket并使用ws方案处理URL与http不同,它可以工作。

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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