2015-09-25 95 views
3

描述的不同之處我試圖更多地瞭解websockets協議。根據RFC 6455,該協議的步驟是握手,它與HTTP的升級請求開始:SocketIO websocket握手與RFC 6455

GET /chat HTTP/1.1 
    Host: server.example.com 
    Upgrade: websocket 
    Connection: Upgrade 
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 
    Origin: http://example.com 
    Sec-WebSocket-Protocol: chat, superchat 
    Sec-WebSocket-Version: 13 

到該服務器與HTTP交換協議消息進行響應:

HTTP/1.1 101 Switching Protocols 
    Upgrade: websocket 
    Connection: Upgrade 
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 
    Sec-WebSocket-Protocol: chat 

我試圖使用一個基於socketIO(nodeJS websockets庫)的簡單程序來觀察這個問題,我注意到客戶端發送服務器的第一條消息是:

GET /socket.io/?EIO=3&transport=polling&t=1443149751115-0 HTTP/1.1 
Host: localhost 
Connection: keep-alive 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36   (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 
Origin: null 
Accept: */* 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 
HTTP/1.1 200 OK 
Content-Type: application/octet-stream 
Content-Length: 101 
Access-Control-Allow-Credentials: true 
Access-Control-Allow-Origin: null 
Set-Cookie: io=3Z_TCqv9LKKXcWCjAAAD 
Date: Fri, 25 Sep 2015 02:55:51 GMT 
Connection: keep-alive 

....0{"sid":"3Z_TCqv9LKKXcWCjAAAD","upgrades": ["websocket"],"pingInterval":25000,"pingTimeout":60000} 

是SocketIO不遵循的WebSockets的RFC還是我失去了一些東西:到服務器響應?

回答

5

socket.io有它自己的連接管理的東西,它連接到一個webSocket之前,它允許它協商它實際上將要連接到服務器的連接類型,並允許它發送一些配置選項到客戶端。如果你想學習一個簡單的webSocket,這會讓你感到困惑。

socket.io是webSocket上的一個附加協議。它最終會在下面使用一個標準的webSocket,但它會有更多的東西。如果你繼續關注socket.io連接,你最終會看到一個標準的webSocket連接。

我建議你先從你的客戶端(無socket.io)建立一個簡單的webSocket連接並研究網絡跟蹤。

+0

這些差異是否記錄在任何地方? – SivaDotRender

+0

@SivaDotRender - 它被記錄下來,除了原始實現者自己寫的以外,其他語言中還有很多socket.io實現。我不確定最好的文檔在哪裏,但有一些[這裏](https://github.com/socketio/engine.io-protocol)和[這裏](https://github.com/socketio/) socket.io的協議)。 – jfriend00

1

我相信你是正確的,socket.io不尊重RFC 6455.爲了測試這個,我在Ubuntu的virtualbox上運行了一個javascript服務器,並且在主機上ubuntu執行了一個成功的與服務器的socket.io交互。我用sudo tcpdump -i vboxnet1 -w dump.out捕獲了網絡流量,並用wireshark分析了結果。

的socket.io握手是一樣原來的海報表示,並且整個腳本成功完成(與客戶端接收的WebSocket消息),而不tcpdump過顯示與升級頭的HTTP請求作爲每https://tools.ietf.org/html/rfc6455#section-4.1

1

在js客戶端,通過websocket傳輸連接到服務器。這使默認websocket機制與RFC 6455相同。

var socket = io.connect('http://localhost:8080', { 
    transports: [ 
    'websocket', 
    'polling' 
    ] 
}); 
+0

謝謝,這就是我要找的! – csblo