1. 程式人生 > >HTTP請求過程-域名解析和TCP三次握手建立連結

HTTP請求過程-域名解析和TCP三次握手建立連結

  我們在瀏覽器輸入http://www.baidu.com想要進入百度首頁,但是這是個域名,沒法準確定位到伺服器的位置,所以需要通過域名解析,把域名解析成對應的ip地址,然後通過ip地址查詢目的主機。整個訪問過程可以概括為:

  1. 域名解析
  2. 發起TCP三次握手建立連線
  3. 建立連線後發起http請求
  4. 伺服器響應請求,瀏覽器獲取html原始碼
  5. 瀏覽器解析html程式碼,並請求相關css,js和圖片資源
  6. 瀏覽器渲染頁面

一、域名解析過程

  在瀏覽器輸入一串域名要訪問某網站的時候,瀏覽器幫我們做了如下事情(以Chrome瀏覽器和windows系統為例):

  1. Chrome瀏覽器首先檢查自己本地是快取是否有對應的域名,有則直接使用。【檢視Chrome瀏覽器dns快取地址:chrome://net-internals/#dns
  2. 如果瀏覽器快取中沒有,則查詢系統DNS快取中的域名錶,有則直接使用。【windows檢視域名錶的命令:ipconfig /displaydns】
  3. 系統快取中還是沒有,則檢查hosts檔案中的對映表。【windows中hosts檔案路徑:C:\Windows\System32\drivers\etc】
  4. 本地實在找不到,則向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報文中會包含序列號遞增序列】

三、http請求和瀏覽器渲染過程

  請參考:http://www.cnblogs.com/caijh/p/7661402.html