为什么不';当前websocket客户端实现是否支持代理?

为什么不';当前websocket客户端实现是否支持代理?,websocket,Websocket,Web套接字检测代理服务器的存在,并自动设置隧道以通过代理服务器。隧道是通过向代理服务器发出HTTP CONNECT语句建立的,该语句请求代理服务器打开到特定主机和端口的TCP/IP连接。一旦建立了隧道,通信就可以畅通无阻地通过代理进行。由于HTTP/S以类似的方式工作,SSL上的安全Web套接字可以利用相同的HTTP连接技术。[1] 好的,听起来很有用!但是,在迄今为止我所看到的客户机实现(Go[2],Java[3])中,我没有看到任何与代理检测相关的内容 我是缺少了什么,还是这些实现还很年轻

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

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

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

[1]

[2]


[3]

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


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

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

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

如果未加密的WebSocket流量在WebSocket服务器上流经显式或透明代理服务器,那么,无论代理服务器的行为是否正常,今天的连接几乎肯定会失败(将来,代理服务器可能会感知Web套接字)。因此,未加密的WebSocket连接只应在最简单的拓扑中使用

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


一种方法是下载并安装Kaazing WebSocket网关,这是一种高度优化的、具有代理意识的WebSocket网关,它提供本机WebSocket支持以及对旧浏览器标准的完全模拟。

答案是这些客户端根本不支持代理。
-关于websocket客户端和透明代理, 我认为websocket客户端连接在大多数情况下都会失败,原因如下(未测试):

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

  • 如果连接在SSL中,则透明代理无法知道应该连接到哪个服务器,因为它已解密https请求中的主机名。它可以动态生成自签名证书(如SSLStrip),也可以提供自己的静态证书并解密通信,但如果客户端验证服务器证书,它将失败(请参阅)


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


您可以在这里看到相关信息:

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


那么http连接的是什么呢?@z8000 http连接建立了一个http连接。这是一个正常的GET请求,如果服务器支持WebSochet协议,它将在以后升级。WebSocket协议使用HTTP协商连接,并按照您的建议绕过代理。HTTP连接什么?不是什么是HTTP连接?根据Wikipedia:“另一种基于HTTP的隧道方法使用HTTP CONNECT方法/命令。客户端向HTTP代理发出HTTP CONNECT命令。然后代理与特定的服务器:端口建立TCP连接,并在该服务器:端口和客户端连接之间中继数据。”我在WebSocket客户端中没有看到通过HTTP CONN与代理通信的内容