我在Python中创建了一个websockets服务器(基于此要点),可在本地主机中工作,但不能在生产服务器中工作。
例如,在localhost中,我有以下握手消息:
//Message from webbrowser client
GET / HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: 127.0.0.1:8080
Origin: null
Sec-WebSocket-Key1: ]2 415 401 032v
Sec-WebSocket-Key2: 2y7 9Y2o 80049 5
Cookie: (...)
t��t`��
//Response of server
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: null
WebSocket-Location: ws://127.0.0.1:8080/
Sec-Websocket-Origin: null
Sec-Websocket-Location: ws://127.0.0.1:8080/
�@2�J��3@5��ƶ
当我在生产环境中运行相同的webssocket服务器时,连接失败。在Chrome的控制台我得到以下错误:" WebSocket握手期间错误:'连接'头值不是'升级'" -但在握手的消息服务器和客户端之间的连接(从服务器)有正确的值:
//Message from webbrowser client
GET / HTTP/1.0
Host: myserver.com
X-Forwarded-Host: myserver.com
X-Forwarded-Server: myserver.com
X-Forwarded-For: 189.6.133.224
Connection: close
Upgrade: WebSocket
Origin: http://myserver.com
Sec-WebSocket-Key1: 2 1)Gz 11919la 978
Sec-WebSocket-Key2: c94Q6b9^ef#`6 2v {652
Cookie: (...)
//Response of server
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://myserver.com
WebSocket-Location: ws://myserver.com/websocket/server
Sec-Websocket-Origin: http://myserver.com
Sec-Websocket-Location: ws://myserver.com/websocket/server
yz�~�r}��+�4J
在生产中,我在客户端的消息中得到了一些陌生人的值:
- 消息末尾的疯狂代码在哪里?
- 'Connection'报头的值是'close'?!
有人知道为什么我得到这个错误,为什么客户端握手有这些值吗?
- 消息末尾的疯狂代码是什么?
客户端握手结束时的8个原始字节本质上是第三个键值。服务器发回的16个原始字节是由客户端握手中的3个键值生成的摘要。这就是当前Hixie-76版本协议中摘要的工作方式。在新的IETF/HyBi协议版本中(即将在浏览器中发布),摘要机制不再使用特殊的原始字节。
- 为什么'Connection'头的值设置为'close'?
在我看来,好像有一个中介(即web代理或透明代理)在客户端到达服务器之前修改握手。不仅Connection头错误,而且客户端握手也缺少第三个键值。事实上,HyBi版本的协议使用不同的摘要机制的原因之一是为了与中介更兼容。
<<p> 建议/em>:如果您的客户端和服务器在同一网络上,并且您在Chrome中有代理设置,请尝试暂时禁用代理,看看是否有效。
如果客户端和服务器不在同一网络上,并且您控制同一网络上的两台机器,那么尝试在一台机器上运行客户端,在另一台机器上运行服务器(并且仍然确保您在Chrome中没有代理设置)。这应该可以消除透明代理/中介干扰握手的可能性。
如果您确定Chrome有问题,而不是中介,您可以在连接时在客户端上运行wireshark进行检查,您可以检查实际数据包。