1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 1409字,需瀏覽 3分鐘

         ·

        2020-09-28 01:19


        來源:jayfeng jayfeng.com/

        • 問題一
        • 問題二
        • 最后

        最近公司內(nèi)部同事分享了WebSocket相關(guān)的一些知識(shí),之前也用過WebSocket做過一個(gè)即時(shí)通信的應(yīng)用?;旧系蔡岬絎ebSocket和HTTP的關(guān)系都會(huì)有以下兩條:

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

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

        1. WebSocket依賴于HTTP連接,那么它如何從連接的HTTP協(xié)議轉(zhuǎn)化為WebSocket協(xié)議?
        2. WebSocket為什么要依賴于HTTP協(xié)議的連接?

        問題一

        幸運(yùn)的是,第一個(gè)問題的答案很容易找到。

        每個(gè)WebSocket連接都始于一個(gè)HTTP請(qǐng)求。具體來說,WebSocket協(xié)議在第一次握手連接時(shí),通過HTTP協(xié)議在傳送WebSocket支持的版本號(hào),協(xié)議的字版本號(hào),原始地址,主機(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請(qǐng)求升級(jí)到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請(qǐng)求物盡其用,如果成功出發(fā)onopen事件,否則觸發(fā)onerror事件,后面的傳輸則不再依賴HTTP協(xié)議??偨Y(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料本身就邏輯混亂,往往看的越多可能對(duì)于它們的關(guān)系越糊涂。理清一下這個(gè)簡(jiǎn)單的關(guān)系對(duì)于了解它們的應(yīng)用場(chǎng)景還是有必要的,這也是我做這個(gè)分析的出發(fā)點(diǎn)所在。

        --END--


        下方二維碼關(guān)注我

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

        瀏覽 54
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91啦丨九色丨国产人 | 丰满护士巨好爽好大乳gif | 夜夜橹 | 欧美一区二区三区免费 | 黑人操亚洲女人 | freesex小白嫩video | 黄片免费小视频 | 男女内射视频 | 色婷婷在线视频精品免费 | 中文字幕一区在线播放 |