當我們在瀏覽器的位址列輸入 www.linux178.com ,然後回車,回車這一瞬間到看到頁面到底發生了什麼呢?
以下過程僅是個人理解:
網域名稱解析 --> 發起tcp的3次握手 --> 建立tcp連線後發起http請求 --> 伺服器響應http請求,瀏覽器得到html** --> 瀏覽器解析html**,並請求html**中的資源(如js、css、等) --> 瀏覽器對頁面進行渲染呈現給使用者
關於http協議可以參考以下:
http協議漫談
http協議概覽
了解http headers的方方面面
以下就是上面過程的一一分析,我們就以chrome瀏覽器為例:
1.網域名稱解析
首先chrome瀏覽器會解析 www.linux178.com 這個網域名稱(準確的叫法應該是主機名)對應的ip位址。怎麼解析到對應的ip位址?
① chrome瀏覽器 會首先搜尋瀏覽器自身的dns快取(快取時間比較短,大概只有1分鐘,且只能容納1000條快取),看自身的快取中是否有www.linux178.com 對應的條目,而且沒有過期,如果有且沒有過期則解析到此結束。
注:我們怎麼檢視chrome自身的快取?可以使用 chrome://net-internals/#dns 來進行檢視
② 如果瀏覽器自身的快取裡面沒有找到對應的條目,那麼chrome會搜尋作業系統自身的dns快取,如果找到且沒有過期則停止搜尋解析到此結束.
注:怎麼檢視作業系統自身的dns快取,以windows系統為例,可以在命令列下使用 ipconfig /displaydns 來進行檢視
③ 如果在windows系統的dns快取也沒有找到,那麼嘗試讀取hosts檔案(位於c:\windows\system32\drivers\etc),看看這裡面有沒有該網域名稱對應的ip位址,如果有則解析成功。
④ 如果在hosts檔案中也沒有找到對應的條目,瀏覽器就會發起乙個dns的系統呼叫,就會向本地配置的首選dns伺服器(一般是電信運營商提供的,也可以使用像google提供的dns伺服器)發起網域名稱解析請求(通過的是udp協議向dns的53埠發起請求,這個請求是遞迴的請求,也就是運營商的dns伺服器必須得提供給我們該網域名稱的ip位址),運營商的dns伺服器首先查詢自身的快取,找到對應的條目,且沒有過期,則解析成功。如果沒有找到對應的條目,則有運營商的dns代我們的瀏覽器發起迭代dns解析請求,它首先是會找根域的dns的ip位址(這個dns伺服器都內建13臺根域的dns的ip位址),找打根域的dns位址,就會向其發起請求(請問www.linux178.com這個網域名稱的ip位址是多少啊?),根域發現這是乙個頂級域com域的乙個網域名稱,於是就告訴運營商的dns我不知道這個網域名稱的ip位址,但是我知道com域的ip位址,你去找它去,於是運營商的dns就得到了com域的ip位址,又向com域的ip位址發起了請求(請問www.linux178.com這個網域名稱的ip位址是多少?),com域這台伺服器告訴運營商的dns我不知道www.linux178.com這個網域名稱的ip位址,但是我知道linux178.com這個域的dns位址,你去找它去,於是運營商的dns又向linux178.com這個網域名稱的dns位址(這個一般就是由網域名稱註冊商提供的,像萬網,新網等)發起請求(請問www.linux178.com這個網域名稱的ip位址是多少?),這個時候linux178.com域的dns伺服器一查,誒,果真在我這裡,於是就把找到的結果傳送給運營商的dns伺服器,這個時候運營商的dns伺服器就拿到了www.linux178.com這個網域名稱對應的ip位址,並返回給windows系統核心,核心又把結果返回給瀏覽器,終於瀏覽器拿到了www.linux178.com 對應的ip位址,該進行一步的動作了。
注:一般情況下是不會進行以下步驟的
如果經過以上的4個步驟,還沒有解析成功,那麼會進行如下步驟(以下是針對windows作業系統):
⑤ 作業系統就會查詢netbios name cache(netbios名稱快取,就存在客戶端電腦中的),那這個快取有什麼東西呢?凡是最近一段時間內和我成功通訊的計算機的計算機名和ip位址,就都會存在這個快取裡面。什麼情況下該步能解析成功呢?就是該名稱正好是幾分鐘前和我成功通訊過,那麼這一步就可以成功解析。
⑥ 如果第⑤步也沒有成功,那會查詢wins 伺服器(是netbios名稱和ip位址對應的伺服器)
⑦ 如果第⑥步也沒有查詢成功,那麼客戶端就要進行廣播查詢
⑧ 如果第⑦步也沒有成功,那麼客戶端就讀取lmhosts檔案(和hosts檔案同乙個目錄下,寫法也一樣)
如果第八步還沒有解析成功,那麼就宣告這次解析失敗,那就無法跟目標計算機進行通訊。只要這八步中有一步可以解析成功,那就可以成功和目標計算機進行通訊。
看下圖抓包截圖:
linux虛擬機器測試,使用命令 wget www.linux178.com 來請求,發現直接使用chrome瀏覽器請求時,干擾請求比較多,所以就使用wget命令來請求,不過使用wget命令只能把index.html請求回來,並不會對index.html中包含的靜態資源(js、css等檔案)進行請求。
抓包分析:
① 號包,這個是那台虛擬機器在廣播,要獲取192.168.100.254(也就是閘道器)的mac位址,因為區域網的通訊靠的是mac位址,它為什麼需要跟閘道器進行通訊是因為我們的dns伺服器ip是外圍ip,要出去必須要依靠閘道器幫我們出去才行。
② 號包,這個是閘道器收到了虛擬機器的廣播之後,回應給虛擬機器的回應,告訴虛擬機器自己的mac位址,於是客戶端找到了路由出口。
③ 號包,這個包是wget命令向系統配置的dns伺服器提出網域名稱解析請求(準確的說應該是wget發起了乙個dns解析的系統呼叫),請求的網域名稱www.linux178.com,期望得到的是ip6的位址(aaaa代表的是ipv6位址)
④ 號包,這個dns伺服器給系統的響應,很顯然目前使用ipv6的還是極少數,所以得不到aaaa記錄的
⑤ 號包,這個還是請求解析ipv6位址,但是www.linux178.com.leo.com這個主機名是不存在的,所以得到結果就是no such name
⑥ 號包,這個才是請求的網域名稱對應的ipv4位址(a記錄)
⑦ 號包,dns伺服器不管是從快取裡面,還是進行迭代查詢最終得到了網域名稱的ip位址,響應給了系統,系統再給了wget命令,wget於是得到了www.linux178.com的ip位址,這裡也可以看出客戶端和本地的dns伺服器是遞迴的查詢(也就是伺服器必須給客戶端乙個結果)這就可以開始下一步了,進行tcp的三次握手。
一次完整的HTTP事務是怎樣乙個過程
了解http headers的方方面面 2 如果瀏覽器自身的快取裡面沒有找到對應的條目,那麼chrome會搜尋作業系統自身的dns快取,如果找到且沒有過期則停止搜尋解析到此結束.注 怎麼檢視作業系統自身的dns快取,以windows系統為例,可以在命令列下使用 ipconfig displaydns...
一次完整的HTTP事務
http通訊機制是在一次完整的http通訊過程中,web瀏覽器與web伺服器之間將完成下列7個步驟 1.建立tcp連線 在http工作開始之前,web瀏覽器首先要通過網路與web伺服器建立連線,該連線是通過tcp來完成的,該協議與ip協議共同構建internet,即著名的tcp ip協議族,因此in...
一次完整的HTTP請求是怎樣的
一次完整的http請求過程從tcp三次握手建立連線成功後開始,客戶端按照指定的格式開始向服務端傳送http請求,服務端接收請求後,解析http請求,處理完業務邏輯,最後返回乙個http的響應給客戶端,http的響應內容同樣有標準的格式。無論是什麼客戶端或者是什麼服務端,大家只要按照http的協議標準...