理清 WebSocket 和 HTTP 的關(guān)系
來源:jayfeng jayfeng.com/
問題一 問題二 最后
最近公司內(nèi)部同事分享了WebSocket相關(guān)的一些知識,之前也用過WebSocket做過一個即時通信的應(yīng)用。基本上但凡提到WebSocket和HTTP的關(guān)系都會有以下兩條:
WebSocket和HTTP都是基于TCP協(xié)議的兩個不同的協(xié)議 WebSocket依賴于HTTP連接
作為結(jié)論性的總結(jié),直接了當(dāng),但是我需要更多的實現(xiàn)細(xì)節(jié)來解釋上述結(jié)論。因為都是基于TCP的兩個獨立的協(xié)議,WebSocket按理說可以和HTTP沒有關(guān)系,所以這里面包含兩個問題:
WebSocket依賴于HTTP連接,那么它如何從連接的HTTP協(xié)議轉(zhuǎn)化為WebSocket協(xié)議? WebSocket為什么要依賴于HTTP協(xié)議的連接?
問題一
幸運的是,第一個問題的答案很容易找到。
每個WebSocket連接都始于一個HTTP請求。具體來說,WebSocket協(xié)議在第一次握手連接時,通過HTTP協(xié)議在傳送WebSocket支持的版本號,協(xié)議的字版本號,原始地址,主機地址等等一些列字段給服務(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)鍵的地方是,這里面有個Upgrade首部,用來把當(dāng)前的HTTP請求升級到WebSocket協(xié)議,這是HTTP協(xié)議本身的內(nèi)容,是為了擴展支持其他的通訊協(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é)一下,這張圖比較貼切:

問題二
經(jīng)過學(xué)習(xí)和理解,我認(rèn)為有兩點:
第一,WebSocket設(shè)計上就是天生為HTTP增強通信(全雙工通信等),所以在HTTP協(xié)議連接的基礎(chǔ)上是很自然的一件事,并因此而能獲得HTTP的諸多便利。第二,這諸多便利中有一條很重要,基于HTTP連接將獲得最大的一個兼容支持,比如即使服務(wù)器不支持WebSocket也能建立HTTP通信,只不過返回的是onerror而已,這顯然比服務(wù)器無響應(yīng)要好的多。
最后
關(guān)于WebSocket和HTTP的討論其實網(wǎng)上并不少,但因為一些資料本身就邏輯混亂,往往看的越多可能對于它們的關(guān)系越糊涂。理清一下這個簡單的關(guān)系對于了解它們的應(yīng)用場景還是有必要的,這也是我做這個分析的出發(fā)點所在。
--END--
下方二維碼關(guān)注我

互聯(lián)網(wǎng)草根,堅持分享技術(shù)、創(chuàng)業(yè)、產(chǎn)品等心得和總結(jié)~

