• 問題一
  • 問題二
  • 最後

  • 《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協議。 總結一下,這張圖比較貼切:

問題二

經過學習和理解,我認為有兩點:

第一,WebSocket設計上就是天生為HTTP增強通信(全雙工通信等),所以在HTTP協議連接的基礎上是很自然的一件事,並因此而能獲得HTTP的諸多便利。 第二,這諸多便利中有一條很重要,基於HTTP連接將獲得最大的一個兼容支持,比如即使伺服器不支持WebSocket也能建立HTTP通信,只不過返回的是onerror而已,這顯然比伺服器無響應要好的多。

最後

關於WebSocket和HTTP的討論其實網上並不少,但因為一些資料本身就邏輯混亂,往往看的越多可能對於它們的關係越糊塗。 理清一下這個簡單的關係對於瞭解它們的應用場景還是有必要的,這也是我做這個分析的出發點所在。

來源:sina.lt/gmJP


:-D 搜索微信號(ID:芋道源碼),可以獲得各種 Java 源碼解析、原理講解、面試題、學習指南。

:-D 並且,回復【書籍】後,可以領取筆者推薦的各種 Java 從入門到架構的 100 本書籍。

:-D 並且,回復【技術羣】後,可以加入專門討論 Java、後端、架構的技術羣。


推薦閱讀:
相關文章