“天龍八步”細說瀏覽器輸入URL後發生了什麼
本文摘要:
1.DNS域名解析;
2.建立TCP連線;
3.傳送HTTP請求;
4.伺服器處理請求;
5.返回響應結果;
6.關閉TCP連線;
7.瀏覽器解析HTML;
8.瀏覽器佈局渲染;
總結
當我們在瀏覽器輸入網址並回車後,一切從這裡開始。
一、DNS域名解析
我們在瀏覽器輸入網址,其實就是要向伺服器請求我們想要的頁面內容,所有瀏覽器首先要確認的是域名所對應的伺服器在哪裡。將域名解析成對應的伺服器IP地址這項工作,是由DNS伺服器來完成的。
客戶端收到你輸入的域名地址後,它首先去找本地的hosts檔案,檢查在該檔案中是否有相應的域名、IP對應關係,如果有,則向其IP地址傳送請求,如果沒有,再去找DNS伺服器。一般使用者很少去編輯修改hosts檔案。
DNS伺服器層次結構
瀏覽器客戶端向本地DNS伺服器傳送一個含有域名www.cnblogs.com的DNS查詢報文。本地DNS伺服器把查詢報文轉發到根DNS伺服器,根DNS伺服器注意到其com字尾,於是向本地DNS伺服器返回comDNS伺服器的IP地址。本地DNS伺服器再次向comDNS伺服器傳送查詢請求,comDNS伺服器注意到其www.cnblogs.com字尾並用負責該域名的權威DNS伺服器的IP地址作為回應。最後,本地DNS伺服器將含有www.cnblogs.com的IP地址的響應報文傳送給客戶端。
從客戶端到本地伺服器屬於遞迴查詢,而DNS伺服器之間的互動屬於迭代查詢。
正常情況下,本地DNS伺服器的快取中已有comDNS伺服器的地址,因此請求根域名伺服器這一步不是必需的。
二、建立TCP連結
費了一頓周折終於拿到伺服器IP了,下一步自然就是連結到該伺服器。對於客戶端與伺服器的TCP連結,必然要說的就是『三次握手』。
客戶端傳送一個帶有SYN標誌的資料包給服務端,服務端收到後,回傳一個帶有SYN/ACK標誌的資料包以示傳達確認資訊,最後客戶端再回傳一個帶ACK標誌的資料包,代表握手結束,連線成功。
上圖也可以這麼理解:
客戶端:“你好,在家不,有你快遞。”
服務端:“在的,送來就行。”
客戶端:“好嘞。”
三、傳送HTTP請求
與伺服器建立了連線後,就可以向伺服器發起請求了。這裡我們先看下請求報文的結構(如下圖):
在瀏覽器中檢視報文首部(以google瀏覽器為例):
請求行包括請求方法、URI、HTTP版本。首部欄位傳遞重要資訊,包括請求首部欄位、通用首部欄位和實體首部欄位。我們可以從報文中看到發出的請求的具體資訊。具體每個首部欄位的作用,這裡不做過多闡述。
四、伺服器處理請求
伺服器端收到請求後的由web伺服器(準確說應該是http伺服器)處理請求,諸如Apache、Ngnix、IIS等。web伺服器解析使用者請求,知道了需要排程哪些資原始檔,再通過相應的這些資原始檔處理使用者請求和引數,並呼叫資料庫資訊,最後將結果通過web伺服器返回給瀏覽器客戶端。
五、返回響應結果
在HTTP裡,有請求就會有響應,哪怕是錯誤資訊。這裡我們同樣看下響應報文的組成結構:
在響應結果中都會有個一個HTTP狀態碼,比如我們熟知的200、301、404、500等。通過這個狀態碼我們可以知道伺服器端的處理是否正常,並能瞭解具體的錯誤。
狀態碼由3位數字和原因短語組成。根據首位數字,狀態碼可以分為五類:
六、關閉TCP連線
為了避免伺服器與客戶端雙方的資源佔用和損耗,當雙方沒有請求或響應傳遞時,任意一方都可以發起關閉請求。與建立TCP連線的3次握手類似,關閉TCP連線,需要4次握手。
上圖可以這麼理解:
客戶端:“兄弟,我這邊沒資料要傳了,我們關閉連線吧。”
服務端:“收到,我看看我這邊有木有資料了。”
服務端:“兄弟,我這邊也沒資料要傳你了,我們可以關閉連線了。”
客戶端:“好嘞。”
七、瀏覽器解析HTML
準確地說,瀏覽器需要載入解析的不僅僅是HTML,還包括CSS、JS。以及還要載入圖片、視訊等其他媒體資源。
瀏覽器通過解析HTML,生成DOM樹,解析CSS,生成CSS規則樹,然後通過DOM樹和CSS規則樹生成渲染樹。渲染樹與DOM樹不同,渲染樹中並沒有head、display為none等不必顯示的節點。
要注意的是,瀏覽器的解析過程並非是串連進行的,比如在解析CSS的同時,可以繼續載入解析HTML,但在解析執行JS指令碼時,會停止解析後續HTML,這就會出現阻塞問題,關於JS阻塞相關問題,這裡不過多闡述,後面會單獨開篇講解。
八、瀏覽器佈局渲染
根據渲染樹佈局,計算CSS樣式,即每個節點在頁面中的大小和位置等幾何資訊。HTML預設是流式佈局的,CSS和js會打破這種佈局,改變DOM的外觀樣式以及大小和位置。這時就要提到兩個重要概念:replaint和reflow。
replaint:螢幕的一部分重畫,不影響整體佈局,比如某個CSS的背景色變了,但元素的幾何尺寸和位置不變。
reflow: 意味著元件的幾何尺寸變了,我們需要重新驗證並計算渲染樹。是渲染樹的一部分或全部發生了變化。這就是Reflow,或是Layout。
所以我們應該儘量減少reflow和replaint,我想這也是為什麼現在很少有用table佈局的原因之一。
最後瀏覽器繪製各個節點,將頁面展示給使用者。
總結
本文系統地講述從瀏覽器從輸入域名到最終頁面展示的整體流程。篇幅所限,本文的每一步講述其實並不全面,所以後面我會單獨就域名解析、HTTP請求/響應、瀏覽器的解析、渲染等內容單獨開篇講解,感興趣的朋友也可以關注我的個人部落格 。
參考:
http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/
http://taligarsiel.com/Projects/howbrowserswork1.htm
https://www.zhihu.com/question/34873227
圖片製作工具:Axure、PS、 Ulead GIF Animator、 ProcessOn
相關文章
- 譯文:瀏覽器輸入URL發生了什麼?瀏覽器
- 瀏覽器位址列輸入url回車之後發生了些什麼瀏覽器
- 在瀏覽器輸入 URL 回車之後發生了什麼(流程圖,超詳細版)瀏覽器流程圖
- 經典面試題—在瀏覽器中輸入URL之後發生了什麼?面試題瀏覽器
- 從在瀏覽器中輸 URL 網址之後到底發生了什麼?瀏覽器
- 【瀏覽器】從URL輸入到頁面展現到底發生了什麼?瀏覽器
- 在瀏覽器位址列輸入url到按下回車發生了什麼?瀏覽器
- 從輸入 URL 到瀏覽器接收的過程中發生了什麼事情?瀏覽器
- (詳解)從瀏覽器輸入 URL 到頁面展示過程發生了什麼?瀏覽器
- 經典面試題:在瀏覽器位址列輸入一個 URL 後回車,背後發生了什麼面試題瀏覽器
- 在瀏覽器輸入一個網址回車後,發生了什麼?瀏覽器
- 瀏覽器輸入一個URL會發生什麼?瀏覽器
- 從輸入 URL 到瀏覽器接收的過程中發生了什麼事情----轉載瀏覽器
- 瀏覽器輸入URL回車後...瀏覽器
- 在瀏覽器裡輸入網址,按下Enter鍵之後發生了什麼瀏覽器
- 當你在瀏覽器中輸入URL回車後會發生什麼?瀏覽器
- 在瀏覽器中輸入url到頁面顯示出來的過程發生了什麼?瀏覽器
- 當你在瀏覽器輸入一個網址,回車後究竟發生了什麼?瀏覽器
- 瀏覽器中輸入 URL 回車後瀏覽器
- 瀏覽器中輸入 URL 回車後...瀏覽器
- 瀏覽器從輸入網址到顯示都發生了些什麼?瀏覽器
- 當在瀏覽器輸入URL回車後,瀏覽器到底做了什麼?瀏覽器渲染機制又是怎樣的?瀏覽器
- 簡述瀏覽器輸入 URL 地址後發生的事情瀏覽器
- 深入淺出經典面試題:從瀏覽器中輸入URL到頁面載入發生了什麼 - Part 2面試題瀏覽器
- 深入淺出經典面試題:從瀏覽器中輸入URL到頁面載入發生了什麼 - Part 3面試題瀏覽器
- 網路程式設計(四):輸入一個URL後發生了什麼?程式設計
- 當你在瀏覽器中輸入Google.com並且按下回車之後發生了什麼?瀏覽器Go
- 從輸入URL到頁面載入到底發生了什麼
- 在瀏覽器中輸入一個URL,按下回車會發生什麼?瀏覽器
- 從輸入url到傳送請求發生了什麼
- 從輸入url到顯示網頁發生了什麼網頁
- 注意看,她叫小美,在位址列輸入URL地址後發生了什麼?
- 瀏覽器從輸入URL到渲染瀏覽器
- 瀏覽器輸入 URL後那點事,簡單版瀏覽器
- 在瀏覽器中從URL輸入到頁面展現到底發生什麼?瀏覽器
- 瀏覽器位址列裡輸入URL後的全過程瀏覽器
- 網紅面試題:從輸入 url 到看到頁面發生了什麼面試題
- 簡略圖解:輸入 url 到出現頁面,瀏覽器做了什麼?圖解瀏覽器