【計網】HTTP與WebSocket的區別
WebSocket協議
1.定義
Websocket是html5提出的一個協議規範(2011年),參考rfc6455。
websocket約定了一個通訊的規範,通過一個握手的機制,客戶端(瀏覽器)和伺服器(webserver)之間能建立一個類似tcp的連線,從而方便c-s之間的通訊。在websocket出現之前,web互動一般是基於http協議的短連線或者長連線。
WebSocket他是為了解決客戶端發起多個http請求到伺服器資源瀏覽器必須要經過長時間的輪訓問題而生的。
建立了WebSocket之後伺服器不必在瀏覽器傳送request請求之後才能傳送資訊到瀏覽器。這時的伺服器已有主動權想什麼時候發就可以傳送資訊到伺服器。而且資訊當中不必在帶有head的部分資訊了與http的長連結通訊來說,這種方式,不僅能降低伺服器的壓力。而且資訊當中也減少了部分多餘的資訊。
2.websocket的特點
WebSocket解決客戶端發起多個http請求到伺服器資源瀏覽器必須要經過長時間的輪詢問題。
websocket是一種雙向通訊協議,採用非同步回撥的方式接受訊息,當建立通訊連線,可以做到永續性的連線,並進行通訊。
WebSocket需要通過握手連線,類似於TCP它也需要客戶端和伺服器端進行握手連線,連線成功後才能相互通訊。
建立連線後,WebSocket伺服器和Browser都能主動的向對方傳送或接收資料,實質的推送方式是伺服器主動推送,只要有資料就推送到請求方。(變被動為主動)
3.websocket的握手(handshake)
(1)定義
出於相容性的考慮,WS的握手使用HTTP來實現,客戶端的握手訊息就是一個普通的,帶有Upgrade頭的,HTTP Request訊息。
(2)websocket請求報文
GET /chat HTTP/1.1 //1
Host: server.example.com //2
Upgrade: websocket //3
Connection: Upgrade //4
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== //5
Origin: http://example.com //6
Sec-WebSocket-Protocol: chat, superchat //7
Sec-WebSocket-Version: 13 //8
websocket請求報文的分析過程
第1行:與HTTP的Request的請求行一樣
第2行:也與HTTP的Request的請求行一樣
第3行:Upgrade是HTTP1.1中用於定義轉換協議的header域。
如果伺服器支援的話,客戶端希望使用已經建立好的HTTP(TCP)連線,切換到WebSocket協議。第4行:Connection:HTTP1.1中規定Upgrade只能應用在直接連線中
帶有Upgrade頭的HTTP1.1訊息必須含有Connection頭,因為Connection頭的意義就是,任何接收到此訊息的人(往往是代理伺服器)都要在轉發此訊息之前處理掉Connection中指定的域(不轉發Upgrade域)。第5行:Sec-WebSocket-Key 是一個Base64encode的值,這個是瀏覽器隨機生成的,用於服務端的驗證,伺服器會使用此欄位組裝成另一個key值放在握手返回資訊裡傳送客戶端
第6行:Origin作安全使用,防止跨站攻擊,瀏覽器一般會使用這個來標識原始域。
第7行:Sec_WebSocket-Protocol是一個使用者定義的字串,用來區分同URL下,不同的服務所需要的協議,識了客戶端支援的子協議的列表。
第8行:Sec-WebSocket-Version標識了客戶端支援的WS協議的版本列表。
(2)websocket響應報文
HTTP/1.1 101 Switching Protocols //1
Upgrade: websocket. //2
Connection: Upgrade. //3
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= //4
Sec-WebSocket-Protocol: chat. //5
websocket響應報文的分析
第1行:HTTP的版本為HTTP1.1,返回碼是101,開始解析header域(不區分大小寫)
第2行:有Upgrade頭,且內容包含websocket。
第3行:有Connection頭,且內容包含Upgrade
第4行:有Sec-WebSocket-Accept頭,
生成步驟:①將Sec-WebSocket-Key的內容加上字串258EAFA5-E914-47DA-95CA-C5AB0DC85B11(一個UUID),②將①中生成的字串進行SHA1編碼,③將②中生成的字串進行Base64編碼第5行:有Sec-WebSocket-Protocol頭,要判斷是否之前的Request握手帶有此協議,如果沒有,則連線失敗。
4.websocket傳送資料
WebSocket中所有傳送的資料使用幀的形式傳送。客戶端傳送的資料幀都要經過掩碼處理,服務端傳送的所有資料幀都不能經過掩碼處理。否則對方需要傳送關閉幀
一個幀包含一個幀型別的標識碼,一個負載長度,和負載。負載包括擴充套件內容和應用內容。
HTTP1.1與WebSocket的異同
1.相同點
都是基於TCP的應用層協議。
都使用Request/Response模型進行連線的建立。
都可以在網路中傳輸資料。
在連線的建立過程中對錯誤的處理方式相同,在這個階段WebSocket可能返回和HTTP相同的返回碼。
2.不同點
http協議基於請求應答,只能做單向傳輸,是半雙工協議,而WebSocket是全雙工協議,類似於socket通訊,雙方都可以在任何時刻向另一方傳送資料。
WebSocket使用HTTP來建立連線,但是定義了一系列新的header域,這些域在HTTP中並不會使用。
WebSocket的連線不能通過中間人來轉發,它必須是一個直接連線。如果通過代理轉發,一個代理要承受如此多的websocket連線不釋放,就類似於一次DDOS攻擊了。
WebSocket在建立握手連線時,資料是通過http協議傳輸的,但在建立連線之後,真正的資料傳輸階段是不需要http協議參與的。
websocket傳輸的資料是二進位制流,是以幀為單位的,http傳輸的是明文傳輸,是字串傳輸,WebSocket的資料幀有序。
websocket的請求的頭部和http請求頭部不同,見上文。
3.HTTP的長連線與websocket的持久連線
(1)HTTP1.1的連線預設使用長連線(persistent connection),
即在一定的期限內保持連結,客戶端會需要在短時間內向服務端請求大量的資源,保持TCP連線不斷開。客戶端與伺服器通訊,必須要有客戶端發起然後伺服器返回結果。客戶端是主動的,伺服器是被動的。
在一個TCP連線上可以傳輸多個Request/Response訊息對,所以本質上還是Request/Response訊息對,仍然會造成資源的浪費、實時性不強等問題。
如果不是持續連線,即短連線,那麼每個資源都要建立一個新的連線,HTTP底層使用的是TCP,那麼每次都要使用三次握手建立TCP連線,即每一個request對應一個response,將造成極大的資源浪費。
長輪詢,即客戶端傳送一個超時時間很長的Request,伺服器hold住這個連線,在有新資料到達時返回Response
(2)websocket的持久連線
- 只需建立一次Request/Response訊息對,之後都是TCP連線,避免了需要多次建立Request/Response訊息對而產生的冗餘頭部資訊。
(3)圖解
本人才疏學淺,若有錯,請指出,謝謝!
如果你有更好的建議,可以留言我們一起討論,共同進步!
衷心的感謝您能耐心的讀完本篇博文