理清 WebSocket 和 HTTP 的關係
- 問題一
- 問題二
- 最後
- 《Netty 實現原理與源碼解析 —— 精品合集》
- 《Spring 實現原理與源碼解析 —— 精品合集》
- 《MyBatis 實現原理與源碼解析 —— 精品合集》
- 《Spring MVC 實現原理與源碼解析 —— 精品合集》
- 《Spring Boot 實現原理與源碼解析 —— 精品合集》
- 《資料庫實體設計合集》
- 《Java 面試題 —— 精品合集》
- 《Java 學習指南 —— 精品合集》
最近公司內部同事分享了WebSocket相關的一些知識,之前也用過WebSocket做過一個即時通信的應用。基本上但凡提到WebSocket和HTTP的關係都會有以下兩條:
- WebSocket和HTTP都是基於TCP協議的兩個不同的協議
- WebSocket依賴於HTTP連接
作為結論性的總結,直接了當,但是我需要更多的實現細節來解釋上述結論。 因為都是基於TCP的兩個獨立的協議,WebSocket按理說可以和HTTP沒有關係,所以這裡麪包含兩個問題:
- WebSocket依賴於HTTP連接,那麼它如何從連接的HTTP協議轉化為WebSocket協議?
- WebSocket為什麼要依賴於HTTP協議的連接?
問題一
幸運的是,第一個問題的答案很容易找到。
每個WebSocket連接都始於一個HTTP請求。 具體來說,WebSocket協議在第一次握手連接時,通過HTTP協議在傳送WebSocket支持的版本號,協議的字版本號,原始地址,主機地址等等一些列欄位給伺服器端:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Version: 13
注意,關鍵的地方是,這裡面有個Upgrade首部,用來把當前的HTTP請求升級到WebSocket協議,這是HTTP協議本身的內容,是為了擴展支持其他的通訊協議。 如果伺服器支持新的協議,則必須返回101:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
至此,HTTP請求物盡其用,如果成功出發onopen事件,否則觸發onerror事件,後面的傳輸則不再依賴HTTP協議。 總結一下,這張圖比較貼切: