最近在進行前端面試方面的一些準備,看了網上許多相關的文章,發現有一個問題始終繞不開: 在瀏覽器中輸入URL到整個頁面顯示在用戶面前時這個過程當中到底發生了什麼。仔細思考這個問題,發現確實很深,這個過程涉及到的東西不少。這個問題的回答真的可以很好的考驗一個web工程師的水平,因而特地抽出時間來總結一下。html
先給你們來張整體流程圖: 前端
整體來講分爲如下幾個過程:nginx
URL(Uniform Resource Locator),統一資源定位符,用於定位互聯網上資源,俗稱網址。web
scheme: // host.domain:port / path / filename ? abc = 123 # 456789
scheme - 定義因特網服務的類型。常見的協議有 http、https、ftp、file,
其中最多見的類型是 http,而 https 則是進行加密的網絡傳輸。
host - 定義域主機(http 的默認主機是 www)
domain - 定義因特網域名,好比 baidu.com
port - 定義主機上的端口號(http 的默認端口號是 80)
path - 定義服務器上的路徑(若是省略,則文檔必須位於網站的根目錄中)。
filename - 定義文檔/資源的名稱
query - 即查詢參數
fragment - 即 # 後的hash值,通常用來定位到某個位置
複製代碼
在瀏覽器輸入網址後,首先要通過域名解析,由於瀏覽器並不能直接經過域名找到對應的服務器,而是要經過 IP 地址。面試
IP 地址apache
IP 地址是指互聯網協議地址,是 IP Address 的縮寫。IP 地址是 IP 協議提供的一種統一的地址格式, 它爲互聯網上的每個網絡和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的差別。設計模式
什麼是域名解析瀏覽器
DNS 協議提供經過域名查找 IP 地址,或逆向從 IP 地址反查域名的服務。 DNS 是一個網絡服務器,咱們的域名解析簡單來講就是在 DNS 上記錄一條信息記錄。緩存
瀏覽器如何經過域名去查詢 URL 對應的 IP 呢?服務器
DNS域名解析分爲遞歸查詢和迭代查詢兩種方式,現通常爲迭代查詢。
小結
瀏覽器經過向 DNS 服務器發送域名,DNS 服務器查詢到與域名相對應的 IP 地址,而後返回給瀏覽器,瀏覽器再將 IP 地址打在協議上,同時請求參數也會在協議搭載,而後一併發送給對應的服務器。接下來介紹向服務器發送 HTTP 請求階段,HTTP 請求分爲三個部分:TCP 三次握手、http 請求響應信息、關閉 TCP 鏈接。
擴展:DNS優化
在客戶端發送數據以前會發起 TCP 三次握手用以同步客戶端和服務端的序列號和確認號,並交換 TCP 窗口大小信息。
TCP 三次握手的過程以下:
爲啥須要三次握手 謝希仁著《計算機網絡》中講「三次握手」的目的是「爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤」。
TCP 三次握手結束後,開始發送 HTTP 請求報文。 請求報文由請求行(request line)、請求頭(header)、請求體四個部分組成,以下圖所示:
請求行包含請求方法、URL、協議版本
POST /chapter17/user.html HTTP/1.1
以上代碼中「POST」表明請求方法,「/chapter17/user.html」表示URL,「HTTP/1.1」表明協議和協議的版本。如今比較流行的是 Http1.1 版本
請求頭包含請求的附加信息,由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號「:」分隔。
請求頭部通知服務器有關於客戶端請求的信息。它包含許多有關的客戶端環境和請求正文的有用信息。其中好比:Host,表示主機名,虛擬主機;Connection,HTTP/1.1 增長的,使用 keepalive,即持久鏈接,一個鏈接能夠發多個請求;User-Agent,請求發出者,兼容性以及定製化需求。
請求體,能夠承載多個請求參數的數據,包含回車符、換行符和請求數據,並非全部請求都具備請求數據。
name=tom&password=1234&realName=tomson
上面代碼,承載着 name、password、realName 三個請求參數。
每臺服務器上都會安裝處理請求的應用——Web server。常見的web server產品有apache、nginx、IIS、Lighttpd等。但大部分都仍是按照 MVC 設計模式進行搭建的。
爲避免篇幅過長,瀏覽器渲染相關內容請參閱: 【瀏覽器】渲染原理探究
當數據傳送完畢,須要斷開 tcp 鏈接,此時發起 tcp 四次揮手。
後記: 小夥伴們,若是有錯誤或者不嚴謹的地方,請務必給予指正,十分感謝。若是以爲本文還不錯,記得點個贊哦! 本文首發地址爲: Vae's Blog