1. 程式人生 > >在瀏覽器上請求一個URL的全部過程

在瀏覽器上請求一個URL的全部過程

  當我們在瀏覽器中輸入一個網址的時候主要經過了六個步驟來最終把網頁完整的展現給我們。

  • 第一步要進行的就是域名解析

我們在瀏覽器中輸入的是一個www.baidu.com,瀏覽器首先要做去獲得我們想訪問網頁的IP地址,瀏覽器會發送一個UDP的包給DNS域名解析伺服器。DNS就會返回給我們百度的IP地址,通常來說瀏覽器會把訪問過的網站的IP儲存下來,這樣下次訪問的時候就會快很多,能夠節省很多時間。

通常來說在解析域名的時候,瀏覽器就會先看看自己本地的host檔案,來看看裡邊有沒有和域名對應的IP地址,如果有就直接使用,如果沒有的話瀏覽器就會發送一個請求到本地的DNS伺服器,本地的DNS伺服器一般來說都是由網路接入商提供的,比如中國電信等。當本地的DNS伺服器收到請求之後會,DNS也會先查詢自己的快取,這個過程是遞迴查詢的,如果快取中存在就會直接返回,如果這時候還是沒有找到對應的IP本地的DNS伺服器就向根DNS伺服器傳送請求進行查詢。根DNS伺服器上是沒有記錄哪個域名和IP的對應關係的,他會告訴本地的DNS伺服器。你可以到域伺服器上進行查詢,並且告訴他這個域伺服器的地址,這個過程是迭代查詢的。這時候本地的DNS伺服器會向域伺服器傳送請求,這裡我們請求的是www.baidu.com也就是.com的域名伺服器,當.com域伺服器收到請求之後,並不會直接返回域名和IP的關係,而是會告訴你的域名的解析伺服器的地址,最後本地的DNS伺服器向域名的解析伺服器傳送請求,這時候就能收到一個域名和IP的對應關係,本地的DNS伺服器不僅吧這個返回給使用者和電腦而且還會自己儲存下來,這樣下次再訪問的時候就能直接返回

DNS 域名系統就和我們常用的電話本一樣,我們很難記住每個人的手機號,這時候我們只用把他存起來,下次再簡單的時候看這些備註我們就知道是誰了。DNS伺服器在查詢的時候主要有兩種方式:

  1. 遞迴查詢方式

當局部的DNS伺服器不能回答請求的時候,他就需要向其他DNS伺服器傳送請求

區域性伺服器DNS自己向其他伺服器進行查詢,一般來說先向該域名的根域伺服器進行查詢,然後再由根域名伺服器向下進行查詢,最後得到結果之後返回給區域性伺服器,然後再由區域性伺服器返回給我們的客戶端。

     2.迭代查詢的方式

迭代查詢的方式就是,區域性的DNS伺服器並不會自己向其他伺服器進行查詢,而是把能夠解析該域名的伺服器IP地址返回給客戶端,客戶端會不斷的向這些伺服器進行查詢,直到查詢到了位置,迭代的話只會幫你找到相關的伺服器,然後說我現在比較忙,你自己去找吧。

DNS還有負載均衡的作用,現在很多網站都有多個伺服器,當一個網站訪問量過大的時候,如果所有請求都請求在同一個伺服器上,可能伺服器就會崩掉,這時候就用到了DNS負載均衡技術,當一個網站有多個伺服器地址時,在應答DNS查詢的時候,DNS伺服器會對每個查詢返回不同的解析結果,也就是返回不同的IP地址,從而把訪問引導到不同的伺服器上去,來達到負載均衡的目的。例如可以根據每臺機器的負載量,或者該機器距離使用者的地理位置距離等等條件。

   之後我們就可以去建立HTTP協議連結,但是HTTP連結是必須建立在TCP連結上邊的,但是想要建立TCP連結的話是需要四個東西:本機IP,伺服器IP,本機埠,伺服器埠現在已經有本機IP和伺服器IP了,本機埠會由作業系統隨機給瀏覽器分配一個,而伺服器埠用的是一個眾所周知的埠,HTTP的預設埠就是80,這時候我們就具備了進行TCP連結的條件。

  • 進行三次握手建立TCP連結。

我們都知道在建立TCP連結的時候需要進行三次握手,當三次握手成功的時候TCP連結算是成功建立了,這時候就可以傳送HTTP請求了。

  • 當HTTP協議經過多個路由器成功到達了伺服器之後,這時候伺服器就要去處理瀏覽器發來的請求。

伺服器在處理請求的時候主要有三種方式:第一種是用一個執行緒來處理所有的請求,並且同時只能處理一個請求,但是這樣的話效能是非常的低的。第二種是每一個請求都給他分配一個執行緒但是當連結和請求比較多的時候就會導致伺服器的cpu不堪重負。第三種就是採用複用I/O的方式來處理例如通過epoll方式監視所有連結當連結狀態發生改變的時候才去分配空間進行處理。

  • 處理完請求之後向瀏覽器返回網頁的html

   當伺服器把檔案資料傳送給瀏覽器之後,能夠直接關閉TCP嗎?如果你是使用的是HTTP1.1這個版本下預設的方式是keep-alive這時候TCP是不關閉的,如果在1.0版本下有keep-alive關鍵字也是不能進行關閉的。

  • 解析HTML

當瀏覽器收到HTML之後會對其進行解析,在這個過程中可能這個HTML頁面引用了大量的js、css、圖片等檔案,這些資源可能在剛剛的伺服器上也可能在其他的伺服器上,這時候瀏覽器就會和上邊步驟一樣去請求這些資源,如果需要下載的資源太多,瀏覽器會同時建立多個TCP連結去獲取資源,但是同一時間對同一域名下請求數量也不能過多,不然伺服器訪問量過大,難以承受負載,這時候瀏覽器就要對其進行控制,例如在chrome瀏覽器HTTP1.1版本下同時允許最多建立六個TCP連結,在伺服器傳送這些js、css檔案的時候通常會告訴瀏覽器他什麼時候會過期,瀏覽器就可以把這些檔案快取到本地,在這些檔案還沒有過期之前就可以直接從快取中進行訪問。

  • 斷開TCP連線

當我們資料傳輸結束的時候,我們就可以斷開TCP連線。

這時候我們的網頁就完整的展現在我們的瀏覽器上了。