1. 程式人生 > >【計網】HTTP與WebSocket的區別

【計網】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)圖解

這裡寫圖片描述



本人才疏學淺,若有錯,請指出,謝謝!
如果你有更好的建議,可以留言我們一起討論,共同進步!
衷心的感謝您能耐心的讀完本篇博文