做爲前端工程師,幾乎是天天都要與各類瀏覽器打交道。html
理解瀏覽器是如何工做的,對咱們作業務的技術選型、架構設計等都有很是重要的做用,可讓咱們準確的評估web開的項目的可行性,站在更高維度審視頁面,以及在快節奏的技術迭代中把握住問題的本質。前端
那麼咱們就從一道面試題在瀏覽器裏面,從輸入URL到展現頁面,這過程發生了什麼?
來解開瀏覽器神祕的面紗web
在瞭解流程以前咱們先來看一下瀏覽器的架構:面試
當代現有的瀏覽器主要由:chrome
那麼在瞭解完瀏覽器的架構以後,再來看一下URL的解析過程數據庫
當發送一個url請求時,無論這個url是web頁面的url仍是web頁面上的每一個資源的url,瀏覽器都會開啓一個線程處理該請求,同時在遠程DNS服務器上啓動一個DNS查詢,這能使瀏覽器得到請求對應的IP地址後端
網址的解析是一個從右向左的過程: com -> google.com -> www.google.com;瀏覽器
事實上,真正的網址是www.google.com.,這個.對應的就是根域名服務器,默認狀況下全部的網址的最後一位都是.,既然是默認狀況下,爲了方便用戶,一般都會省略,瀏覽器在請求DNS的時候會自動加上,全部網址真正的解析過程爲: . -> .com -> google.com. -> www.google.com.。緩存
名稱 | 說明 | 示例 |
---|---|---|
根域 | DNS域名使用時,規定由尾部局點(.)來指定名稱位於根或者更高級的域層次結構 | 單個句點(.)或者句點用於末尾的名稱 |
頂級域 | 用於指示某個國家/地區或者組織使用的名稱類 | .com |
第二層域 | 我的或者組織在Internet上使用的註冊名稱 | baidu.com |
子域 | 已註冊的二級域名派生的域名,同屬的講就是網站名 | www.baidu.com |
主機名 | 一般狀況下,DNS域名的最左側的標籤標示網絡上的特定計算機,如h1 | h1.www.baidu.com |
在http消息發送前,須要創建客戶端與服務器的TCP連接,也就是進行所謂的三次握手。
TCP是因特網中的傳輸層協議,使用三次握手協議)創建鏈接。當主動方發出SYN鏈接請求後,等待對方回答SYN+ACK,並最終對對方的 SYN 執行 ACK 確認。這種創建鏈接的方法能夠防止產生錯誤的鏈接,TCP使用的流量控制協議是可變大小的滑動窗口協議。服務器
TCP三次握手的過程以下:
三次握手完成,TCP客戶端和服務器端成功地創建鏈接,能夠開始傳輸數據了。
進過TCP3次握手以後,瀏覽器發起了http的請求;
chrome瀏覽器查看報文首部信息:
如今請求只是成功達到了服務器,接下來服務器須要響應瀏覽器的請求。
服務器端收到請求後的由web服務器(準確說應該是http服務器)處理請求,諸如Apache、Ngnix、IIS等。web服務器解析用戶請求,知道了須要調度哪些資源文件,再經過相應的這些資源文件處理用戶請求和參數,並調用數據庫信息,最後將結果經過web服務器返回給瀏覽器客戶端。
在HTTP裏,有請求就會有響應,哪怕是錯誤信息。這裏咱們一樣看下響應報文的組成結構:
在響應結果中都會有個一個HTTP狀態碼,好比咱們熟知的200、30一、40四、500等。經過這個狀態碼咱們能夠知道服務器端的處理是否正常,並能瞭解具體的錯誤。
狀態碼由3位數字和緣由短語組成。根據首位數字,狀態碼能夠分爲五類:
狀態碼 | 類別 | 說明 |
---|---|---|
1-- | 信息性狀態碼 | 接收的請求正在處理 |
2-- | 成功狀態碼 | 請求正常處理完畢 |
3-- | 重定向狀態碼 | 須要進行附加操做已完成請求 |
4-- | 客戶端錯誤狀態碼 | 服務器沒法處理請求 |
5-- | 服務器錯誤狀態碼 | 服務器處理請求出錯 |
從上面的URL請求咱們能看到headers裏面的Accept是text/html類型,這部分頭部說明了瀏覽器將響應內容做爲HTML渲染,而不是做爲文件下載。瀏覽器將使用頭部決定如何解釋響應結果,固然也會考慮其餘因素,好比URL的擴展狀況。
當瀏覽器得到一個html文件時,會「自上而下」加載,並在加載過程當中進行解析渲染。
解析: