<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          理清 WebSocket 和 HTTP 的關(guān)系

          共 1409字,需瀏覽 3分鐘

           ·

          2020-09-28 01:19


          來源:jayfeng jayfeng.com/

          • 問題一
          • 問題二
          • 最后

          最近公司內(nèi)部同事分享了WebSocket相關(guān)的一些知識,之前也用過WebSocket做過一個即時通信的應(yīng)用。基本上但凡提到WebSocket和HTTP的關(guān)系都會有以下兩條:

          1. WebSocket和HTTP都是基于TCP協(xié)議的兩個不同的協(xié)議
          2. WebSocket依賴于HTTP連接

          作為結(jié)論性的總結(jié),直接了當(dāng),但是我需要更多的實現(xiàn)細(xì)節(jié)來解釋上述結(jié)論。因為都是基于TCP的兩個獨立的協(xié)議,WebSocket按理說可以和HTTP沒有關(guān)系,所以這里面包含兩個問題:

          1. WebSocket依賴于HTTP連接,那么它如何從連接的HTTP協(xié)議轉(zhuǎn)化為WebSocket協(xié)議?
          2. 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é)一下,這張圖比較貼切:

          WebSocket and HTTP

          問題二

          經(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é)~

          瀏覽 54
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色噜噜人妻av中文字幕 | 日本2区在线观看 | 欧美自拍另类在线 | 欧美日韩三级片在线观看 | 骚虎最新网站 |