HTTP請求過程-域名解析和TCP三次握手建立連結
我們在瀏覽器輸入http://www.baidu.com想要進入百度首頁,但是這是個域名,沒法準確定位到伺服器的位置,所以需要通過域名解析,把域名解析成對應的ip地址,然後通過ip地址查詢目的主機。整個訪問過程可以概括為:
- 域名解析
- 發起TCP三次握手建立連線
- 建立連線後發起http請求
- 伺服器響應請求,瀏覽器獲取html原始碼
- 瀏覽器解析html程式碼,並請求相關css,js和圖片資源
- 瀏覽器渲染頁面
一、域名解析過程
在瀏覽器輸入一串域名要訪問某網站的時候,瀏覽器幫我們做了如下事情(以Chrome瀏覽器和windows系統為例):
- Chrome瀏覽器首先檢查自己本地是快取是否有對應的域名,有則直接使用。【檢視Chrome瀏覽器dns快取地址:chrome://net-internals/#dns
- 如果瀏覽器快取中沒有,則查詢系統DNS快取中的域名錶,有則直接使用。【windows檢視域名錶的命令:ipconfig /displaydns】
- 系統快取中還是沒有,則檢查hosts檔案中的對映表。【windows中hosts檔案路徑:C:\Windows\System32\drivers\etc】
- 本地實在找不到,則向DNS域名伺服器發起請求查詢。【DNS伺服器IP是本地配置的首選伺服器,一般常用的有114.114.114.114(電信運營商提供)和8.8.8.8(Google提供)】
-
-
- DNS伺服器首先查詢自身的快取,有對應的域名ip則返回結果
- 如果快取中查詢不到,DNS伺服器則發起迭代DNS請求,首先向根域伺服器發起請求查詢,假如本次請求的是www.baidu.com,根域伺服器發現這是一個com的頂級域名,就把com域的ip地址返回給DNS伺服器
- DNS伺服器向com域ip地址發起請求,查詢該域名的ip,此時該伺服器返回了baidu.com的DNS地址。
- 最後DNS伺服器又向baidu.com的DNS地址發起查詢請求,最後找到了完整的ip路徑返回給DNS伺服器,DNS再把ip資訊返回給windows核心,核心再返回給瀏覽器,於是瀏覽器就知道該域名對應的ip地址了,可以開始進一步請求了。
-
--------------------------------------------------------------------------------------------------------------------------
DNS請求原理:
每個域名用小數點分隔開變成多級,從右到左等級逐級遞減,所以最右邊的等級最高,每個域都有用一個域名伺服器,管理則下屬域名,分佈如下圖:
所以DNS傳送查詢請求的時候,先從根伺服器獲對應頂級域名的ip,然後再逐級從定義域名ip向下查詢各個下屬域服務的,找到完整的域名ip。這是一個迭代查詢的過程。
--------------------------------------------------------------------------------------------------------------------------
總的來說:域名解析的過程就是一個由近及遠的過程,採取就近原則,再自頂向下搜尋。
【如果連DNS伺服器也沒解析成功,那麼進行如下步驟:】
⑤ 作業系統就會查詢NetBIOS name Cache(NetBIOS名稱快取,就存在客戶端電腦中的),那這個快取有什麼東西呢?凡是最近一段時間內和我成功通訊的計算機的計算機名和Ip地址,就都會存在這個快取裡面。什麼情況下該步能解析成功呢?就是該名稱正好是幾分鐘前和我成功通訊過,那麼這一步就可以成功解析。
⑥ 如果第⑤步也沒有成功,那會查詢WINS 伺服器(是NETBIOS名稱和IP地址對應的伺服器)
⑦ 如果第⑥步也沒有查詢成功,那麼客戶端就要進行廣播查詢
⑧ 如果第⑦步也沒有成功,那麼客戶端就讀取LMHOSTS檔案(和HOSTS檔案同一個目錄下,寫法也一樣)
如果第八步還沒有解析成功,那麼就宣告這次解析失敗,那就無法跟目標計算機進行通訊。只要這八步中有一步可以解析成功,那就可以成功和目標計算機進行通訊。
二、建立TCP連線
第一次握手:客戶端向伺服器傳送SYN報文,併發送客戶端初始序列號Seq=X;等待伺服器確認,
第二次握手:伺服器接收客戶端的SYN報文,然後向客戶端返回一個包SYN+ACK響應報文,併發送初始序列號Seq=Y
第三次握手:客戶端接受SYN+ACK報文,並向伺服器傳送一個ACK確認報文,至此連線建立
【建立連線的最重要目是讓連線的雙方交換初始序號(ISN, Initial Sequence Number),所以再響應的ACK報文中會包含序列號遞增序列】