Websockets握手问题

时间:2011-07-20 22:34:04

标签: python html5 websocket

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

例如,在localhost中,我有以下Handshake的消息:

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

有人知道我为什么会收到此错误以及为什么客户端握手会有这些值?

1 个答案:

答案 0 :(得分:3)

  • 邮件末尾的疯狂代码是什么?

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

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

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

建议

如果您的客户端和服务器位于同一网络上且Chrome中有代理设置,请尝试暂时禁用代理,看看是否有效。

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

如果您确定Chrome有问题,而不是中间人,则可以在建立连接时通过在客户端上运行wireshark来检查是否确定,并且可以检查实际的数据包。如果Chrome确实正在发送完全握手,那么您的配置可能会触发Chrome错误。