1. websocket 是什么
Html開始提供一種瀏覽器與服務(wù)器進行全雙工通信的網(wǎng)絡(luò)技術(shù),屬于應(yīng)用層協(xié)議。它基于TCP傳輸協(xié)議,并復(fù)用Http的握手通道
2. 優(yōu)點
- 支持雙向通信,實時性更強
- 更好的二進制支持
- 較少的控制開銷。創(chuàng)建連接后,客戶端與服務(wù)端進行數(shù)據(jù)交換時,協(xié)議控制的數(shù)據(jù)包頭部較小,而Http 協(xié)議每次通信都需要攜帶完整的頭部。
- 支持擴展。websocket協(xié)議定義了擴展,用戶可以擴展協(xié)議或者實現(xiàn)自定義的子協(xié)議(比如支持自定義壓縮算法)
3. 連接過程
WebSocket協(xié)議是基于TCP協(xié)議上的獨立的通信協(xié)議,在建立WebSocket通信連接前,需要使用HTTP協(xié)議進行握手,從HTTP連接升級為WebSocket連接。瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸。
WebSocket定義了兩種URI格式, “ws://“和“wss://”,類似于HTTP和HTTPS, “ws://“使用明文傳輸,默認端口為80,”wss://“使用TLS加密傳輸,默認端口為443。
連接過程如下:
- 客戶端建立到服務(wù)器的TCP連接
- 客戶端請求將當(dāng)前TCP連接用作websocket
- 服務(wù)器收到請求, 同意并確認將此 TCP 連接用作 websocket
- 客戶端收到確認, HTTP 協(xié)議通信結(jié)束
- 雙方使用 websocket 協(xié)議自由雙向通信
4. 數(shù)據(jù)幀格式
Websocket在通信的最小單位為幀,由一個或者多個幀組成一條完整的消息。
發(fā)送端,將消息切割成多個幀,并發(fā)給服務(wù)端;接收端,接收消息幀,并將關(guān)聯(lián)的幀重新組裝成完整的消息。
當(dāng)WebSocket的接收方收到一個數(shù)據(jù)幀時,會根據(jù)FIN的值來判斷,是否已經(jīng)收到消息的最后一個數(shù)據(jù)幀
FIN=1表示當(dāng)前數(shù)據(jù)幀為消息的最后一個數(shù)據(jù)幀,此時接收方已經(jīng)收到完整的消息,可以對消息進行處理。FIN=0,則接收方還需要繼續(xù)監(jiān)聽接收其余的數(shù)據(jù)幀。
此外,opcode在數(shù)據(jù)交換的場景下,表示的是數(shù)據(jù)的類型。0x01表示文本,0x02表示二進制。而0x00比較特殊,表示延續(xù)幀(continuation frame),顧名思義,就是完整消息對應(yīng)的數(shù)據(jù)幀還沒接收完。