這是一個綜合性很強的問題,我的理解包含如下七個基本點:瀏覽器
1.在瀏覽器地址欄輸入url並按下回車。緩存
2.瀏覽器檢查當前url是否存在緩存和緩存是否過時。服務器
3.域名解析(DNS解析url對應的ip)。tcp
4.根據ip創建tcp連接(三次握手)。url
5.用當前url發送http請求。code
6.服務器處理請求,瀏覽器接收響應。blog
7.瀏覽器渲染頁面。圖片
接下來分析一下每個基本點所幹的事情:ip
1.在瀏覽器地址欄輸入url並按下回車。資源
分析:略
2.瀏覽器檢查當前url是否存在緩存和緩存是否過時。
分析:瀏覽器檢查當前url是否存在緩存,若是存在,則檢查緩存資源是否過時,若是不存在直接進入階段3。若是資源過時進入階段3,沒有過時則直接使用。
3.域名解析(DNS解析url對應的ip)。
分析:域名解析其實是將域名解析爲ip地址的過程。
首先,瀏覽器會檢查本地hosts文件中是否有此url的映射關係,若是有就調用這個ip地址映射,完成域名解析。
若是沒有,則會查找本地DNS解析器緩存,若是查找到則返回。
若是仍是沒有,則會查找本地DNS服務器,若是查找到則返回。
最後迭代查詢,按根域服務器 ->頂級域(.com)->第二層域(yeahfei.com) ->子域(admin.yeahfei.com)的順序找到IP地址。
4.根據ip創建tcp連接(三次握手)。
分析:經過第3階段已經拿到了服務器的ip地址,在獲取到IP地址後,便會開始創建一次鏈接,這是由TCP協議完成的,主要經過三次握手進行鏈接。
第一次握手: 創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SENT狀態,等待服務器確認;
第二次握手: 服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手: 客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP鏈接成功)狀態,完成 三次握手。
5.用當前url發送http請求。
分析:略
6.服務器處理請求,瀏覽器接收響應。
分析:略
7.瀏覽器渲染頁面。
分析:若是說響應的內容是HTML文檔的話,就須要瀏覽器進行解析渲染呈現給用戶。整個過程涉及兩個方面:解析和渲染。在渲染頁面以前,須要構建DOM樹和CSSOM樹。
在瀏覽器還沒接收到完整的 HTML
文件時,它就開始渲染頁面了,在遇到外部鏈入的腳本標籤或樣式標籤或圖片時,會再次發送 HTTP
請求重複上述的步驟。在收到 CSS
文件後會對已經渲染的頁面從新渲染,加入它們應有的樣式,圖片文件加載完馬上顯示在相 應位置。在這一過程當中可能會觸發頁面的重繪或重排。