理清 WebSocket 和 HTTP 的关系
最近公司內(nèi)部同事分享了WebSocket相關(guān)的一些知識,之前也用過WebSocket做過一個(gè)即時(shí)通信的應(yīng)用。基本上但凡提到WebSocket和HTTP的關(guān)系都會有以下兩條:
WebSocket和HTTP都是基于TCP協(xié)議的兩個(gè)不同的協(xié)議
WebSocket依賴于HTTP連接
作為結(jié)論性的總結(jié),直接了當(dāng),但是我需要更多的實(shí)現(xiàn)細(xì)節(jié)來解釋上述結(jié)論。因?yàn)槎际腔赥CP的兩個(gè)獨(dú)立的協(xié)議,WebSocket按理說可以和HTTP沒有關(guān)系,所以這里面包含兩個(gè)問題:
WebSocket依賴于HTTP連接,那么它如何從連接的HTTP協(xié)議轉(zhuǎn)化為WebSocket協(xié)議?
WebSocket為什么要依賴于HTTP協(xié)議的連接?
問題一
幸運(yùn)的是,第一個(gè)問題的答案很容易找到。
每個(gè)WebSocket連接都始于一個(gè)HTTP請求。具體來說,WebSocket協(xié)議在第一次握手連接時(shí),通過HTTP協(xié)議在傳送WebSocket支持的版本號,協(xié)議的字版本號,原始地址,主機(jī)地址等等一些列字段給服務(wù)器端:
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注意,關(guān)鍵的地方是,這里面有個(gè)Upgrade首部,用來把當(dāng)前的HTTP請求升級到WebSocket協(xié)議,這是HTTP協(xié)議本身的內(nèi)容,是為了擴(kuò)展支持其他的通訊協(xié)議。如果服務(wù)器支持新的協(xié)議,則必須返回101:
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=至此,HTTP請求物盡其用,如果成功出發(fā)onopen事件,否則觸發(fā)onerror事件,后面的傳輸則不再依賴HTTP協(xié)議。總結(jié)一下,這張圖比較貼切:
WebSocket and HTTP?
問題二
經(jīng)過學(xué)習(xí)和理解,我認(rèn)為有兩點(diǎn):
第一,WebSocket設(shè)計(jì)上就是天生為HTTP增強(qiáng)通信(全雙工通信等),所以在HTTP協(xié)議連接的基礎(chǔ)上是很自然的一件事,并因此而能獲得HTTP的諸多便利。第二,這諸多便利中有一條很重要,基于HTTP連接將獲得最大的一個(gè)兼容支持,比如即使服務(wù)器不支持WebSocket也能建立HTTP通信,只不過返回的是onerror而已,這顯然比服務(wù)器無響應(yīng)要好的多。
最后
關(guān)于WebSocket和HTTP的討論其實(shí)網(wǎng)上并不少,但因?yàn)橐恍┵Y料本身就邏輯混亂,往往看的越多可能對于它們的關(guān)系越糊涂。理清一下這個(gè)簡單的關(guān)系對于了解它們的應(yīng)用場景還是有必要的,這也是我做這個(gè)分析的出發(fā)點(diǎn)所在。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的理清 WebSocket 和 HTTP 的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试问Kafka,这一篇全搞定
- 下一篇: 从业20年的程序员,“盘”出来的5种编程