在瀏覽器中輸入 URL 之後,它會執行以下幾個流程:
執行 DNS 域名解析;
封裝 HTTP 請求封包;
封裝 TCP 請求封包;
建立 TCP 連線(3 次握手);
引數從使用者端傳遞到伺服器端;
伺服器端得到使用者端引數之後,進行相應的業務處理,再將結果封裝成 HTTP 包,返回給使用者端;
伺服器端和使用者端的互動完成,斷開 TCP 連線(4 次揮手);
瀏覽器通過自身執行引擎,渲染並展示最終結果給使用者。
在網路中定位是依靠 IP 進行身份定位的,所以 URL 存取的第一步便是先要得到伺服器端的 IP 地址。而得到伺服器的 IP 地址需要使用 DNS(Domain Name System,域名系統)域名解析,DNS 域名解析就是通過 URL 找到與之相對應的 IP 地址。
PS:為什麼不直接存取 IP 地址來請求伺服器?因為 IP 地址很長,不方便記憶,而 URL 地址好記很多,所以會使用 URL 來替代 IP 地址,而 URL 就像 IP 地址的別名一樣,用它可以定位到相應的 IP 地址。
DNS 域名解析的大致流程如下:
一個 HTTP 請求物件包含 4 部分內容:
它的基本格式如下:
在得到了伺服器 IP 之後,緊接著會將原生的請求封裝成一個 HTTP 封包,如上圖所示。
HTTP 底層是依賴 TCP/IP 協定實現的,所以在底層資料傳輸時,會將 HTTP 請求包進一步封裝成 TCP 封包。
HTTP 通訊的基礎是 TCP 連線,TCP 連線需要 3 次握手,3 次握手就是為了驗證使用者端的傳送能力和接收能力,以及伺服器端的發生能力和接收能力,就像打電話一樣,通常的通話是這樣開頭的:
經過以上 3 次握手就可以證明使用者端的傳送能力和接收能力,以及伺服器端的發生能力和接收能力,這樣就可以正式開始通訊了。
資料在經過 TCP 傳到到伺服器程式之後,又會將 TCP 的封包轉換成 HTTP 封包(這一切都是 TCP/IP 協定的功勞),這樣伺服器端就可以得到使用者端傳送的請求資料了。
伺服器端拿到了使用者端的請求引數之後,會進行相應的業務處理,處理完成之後,再將處理的結果返回給使用者端。返回的流程和傳送的流程類似,先將結果封裝成 HTTP 封包,HTTP 封包可分為以下 4 部分:
它的基本格式如下:
狀態行用於描述伺服器的返回狀態,它由 3 部分組成:
常見的狀態碼有以下幾個:
響應正文就是返回給使用者端的所有資料。
在經過一次請求和一次響應之後,使用者端和伺服器的「交流」就結束了,此時就可以執行 TCP 連線斷開的流程了,它需要 4 次揮手:
經過了以上流程之後,TCP 的連線就斷開了。
經過 TCP 互動之後,使用者端也得到了伺服器端返回的資料,然後使用瀏覽器自身的執行引擎,將最終的結果展示給使用者,整個執行流程就結束了。
zhuanlan.zhihu.com/p/58108010
是非審之於己,譭譽聽之於人,得失安之於數。
公眾號:Java面試真題解析