理清 WebSocket 和 HTTP 的关系
最近公司內部同事分享了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 and HTTP?
問題二
經過學習和理解,我認為有兩點:
第一,WebSocket設計上就是天生為HTTP增強通信(全雙工通信等),所以在HTTP協議連接的基礎上是很自然的一件事,并因此而能獲得HTTP的諸多便利。第二,這諸多便利中有一條很重要,基于HTTP連接將獲得最大的一個兼容支持,比如即使服務器不支持WebSocket也能建立HTTP通信,只不過返回的是onerror而已,這顯然比服務器無響應要好的多。
最后
關于WebSocket和HTTP的討論其實網上并不少,但因為一些資料本身就邏輯混亂,往往看的越多可能對于它們的關系越糊涂。理清一下這個簡單的關系對于了解它們的應用場景還是有必要的,這也是我做這個分析的出發點所在。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的理清 WebSocket 和 HTTP 的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试问Kafka,这一篇全搞定
- 下一篇: 从业20年的程序员,“盘”出来的5种编程