瀏覽器中輸入url後發生的事情

2021-09-25 10:54:28 字數 3827 閱讀 1358

瀏覽器中輸入url後發生的事情有什麼?這是面試的時候可能會遇到的問題,下面是我根據從**http和網上的部落格中學習整理的過程,如果哪一步有問題,希望正指出來,十分感謝。

輸入url後可以大概分為六個部分

dns網域名稱解析

建立tcp連線

發起http請求

接受響應結果shu

瀏覽器解析html

瀏覽器布局渲染

在說明這之前我們需要知道資料傳輸的層次順序

(圖一選自**http協議1.3.3 tcp/ip 通訊傳輸流)

資料根據傳輸的層次根據層層的封裝傳送到伺服器中,在又伺服器層層解封來

1.1 dns產生背景答案是因為ip位址無論是32位還是128位都是定長的,而網域名稱長度則是不固定的,主機處理起來比較麻煩,所以需要ip位址。

到了現代,理論上我們能用乙個伺服器儲存所有的有關主機名和ip位址的對映,可惜想法很美好,但是現在的網際網路規模已經不能同日而語了,如果只有一台伺服器,它會因為負荷過大而無法執行,而這台伺服器一旦無法執行,整個網際網路就會big-bang了。

睿智的攻城獅早再2023年規定了網域名稱的樹裝層次命名,並且使用分布式的dns網域名稱系統。

早起的網際網路使用了非等級的名字結構,其優點是名字簡短。但是當網際網路上的使用者數急劇增加時,用非等級的名字空間來管理乙個很大的而且是經常變化的名字集合是非常困難的。因此,網際網路後來就採用了層次樹狀結構的命名方法。採用這種命名方法,任何乙個連線在網際網路上的主機或路由器,都有乙個唯一的層次結構的名字,即網域名稱。這裡「域」是名字空間中間中乙個可被管理的劃分。域可以劃分為子域,而子域還可以繼續劃分為子域的子域,就這樣就形成了頂級域,二級域,**域,等等。如下圖所示。

上圖出自計算機網路第七版

dns規定:網域名稱中的標號由英文本母和數字組成,每乙個標號不超過63個字元(但為了方便記憶,最好不要超過12個字元),也不區分大小寫字母。標號中除連線字元外不能使用其他的標點符號。級別最低的網域名稱寫在最左邊,而級別最高的頂級網域名稱寫在最右邊。由多個標號組成的完整網域名稱總共不超過266個字元。

dns既不規定乙個網域名稱需要包含多少下級網域名稱,也不規定每一級的網域名稱代表什麼意思。各級網域名稱由其上一級的網域名稱管理機構管理,而最高端的頂級網域名稱管理機構則由icann進行管理。用這種方法可使每乙個網域名稱在整個網際網路範圍內是唯一的,並且也容易設計出一種查詢網域名稱的機制。

需要注意的是,網域名稱只是個邏輯概念,並不代表計算機所在的物理地點。變長的網域名稱和使用有助記憶的字串,是為了便於人使用。而ip位址是定長的32位二進位制進製數字則非常便於機器進行處理。這裡需要注意,網域名稱中的「點」和點分十進位制ip位址中的點並無一一對應的關係。點分十進位制ip位址中一定是包含三個點,但是每乙個網域名稱中的點的數目不一定是三個。

我們可以用一顆樹來形象的表示網域名稱系統

上面是乙個n叉樹,每乙個父節點的網域名稱管理下面的子節點的網域名稱,就這樣分下去,直到樹葉是乙個個計算機,一旦某個單位有了自己的網域名稱自己就可以決定是否往下分割,而不必向上級網域名稱請示。網域名稱樹的樹葉就是單台計算機的名字,它不能再繼續往下劃分了。網際網路的網域名稱劃分是按照機構的組織來劃分的,與物理的網路無關,與ip位址中的子網也沒關係。

1.3網域名稱伺服器

上面的網際網路網域名稱空間是邏輯上,而現實中,我們既不需要那麼多網域名稱伺服器,會使效率降低,因此dns使用劃分區的方式解決這個問題。

乙個區就是乙個伺服器負責的範圍,區中的節點要保證互相連通,每個區都有乙個許可權網域名稱伺服器,實際上dns是以區為單位而不是以域為單位的。

下面的例子節選自《計算機網路第七版》

實際上筆者開始也對dns的伺服器的單位有誤會,誤以為每乙個域都要配乙個伺服器,實際上不需要。(汗)

搞完了上面的基礎概念,我們可以對dns幹的事情進行討論了。

1.4網域名稱解析過程

這裡要了解兩個概念,遞迴查詢和迭代查詢。

