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

z80*_*000 27 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

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

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

  • OOPS!我查看了维基百科文章的版本历史,发现你是那些提供这些段落的人.我好尴尬.我很抱歉.:-(我正在回滚我的编辑.(我在这里,因为没有引用你自己的作品而鞭打你,哈哈) (18认同)
  • 对不起,我误解了你的问题 - 你是对的,那些客户不支持代理. (2认同)

z80*_*000 2

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