面試題整理學習(一):在瀏覽器中輸入網址後的流程

面試題整理學習(一):在瀏覽器中輸入網址後的流程

       本篇部落格屬於整理性質的文章,貼出主要的參考連結在瀏覽器中輸入網址後都發生了什麼當你從瀏覽器位址列中輸入URL回車後發生了什麼

輸入網址後流程圖

1、瀏覽器發起DNS查詢請求

       在廣域網中是基於IP地址進行通訊的。但通常客戶訪問的是一個網址,為此需要先得到網址對應的IP地址,這就需要域名服務系統將域名轉換成IP地址。在客戶端瀏覽器中輸入網址時,瀏覽器會根據本地客戶端DNS伺服器配置,向DNS伺服器獲取域名對應的IP地址。
       域名解析伺服器是基於UDP協議實現的一個應用程式,通常通過監聽53埠來獲取客戶端的域名解析請求。

       DNS查詢過程為:
       瀏覽器快取->系統快取->路由器快取->ISP DNS快取->遞迴搜尋
       遞迴搜尋過程為:從根域名伺服器到頂級域名伺服器到所查詢的域名伺服器。


2、域名伺服器向客戶端返回查詢結果域名,從而完成域名到IP地址的轉換。


3、客戶端向web伺服器傳送HTTP請求

       得到了域名對應的IP地址後客戶端便可向真正的web伺服器發生HTTP請求。通常一個HTTP請求格式如下:

GET http://www.cricode.com/ HTTP/1.1
Host: www.cricode.com
Connection: keep-alive
Accept:text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8  

       

       如果瀏覽器儲存了該域名下的cookie,那麼cookie也會放入http請求中         

       HTTP請求是一個基於TCP協議之上的應用層協議——超文字傳輸協議。瀏覽器通過DNS獲取到web伺服器真的IP地址後,便向Web伺服器發起TCP連線請求,通過TCP三次握手建立好連線後,瀏覽器便可以將HTTP請求資料通過傳送給伺服器了。

      TCP三次握手連線:
      第一次握手:客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
      第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j 1),同時自己也傳送一個SYN包(syn=k),即SYN ACK包,此時伺服器進入SYN_RECV狀態;
      第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k 1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
     握手過程中傳送的包裡不包含資料,三次握手完畢後,客戶端與伺服器才正式開始傳送資料。理想狀態下,TCP連線一旦建立,在通訊雙方中的任何一方主動關閉連線之前,TCP 連線都將被一直保持下去。

4、伺服器給瀏覽器進行一個301永久重定向響應。

       IP對應的伺服器很可能是代理伺服器,比如輸入“http://baidu.com”,而不是“http://www.baidu.com”,這兩個網址對應的是同一個網頁,因此通過代理伺服器的方式進行重定向響應,讓這兩個網址訪問的同一個網頁。 瀏覽器根據重定向地址再次進行HTTP請求。

5、傳送響應資料給客戶端

      Web伺服器通常通過監聽80埠來獲取客戶端的HTTP請求。與客戶端建立好TCP連線後,Web伺服器開始接受客戶端發來的資料,並通過HTTP解碼,從接受到的網路資料中解析出請求的url資訊以前其他諸如Accept-Encoding、Accept-Language等資訊。
     Web伺服器根據HTTP請求頭的資訊,得到響應資料返回給客戶端。一個典型的HTTP響應頭資料包如下:

HTTP/1.1 200 OK
Date: Fri, 24 Oct 2014 13:55:18 GMT
Server: Apache
X-Powered-By: PHP/5.4.32
Keep-Alive: timeout=5, max=10000
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
a0f6
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=10,IE=9,IE=8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<title>快課網— 程式設計師的自我修養!</title>
<body class="home blog">
。。。。。。。
。。。。。。。
</body>
</html>

       至此,一個HTTP通訊過程完成。web伺服器會根據HTTP請求頭中的Connection欄位值決定是否關閉TCP連結通道,當Connection欄位值為keep-alive時,web伺服器不會立即關閉此連線。

6、瀏覽器響應過程

      瀏覽器收到響應內容之後,生成主頁框架,同時向服務端繼續傳送請求,請求的內容是主頁裡的一些資源,比如說圖片、視訊等。 對於靜態的頁面內容,瀏覽器通常進行快取,對於動態的內容通常不快取,快取的時間也是有期限的。
     瀏覽器向伺服器傳送非同步請求,因為有些頁面顯示完成之後客戶端仍需要與服務端保持聯絡。
     整個過程結束之後,瀏覽器關閉TCP連線。

TCP四次揮手斷開連線

     假設Client端發起中斷連線請求,即傳送FIN報文。Server端接到FIN報文後,意思是說”Client端沒有資料要傳送了”,但是如果Server端還有資料沒有傳送完成,則不必急著關閉Socket,可以繼續傳送資料。所以Server端先傳送ACK,告訴Client端”請求已經收到,但是Server端還沒準備好,請繼續等待訊息”。這個時候Client端進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端確定資料已傳送完成,則向Client端傳送FIN報文,告訴Client端”資料傳送完成,準備好關閉連線”。Client端收到FIN報文後知道可以斷開連線,但是怕Server端不知道要關閉,所以傳送ACK後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。Server端收到ACK後斷開連線。Client端等待了2MSL後依然沒有收到回覆,則證明Server端已正常關閉,則自身關閉連線。