迭代查詢是指:一般是主機向本地網域名稱伺服器查詢方式,當本地網域名稱伺服器向根伺服器請求查詢的網域名稱,根伺服器告訴本地伺服器下一步應該去哪個頂端伺服器查詢,將該頂端伺服器的ip告訴本地網域名稱伺服器,到了該頂端伺服器要麼把該網域名稱解析的ip位址告訴本地網域名稱伺服器,要麼告訴本地網域名稱伺服器,下一步應該到哪個二級網域名稱伺服器,依次類推直到找到網域名稱對應的ip位址,然後把這個ip位址發給主機。

遞迴查詢是指:一般是本地網域名稱伺服器向根網域名稱伺服器查詢方式,如果主機詢問的本地網域名稱伺服器不知道ip位址,本地網域名稱伺服器以dns客戶的身份向根網域名稱傳送dns請求報文,而不是讓該主機進行查詢。

其實筆者在寫這個查詢時腦袋是暈暈的,看不出兩個查詢有什麼區別,不過加上下面這幅圖應該能看明白。

所謂的迭代查詢,使讓本地網域名稱伺服器來乙個個訪問其他的網域名稱伺服器直到找到ip,而遞迴查詢是讓每個相應主機,自己查詢下一層的網域名稱伺服器直到找到ip,將結果返回個主機。

總結起來就是 自己動 和 自己躺著別人動的區別(φ(≧ω≦*)♪)

順便說一下,本地網域名稱伺服器也是有記憶的,如果它在自己的記錄裡找到了對應的ip位址,就不會向根網域名稱伺服器傳送dns請求報文,如果記錄裡雖然沒有ip位址但是又頂端網域名稱伺服器的ip,也不會向根網域名稱伺服器傳送dns請求報文,而是直接向頂端網域名稱伺服器傳送dns請求報文,這樣做可以達到的減少網路負擔,每隔一段時間,網域名稱伺服器就會從快取中刪掉,又重新查詢,為了內容正確。

瀏覽器先檢查自身快取中有沒有被解析過的這個網域名稱對應的ip位址,如果有,解析結束。同時網域名稱被快取的時間也可通過ttl屬性來設定。

如果瀏覽器快取中沒有(專業點叫還沒命中),瀏覽器會檢查作業系統快取中有沒有對應的已解析過的結果。而作業系統也有乙個網域名稱解析的過程。在windows中可通過c盤裡乙個叫hosts的檔案來設定,如果你在這裡指定了乙個網域名稱對應的ip位址,那瀏覽器會首先使用這個ip位址。

如果至此還沒有命中網域名稱,才會真正的請求本地網域名稱伺服器(ldns)來解析這個網域名稱,這台伺服器一般在你的城市的某個角落,距離你不會很遠,並且這台伺服器的效能都很好,一般都會快取網域名稱解析結果,大約80%的網域名稱解析到這裡就完成了。

如果ldns仍然沒有命中,就直接跳到root server 網域名稱伺服器請求解析

根網域名稱伺服器返回給ldns乙個所查詢域的主網域名稱伺服器(gtld server,國際頂尖網域名稱伺服器,如.com .cn .org等)位址

此時ldns再傳送請求給上一步返回的gtld

name server根據對映關係表找到目標ip,返回給ldns

ldns快取這個網域名稱和對應的ip

ldns把解析的結果返回給使用者,使用者根據ttl值快取到本地系統快取中,網域名稱解析過程至此結束

下面為相應的流程圖。

得到了ip位址後,

(圖2選自**http協議1.6 各種協議與 http 協議的關係)

瀏覽器中輸入url請求之後發生的事情?

1.請求一旦發起 比如 www.baidu.com 瀏覽器第一件事就是 解析這個網域名稱,瀏覽器先檢視本地硬碟的hosts檔案,看看其中有沒有和這個網域名稱對應的規則,如果有的話,就直接使用hosts檔案裡面的ip位址 如果沒有,瀏覽器就會發出乙個dns請求到本地dns伺服器。本地dns伺服器一般就...

瀏覽器url中輸入位址後發生什麼事情?

1.dns網域名稱解析 如果直接查詢dns伺服器沒有找到對應的ip位址,就會向上級伺服器詢問,這樣一層一層的向上級找,最高可到達根結點,直到找到或者全部找不到位置。2.建立tcp連線 簡稱三次握手 第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn sent狀態,等待伺服...

瀏覽器中輸入url後,發生的事情(經典面試題)

這是乙個經典的面試題,沒有固定答案,越詳細越好 我們在瀏覽器中輸入 瀏覽器查詢網域名稱對應的ip位址 dns查詢過程為 瀏覽器快取 系統快取 路由器快取 isp dns快取 遞迴搜尋 遞迴搜尋過程為 從根網域名稱伺服器到頂級網域名稱伺服器到你查詢的網域名稱伺服器。瀏覽器開啟tcp連線 預設埠為80 ...