<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                瀏覽器是如何訪問互聯網的呢? 首先人們會告訴瀏覽器一個網址,比如www.jd.com, 然后就可以通過TCP協議與服務器建立一個連接,通過這個連接通道給服務器發消息,消息格式是與服務器約定好了的。 服務器會按照約定返回整個頁面的數據(HTML文檔),當然也是通過**同一個**連接通道。 然后這個連接通道會被關閉。 瀏覽器與服務器的這種約定就叫**HTTP協議** ## 重復利用每個連接通道 隨著互聯網的發展,網頁變得非常復雜,開始出現圖片等,為了把圖片得資源快速下載下來,需要通過TCP協議建立很多的連接通道,有些下載圖片,有些下載CSS等。 我們知道TCP的連接提交的麻煩,需要3次握手和4次揮手。。 如果連接建立得較多,浪費極大。 那么能不能建立一個連接通道,并且不關閉? 可以協商出一個keep-alive機制,默認情況下,讓TCP協議一直保持打開的連接通道,可以持續的在連接通道上發送消息。 如果長時間不發消息時,或者某一方明確要關閉連接,可以把連接通道關閉掉 這樣,可以復用連接通道了。 ## 只有純數據,不用格式化文檔 隨著頁面越來越大,人們對響應時間要求越來越高,大家希望能迅速的看到效果。 但是每次服務器會返回HTML文檔給瀏覽器,導致瀏覽器需要刷新整個頁面。 觀察發現,每次從服務器收到的數據其實只有一丁點的變化,能否進行局部更新呢? 也就是說,裝載過HTML文檔之后,后續的操作,就只通過XML或者JSON這種純粹的數據進行交流了。 具體流程如下: 用戶在頁面操作之后,整個頁面不會刷新(瀏覽器的地址不會改變),JavaScript在背后讓TCP建立一個通道,和服務器通信,獲取更新的數據,然后局部更新。 不過這還有一個問題,JavaScript在發出HTTP請求之后,需要等待服務器把數據返回,這段時間內,瀏覽器是什么都干不了的。就像假死了一樣。 可以**異步**:JavaScript發出HTTP請求之后,不等待服務器把數據返回,立刻干別的事情去了。等到服務器的數據回來了,瀏覽器再通知他處理。這就是AJAX ## 拋棄HTTP 完全拋棄的HTTP是不可能的,但是在某些場景下,比如說把桌面應用遷移到瀏覽器上的時候。 假設現在有個在線協作軟件,多個人可以在同一個頁面進行操作,如果想把每個人的鼠標位置廣播給大家,這就非常的麻煩。 因為會向服務器發送數據非常頻繁,但是每次發送的信息又非常的少。類似于x=100&y=200這樣的東西。 如果每次都遵循HTTP協議,構建HTTP請求,會發現傳遞了太多的無用的東西 ``` POST / HTTP/1.1 Host: localhost User-Agent: .... 略... Accept: text/html .... 略... Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Keep-Alive: 300 Connection: keep-alive Referer: http://localhost/test.php Content-Type: application/x-www-form-urlencoded Content-Length: 9 x=20&y=70 ``` 而且在移動互聯網時代,大家對實時性要求更高了,比如說股票信息、朋友圈更新等。 如果使用HTTP協議去經常**輪詢**服務器,大部分時間是在做無用功。 能不能不局限HTTP協議呢? 大致總結一下: - 不要HTTP的頭 - 瀏覽器和服務器之間要能互相發送數據 這不就是socket嗎?兩個電腦之間建立了socket之后,想發什么數據都可以,數據格式自己定義。 于是應用層的WebSocket就出現了。 但是HTTP被應用得太廣泛了,防火墻、緩存、代理等都是基于HTTP的。為了讓大家能迅速支持WebSocket,還需要和HTTP保持一定的兼容性, 比如建立WebSocket的時候,可以使用HTTP ``` 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 ``` 這段話的意思是說:服務器,把 HTTP 升級為 Websocket 吧? 然后服務器回復: ``` HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= ``` 服務器回復:我同意,以后我們就切換到 Websocket 協議開始通信了啊。 于是連接就建起來了, 接下來瀏覽器和服務器就可以雙向通信了。 瀏覽器要是想發送數據, 就直接發送 x=20&y=70, 根本沒有浪費流量的 HTTP header , 服務器有啥數據想給我, 也直接推送, 不用我去查詢了。 不過WebSocket也是基于TCP協議的,請示就是建立在原來TCP連接的通道之上。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看