在實現websocket連線過程中,需要通過瀏覽器發出websocket連線請求,然後服務器發出回應,這個過程通常稱為“握手”
。在 WebSocket
API,瀏覽器和服務器只需要做壹個握手的動作,然後,瀏覽器和服務器之間就形成了壹條快速通道。兩者之間就直接可以數據互相傳送。在此WebSocket
協議中,為我們實現即時服務帶來了兩大好處:
1. Header
互相溝通的Header是很小的-大概只有 2 Bytes
2. Server Push
服務器的推送,服務器不再被動的接收到瀏覽器的請求之後才返回數據,而是在有新數據時就主動推送給瀏覽器。
握手協議例子
編輯
瀏覽器請求
GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin: http://服務器地址
Sec-WebSocket-Version: 13
服務器回應
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
WebSocket借用http請求進行握手,相比正常的http請求,多了壹些內容。其中,
Upgrade: websocket
Connection: Upgrade
表示希望將http協議升級到Websocket協議。
Sec-WebSocket-Key是瀏覽器隨機生成的base64 encode的值,用來詢問服務器是否是支持WebSocket。
服務器返回
Upgrade: websocket
Connection: Upgrade
告訴瀏覽器即將升級的是Websocket協議
Sec-WebSocket-Accept是將請求包“Sec-WebSocket-Key”的值,與”258EAFA5-E914-47DA-95CA-C5AB0DC85B11″這個字符串進行拼接,然後對拼接後的字符串進行sha-1運算,再進行base64編碼得到的。用來說明自己是WebSocket助理服務器。
Sec-WebSocket-Version是WebSocket協議版本號。RFC6455要求使用的版本是13,之前草案的版本均應當被棄用。
更多握手規範詳見RFC6455。