WebSocket處於應用層,也是基於TCP(3次握手【最少3次能保證雙方都服務正常】)實現的。
TCP長連接流程:
client向server發起連接,server接受client連接。雙方建立連接,Client與server完成一次讀寫之后,它們之間的連接並不會主動關閉,用心跳保活。
后續的讀寫操作會繼續使用這個連接。
WebSocket就是基於TCP連接建立通訊的。
一旦WebSocket連接建立后,后續數據都以幀序列的形式傳輸。在客戶端或Server端中斷連接前,不需要客戶端和服務端重新發起連接請求。
發起握手:
每個WebSocket連接都始於一個HTTP請求。
具體來說,WebSocket協議在第一次握手連接時,通過HTTP協議在傳送數據,但是比普通HTTP請求相比多了一些字段。
客戶端:
GET /chat HTTP/1.1 Upgrade: websocket //轉換的是websocket協議 Connection: Upgrade //本次通信協議升級 Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== //一個Base64 encode的值,這個是瀏覽器隨機生成的
Sec-WebSocket-Protocol: chat, superchat//個用戶定義的字符串,用來區分同URL下,不同的服務所需要的協議
Sec-WebSocket-Version: 13 //websocket協議版本
服務器:
HTTP/1.1 101 Switching Protocols //101 協議經過了轉換並握手成功建立起了通信。
Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat
websocket連接后,只要客戶端和服務器端任意一端不主動斷開連接前,通信行為都是在一個持久連接上發起,后續數據與請求都通過幀序列的形式進行傳輸。
建立連接后,websocket 有一個代理會和每個客戶端建立連接【所以服務端可以給客戶端推送消息】,直到客戶端需要資源時才調用他的處理資源的線程。
