我偶然发现了stackoverflow question&然后通过那个问题到this article。
根据我的理解,加密/未加密的websocket连接都依赖于通过正确的标头发送的代理服务器。
关于未加密的websocket连接的文章
如果未加密的WebSocket流量在通往WebSocket服务器的途中流经透明代理,则实际上连接可能会失败,因为浏览器在这种情况下不会发出CONNECT方法。当代理服务器将请求转发给>(WebSocket)服务器时,它应该剥离某些标头,包括Connection>标头。因此,性能良好的透明代理服务器将导致WebSocket> upgrade>握手几乎立即失败。 并非所有代理服务器都符合关于预期代理行为的HTTP标准。例如,某些代理服务器配置为不删除Connection:Upgrade标头并将其传递给WebSocket服务器,后者又发送101 Web套接字协议握手响应。当客户端或服务器开始发送第一个WebSocket帧时,就会出现问题。由于该帧与代理服务器可能没有的任何内容(例如常规HTTP流量)相似,因此可能会发生一些异常,除非代理服务器专门配置为处理WebSocket流量。
在加密的Web套接字连接上
对于透明代理服务器,浏览器不知道代理服务器,因此不会发送HTTP CONNECT方法。但是,由于线路流量是加密的,因此中间透明代理服务器可能只允许加密流量通过,因此如果使用Web套接字安全,则WebSocket连接成功的可能性要大得多。
如果未加密的连接预计会失败&加密连接只有更好的成功机会,它甚至如何工作?!!
我很可能把这件事弄错了,但很想知道这是如何运作的。
答案 0 :(得分:2)
在加密连接中,代理不会看到HTTP内容,因此他们只是传递消息。但是在非加密连接中,代理可以检查和更改(在某些情况下)HTTP消息(例如标题),因此在某些情况下,他们需要支持WebSockets,因为WebSocket消息看起来不像HTTP-消息(例如没有HTTP标头)。
答案 1 :(得分:0)
值得注意的是,您所指的文章是由为某家公司工作的人编写的,该公司生产的产品旨在解决这些问题。因此,作者可能会有动机夸大问题的严重程度。
例如,作者说:
[透明代理]应该剥离某些标头,包括Connection标头
事实并非如此。根据RFC2616:
A"透明代理"是不修改请求的代理或 超出代理身份验证所需的响应 识别
当然,许多代理都不遵循RFC的要求,因此使用加密连接仍然是一个好主意。
TLS加密专门用于防止中间服务器干扰您的流量。如果中间代理服务器导致安全WebSockets连接出现问题,那么您可能会遇到更大的问题,因为它还可能会干扰其他安全流量,例如您与网上银行之间的连接。