【計算機網絡】輸入網址到網頁顯示的整個流程

                            輸入網址到網頁顯示的整個流程

最近在看一些大廠的筆經面經時,經常看到這個問題,索性在今天也把自己學習的知識整理一下。


第一步:首先你得在瀏覽器中輸入網址,比如輸入www.baidu.com。其中www爲主機,baidu爲域名,com爲類型。但是有網址不能直接找到對應的響應主機,必須把網址,即域名轉化爲ip地址。


第二步:進行DNS(Domain Name System,域名系統)查詢,它的作用是將域名轉化爲具體的ip地址。

先談一下DNS的結構:

(1)根域名服務器,全球只有13個不同ip地址的服務器,注意不是服務器只有13臺,只是他們所代表的地址只有13個,也就是存在鏡像服務器,一個地址可以對應多個鏡像服務器。

(2)根域名服務器之下的頂級域名服務器,如com、net、cn、gov等。

(3)頂級域名服務器之下的權威服務器,比如baidu、facebook等。

(4)權威服務器之下的資源記錄,比如www、ftp、mail等。

查詢的過程如下:

(1)首先會在瀏覽器緩存中去查詢,之前每瀏覽一個網站,瀏覽器都會在緩存中存有域名與ip地址的映射關係。不過緩存失效的時間不由瀏覽器決定,而由操作系統決定。

(2)瀏覽器緩存中查詢不到後,之後會在系統緩存中查詢,由瀏覽器發起一個系統調用,查詢系統緩存中的數據。

(3)系統緩存中也查詢不到後,將會去路由器緩存中查找。

(4)路由器緩存中也找不到的話,將會從本地DNS服務器的緩存中查找,本地服務器即用戶自己配置的DNS服務器。

(5)如果本地的DNS服務器也找不到的話,本地DNS將會發送請求至根域名服務器,根域名服務器中沒有相關緩存數據的時候,就會返回com頂級域名服務器的地址。然後本地DNS服務器再發送請求至com頂級域名服務器,com頂級域名服務器中查詢不到的話,就會返回baidu權威服務器的地址,然後本地DNS服務器再發送請求至baidu權威服務器,baidu權威服務器就會返回www主機地址。(這是一種迭代的過程,還有一種遞歸的過程。即local至根域名,根域名不直接返回com地址,而是發送請求至com,com發送請求至baidu,baidu發送請求至www,www再返回給baidu,baidu返回給com,com再返回給local)至此,整個DNS查詢步驟結束,現在瀏覽器拿到了域名對應的ip地址。


第三步:瀏覽器發送請求至服務器,假設我們現在輸入的地址是www.baidu.com,那麼瀏覽器默認將網址改成這樣的形式,即http://www.baidu.com。

發送格式如下:

發現返回了307狀態碼,也就是臨時重定向,需要我們重定向到location表明的地址,即https://www.baidu.com。仔細觀察,僅僅多了個s,也就是說http與https之間是有差別的,關於兩個的區別,請移步我的另外一篇文章淺析HTTP與HTTPS的區別

307與301、302本質上差不多,但是有細微的差別,簡單來說是爲了增強301與302的規範性。其他差別這裏不做深究,可以參考HTTP狀態碼302、303和307的故事


第四步:瀏覽器向重定向後的地址發送請求

發送的請求格式如下:

可以看得出:

(1)Request Method表明請求方式是get。

(2)User-Agent,用戶代理,表明所用瀏覽器的一些信息,包括內核,版本等。

(3)Connection:keep-alive表明需要服務器爲之後的請求保持tcp連接

(4)Cookie中保存了一些與用戶狀態相關的數值,可以與session連用來跟蹤會話,那麼有關cookie與session的內容,可以參考我的另外一篇文章【計算機網絡】Cookie與Session的區別


第五步:服務器處理http請求

服務器可以根據Cookie中的數據,通過遍歷內存中的Session集合,從而判斷用戶的登錄狀態。如果用戶未登錄,則展示一些諸如首頁的基本宣傳數據。如果用戶已經登錄,通過解析get請求頭、post請求體中的參數,查詢數據庫,返回用戶相關數據,填充到視圖中。並將此次處理完的內容通過相應的壓縮算法,壓縮成某個塊。


第六步:服務器返回http響應

服務器返回的響應格式如下:

其中有些鍵值対表明:

(1)Content-Encoding的值是gzip,表明響應體使用了gzip方式壓縮了,瀏覽器也需要使用gzip算法進行解壓縮,解壓縮響應體後,產生如下的內容

(2)Content-Type的值是text/html,表明服務器需要瀏覽器將次內容以html文本的形式顯示出來,而不是以文件形式去下載它


第七步:瀏覽器請求樣式以及圖片文件,用以渲染界面並顯示給用戶

瀏覽器解壓縮響應體後,在界面顯示的同時,下載css、png、gif等一些靜態文件,這些靜態文件可以被瀏覽器緩存,防止多次請求。很多公司將自己的靜態文件託管在CDN上(Content Delivery Network,即內容分發網絡),從CDN上加載大量靜態文件,加快查找速度,減少原本網站的併發壓力。

訪問百度的靜態文件有:(出去前兩個與最長的那個)


第八步:瀏覽器通過Ajax(Asynchronous Javascript And XML 異步 JavaScript 和 XML)

在傳統的web應用,用戶每發一次請求,用戶的動作就會被阻塞,即在服務器返回響應之前,用戶不可以進行其他的操作,只能等待響應。然後服務器會響應一個完整的html頁面,瀏覽器再次進行渲染。哪怕是一個很小的一個請求,都會阻塞用戶動作,以及刷新整個頁面,極大地浪費了用戶的時間和網絡的帶寬,也增加了服務器的壓力。

Ajax出現之後,通過此技術發起的http請求,將不會阻塞用戶的動作,服務器響應之後,頁面會進行一個局部的刷新,也就是不會刷新整個頁面,極大提高了頁面加載與服務器處理的效率。當然Ajax也要自身的缺點,暴露了瀏覽器和服務器通信的具體邏輯,容易造成漏洞攻擊。此外,Ajax沒有後退機制,在一定程度上,用戶的體驗感降低。

百度界面顯示出來後,百度又利用了ajax去請求我之前的搜索關鍵詞,然後利用js填充到搜索框的下拉列表中,返回的數據如下:


總結:以上就是關於輸入一個網址到界面顯示的整個流程的具體介紹了,希望能幫助到更多的同學們,也希望你們能指出其中存在的錯誤,一同進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章