面試時經常被問到:瀏覽器訪問一個頁面的時候背后的步驟是怎樣的?
我往往是把HTTP請求和響應講了一下。
現在想想,感覺僅僅回答HTTP請求和響應有點太窄了。
所以,這里主要從計算機網絡的角度將瀏覽器訪問一個頁面的背后的過程進行一個較為詳細的解讀。
域名->IP
當在瀏覽器中訪問一個網址的時候,首先要做的就是找到域名所對應的服務器的IP地址。
瀏覽器通常有三個途徑來找IP地址。
-
緩存。包括瀏覽器的DNS緩存和OS的DNS緩存。
-
HOST文件。瀏覽器會去本地的HOST文件中尋找域名對應的IP地址。
-
域名服務器查詢。向本地域名服務器求助(一般是路由器),如果得不到還得向更高層次的域名服務器(根域名服務器、頂級域名服務器、權限域名服務器)求助。本地域名服務器向高級域名服務器查詢可以是迭代查詢或遞歸查詢。
HTTP
得到服務器的IP地址后,需要向服務器請求所要加載網頁的資源(HTML文件、圖片等)。
這些資源的請求和獲取可以通過HTTP完成。
而HTTP協議位於應用層,其是建立在傳輸層的TCP協議的基礎之上。
想要完成HTTP請求和響應還需要通過TCP建立一個瀏覽器跟服務器的連接。
TCP連接
HTTP的默認端口是80。
HTTPS的默認端口是443。
當沒有特別指定的時候,服務器的端口就是默認端口。
瀏覽器的請求方端口是動態端口(范圍49152~65535),並不固定。
TCP連接的建立需要通過“三次握手”來完成。
而TCP連接的建立還需要通過許多傳輸層以下協議棧的協議來提供支持:
-
需要通過網絡層IP協議來完成瀏覽器所在主機到服務器主機間的數據傳輸。
-
需要通過ARP協議完成IP地址到硬件地址的解析。
-
需要通過OSPF(一種內部網關協議)完成路由選擇。
-
......
HTTP
當建立起TCP連接后,就可以發送HTTP請求了。
瀏覽器向服務器發送一個HTTP請求來請求資源。
服務器收到一個HTTP請求后,對請求進行相應的處理,比如說身份的驗證、根據用戶身份確定資源的具體內容(比如用戶的個人信息頁面,根據用戶ID從數據庫獲取相應信息再生成html文件)。
在完成相應的處理后,通過HTTP響應將資源發送給瀏覽器。
當然,有可能在處理的時候發生一些情況,比如說:用戶身份驗證失敗,該用戶身份不夠權限訪問該資源,服務器處理過程中出現錯誤等。
所以,在HTTP響應中還要加入相應的狀態碼以告訴瀏覽器當前請求的處理狀態。
在HTTP響應后,面臨着是否釋放TCP連接的問題。這就是HTTP中的長連接和短連接問題。
-
短連接在客戶端和服務器進行一次HTTP操作后就中斷連接。
-
長連接在客戶端和服務器進行HTTP操作后的一定時間內仍保持連接。
-
HTTP 1.0默認是短連接。
-
HTTP 1.1默認是長連接。
-
可以通過頭部字段Connection來決定長連接(keep-alive)或是短連接。
TCP的釋放
TCP連接的釋放需要通過“四次揮手”來完成。
瀏覽器的渲染
當瀏覽器收到服務器返回的HTTP響應后,需要對HTTP響應的內容進行解析,並渲染到屏幕上。
例如,HTTP響應的內容是一個HTML文件,那么瀏覽器對HTML文件進行解析,並把其表示的內容渲染到屏幕上。HTML文件中可能還包含了外部文件,比如說圖片,那么還要再重復一下之前的過程,再從服務器中獲取該文件。
緩存
瀏覽器可以對拿到手的資源進行緩存,避免對一個資源的重復請求獲取,節約時間提升性能。
資源的緩存狀態是由HTTP header來決定的。
瀏覽器緩存可以分為兩類:強緩存和協商緩存
強緩存:上一次的HTTP交互中,服務器通知了瀏覽器一個緩存時間,在該時間內對該資源的請求都可以直接使用緩存。
協商緩存:向服務器發送請求,服務器會根據這個請求的request header的參數來判斷是否命中,如果命中則返回304狀態碼告訴瀏覽器可以直接使用緩存,否則就重新處理請求並返回資源。
判斷命中與否主要是通過對request header中的If-Modified-Since和Etag字段與服務器上資源的信息進行比對分析得出的。
--------------------文章二---------------------

--------------------文章三--------------------
瀏覽器訪問一個網站所經歷的步驟
1.PC 在瀏覽器輸入域名
2.域名通過DNS服務解析域名,然后DNS服務器返回http服務的IP地址
3.瀏覽器獲得域名對應的IP地址后,發起HTTP“三次握手”
4.TCP/IP連接建立起來后,瀏覽器就可以向服務器發送HTTP請求了。(使用了比如說,用HTTP的GET方法請求一個跟域名,協議可以采用HTTP1.0。)
5.服務器端接受到了這個請求,根據路徑參數,經過后端的一些處理之后,把處理后的一個結果的數據返回給瀏覽器。如果是慕課網的頁面就會把完整的HTML頁面代碼返回給瀏覽器。
6.瀏覽器拿到了簡書網的完整的HTML頁面代碼,在解析和渲染這個頁面的時候,里面的JS、CSS、圖片靜態資源,他們同樣也是一個個HTTP請求都需要經過上面的主要的七個步驟。
7.瀏覽器根據拿到的資源對頁面進行渲染,最終把一個完整的頁面呈現給了用戶。