<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>

                >[danger]瀏覽器從輸入url到頁面渲染出來的過程? >[info]建議回答 * 1、瀏覽器的地址欄輸入URL并按下回車。 * 2、瀏覽器查找當前URL是否存在緩存,并比較緩存是否過期。 * 3、DNS解析URL對應的IP。 * 4、根據IP建立TCP連接(三次握手)。 * 5、HTTP發起請求。 * 6、服務器處理請求,瀏覽器接收HTTP響應。 * 7、渲染頁面,構建DOM樹。 * 8、關閉TCP連接(四次揮手) >[info]技術解讀 (1)**解析URL:** **首先會對 URL 進行解析,分析所需要使用的傳輸協議和請求的資源的路徑**。如果輸入的 URL 中的協議或者主機名不合法,將會把地址欄中輸入的內容傳遞給搜索引擎。如果沒有問題,瀏覽器會檢查 URL 中是否出現了非法字符,如果存在非法字符,則對非法字符進行轉義后再進行下一過程。 (2)**緩存判斷:** **瀏覽器會判斷所請求的資源是否在緩存里**,如果請求的資源在緩存里并且沒有失效,那么就直接使用,否則向服務器發起新的請求。 (3)**DNS解析:** 下一步首先需要獲取的是輸入的 URL 中的域名的 IP 地址,首先會**判斷本地是否有該域名的 IP 地址的緩存**,如果有則使用,**如果沒有則向本地 DNS 服務器發起請求**。**本地 DNS 服務器也會先檢查是否存在緩存**,如果**沒有就會先向根域名服務器發起請求**,獲得負責的頂級域名服務器的地址后,**再向頂級域名服務器請求**,然后獲得負責的權威域名服務器的地址后,**再向權威域名服務器發起請求**,**最終獲得域名的 IP 地址后,本地 DNS 服務器再將這個 IP 地址返回給請求的用戶**。用戶向本地 DNS 服務器發起請求屬于遞歸請求,本地 DNS 服務器向各級域名服務器發起請求屬于迭代請求。 (4)**獲取MAC地址(選說)** 當瀏覽器得到 IP 地址后,**數據傳輸還需要知道目的主機 MAC 地址**,因為應用層下發數據給傳輸層,TCP 協議會指定源端口號和目的端口號,然后下發給網絡層。網絡層會將本機地址作為源地址,獲取的 IP 地址作為目的地址。然后將下發給數據鏈路層,數據鏈路層的發送需要加入通信雙方的 MAC 地址,本機的 MAC 地址作為源 MAC 地址,目的 MAC 地址需要分情況處理。通過將 IP 地址與本機的子網掩碼相與,可以判斷是否與請求主機在同一個子網里,如果在同一個子網里,可以使用 APR 協議獲取到目的主機的 MAC 地址,如果不在一個子網里,那么請求應該轉發給網關,由它代為轉發,此時同樣可以通過 ARP 協議來獲取網關的 MAC 地址,此時目的主機的 MAC 地址應該為網關的地址。 (5)**TCP三次握手:** ,**確認客戶端與服務器的接收與發送能力**,下面是 TCP 建立連接的三次握手的過程,首先客戶端向服務器發送一個 SYN 連接請求報文段和一個隨機序號,服務端接收到請求后向服務器端發送一個 SYN ACK報文段,確認連接請求,并且也向客戶端發送一個隨機序號。客戶端接收服務器的確認應答后,進入連接建立的狀態,同時向服務器也發送一個ACK 確認報文段,服務器端接收到確認后,也進入連接建立狀態,此時雙方的連接就建立起來了。 (6)**HTTPS握手(選說):** **如果使用的是 HTTPS 協議,在通信前還存在 TLS 的一個四次握手的過程**。首先由客戶端向服務器端發送使用的協議的版本號、一個隨機數和可以使用的加密方法。服務器端收到后,確認加密的方法,也向客戶端發送一個隨機數和自己的數字證書。客戶端收到后,首先檢查數字證書是否有效,如果有效,則再生成一個隨機數,并使用證書中的公鑰對隨機數加密,然后發送給服務器端,并且還會提供一個前面所有內容的 hash 值供服務器端檢驗。服務器端接收后,使用自己的私鑰對數據解密,同時向客戶端發送一個前面所有內容的 hash 值供客戶端檢驗。這個時候雙方都有了三個隨機數,按照之前所約定的加密方法,使用這三個隨機數生成一把秘鑰,以后雙方通信前,就使用這個秘鑰對數據進行加密后再傳輸。 (7)**發送HTTP請求**:**服務器處理請求,返回HTTP報文**(響應)(文件) (8)**頁面渲染:** 瀏覽器首先會根據 html 文件(響應) **建 DOM 樹**,根據解析到的 css 文件構**建 CSSOM 樹**,如果遇到 script 標簽,則判端是否含有 defer 或者 async 屬性,要不然 script 的加載和執行會造成頁面的渲染的阻塞。**當 DOM 樹和 CSSOM 樹建立好后,根據它們來構建渲染樹**。渲染樹構建好后,會根據渲染樹來進行布局。布局完成后,最后使用瀏覽器的 UI 接口對頁面進行繪制。這個時候整個頁面就顯示出來了。 (9)**TCP四次揮手:** **最后一步是 TCP 斷開連接的四次揮手過程**。若客戶端認為數據發送完成,則它需要向服務端發送連接釋放請求。服務端收到連接釋放請求后,會告訴應用層要釋放 TCP 鏈接。然后會發送 ACK 包,并進入 CLOSE\_WAIT 狀態,此時表明客戶端到服務端的連接已經釋放,不再接收客戶端發的數據了。但是因為 TCP 連接是雙向的,所以服務端仍舊可以發送數據給客戶端。服務端如果此時還有沒發完的數據會繼續發送,完畢后會向客戶端發送連接釋放請求,然后服務端便進入 LAST-ACK 狀態。客戶端收到釋放請求后,向服務端發送確認應答,此時客戶端進入 TIME-WAIT 狀態。該狀態會持續 2MSL(最大段生存期,指報文段在網絡中生存的時間,超時會被拋棄) 時間,若該時間段內沒有服務端的重發請求的話,就進入 CLOSED 狀態。當服務端收到確認應答后,也便進入 CLOSED 狀態。
                  <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>

                              哎呀哎呀视频在线观看