2011-07-20 97 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瀏覽器錯誤。