2011-07-20 68 views
1

我在Python中创建了一个websockets服务器(based in this gist),它在localhost中工作,但不在生产服务器中工作。Websockets握手问题

例如,在本地主机我有以下握手的消息:

//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��[email protected]��ƶ 

当我运行相同webssocket在生产服务器,连接失败。 “WebSocket的握手期间错误:‘连接’标题值不是‘升级’”在Chrome的控制台我得到下面的错误 - 但在握手的服务器和客户端(从服务器)连接具有正确的价值之间的消息:

//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'?!

有人知道为什么我得到这个错误,为什么客户端握手有这些值?

回答

3
  • 什么是疯狂的代码在消息的结尾?

客户端握手结束时的8个原始字节基本上是第三个关键值。服务器发回的16个原始字节是从客户端握手中的3个键值生成的摘要。这是目前Hixie-76版本协议中摘要的工作原理。在协议的新IETF/HyBi版本(即将在浏览器中发布)中,摘要机制不再使用特殊的原始字节。

  • 为什么'Connection'标题的值设置为'close'?

它看起来像我有一个中介(即网络代理或透明代理)在客户端到达服务器之前修改来自客户端的握手。不仅Connection头是错误的,而且客户端握手也缺少第三个键值。事实上,协议的HyBi版本使用不同的摘要机制的原因之一是与中介更加兼容。

建议

如果您的客户端和服务器在同一个网络上,你必须在Chrome浏览器的代理设置,尝试暂时禁用代理,并看看是否能工程。

如果客户端和服务器不在同一个网络上,并且您可以控制同一网络上的两台计算机,则尝试在一台服务器上运行客户端,然后尝试在另一台服务器上运行客户端(并且仍然确保没有代理服务器设置在Chrome中)。这应该消除透明代理/中介与握手搞混的可能性。

如果您确定Chrome出现故障,而不是中介,您可以在建立连接时通过在客户端上运行wireshark来检查确定,并且可以检查实际的数据包。如果Chrome确实发送了确切的握手信息,那么您的配置可能会触发Chrome浏览器错误。