大家好,我是小林。
對于「訪問一個百度的過程,期間發生了什么?」這個問題面試中也很經常問,我之前也寫過詳細文章說明:探究!一個數據包在網絡中的心路歷程
現在問題來了。
大家知道,訪問網站的時候,會有一個域名解析的過程,客戶端會先拿到網站的IP地址,然后通過IP地址來進行后續的HTTP通信。

圖片
那既然如此,如果我已經知道了網站的IP地址,是不是可以跳過域名解析的過程,直接拿著IP地址去請求呢?
以百度為例,我們ping一下百度的域名,拿到它的IP地址。

圖片
解析的IP地址是:14.119.104.189
那直接訪問https://14.119.104.189,是不是也能打開百度?
結果他試了一下,發現被拒絕了!

圖片
然后這位球友就想不通了,為啥我跳過了第一步,直接用IP訪問就不行呢?網站是如何做到不讓直接用IP訪問的?
從這個圖中就可以合理的懷疑,是不是第二步中,客戶端發過去的HTTP請求在使用域名和直接使用IP地址的時候有所不同,讓服務器“察覺”出來你是直接使用的IP地址在訪問網站,跳過了第一步。

圖片
大膽假設,小心論證,接下來我們就來看一下是不是這樣。
因為HTTPS的通信是加了密的,為了看清楚通過域名訪問和通過IP訪問的時候,HTTP請求內容的區別,我們使用Fildder抓包軟件,這樣可以看到HTTPS加密的正文內容。
首先咱們通過域名來訪問一下:

圖片
然后通過IP地址來訪問一下:

圖片
放在一起一對比,在請求頭中就只有兩個地方不一樣:

圖片
分別是Host字段和Cookie字段。
這樣一看,真相基本就明確了,問題多半出在這個Host字段。
為了進一步驗證,我們使用Postman來直接訪問https://14.119.104.189,可以看到服務器返回了403錯誤!

圖片
然后,我們通過Postman修改一下Host字段,將其設置為域名www.baidu.com,再試一次:

圖片
這次能成功訪問了!
至此,這個問題就得到解答了:
客戶端在發起HTTP請求的時候,會將其要訪問的服務器地址填在Host字段。當使用域名訪問的時候,這個字段的值就是域名,而通過IP地址訪問的時候,這個字段的內容就是對應的IP地址。而服務器正是通過請求中的Host字段,識別出了客戶端是直接通過IP訪問的還是通過域名訪問的。
最后給大家留一個思考題:
當我用HTTPS直接訪問https://14.119.104.189的時候,瀏覽器給了我這樣一個提示:

圖片
這不是百度自己的SSL證書嗎?為什么會有這個提示出現?
評論區說說看!
歷史好文:
拿了 7 個大廠 offer,我有話說!
就按這個方向沖!
字節一面:網站顯示不出來,怎么排查?
字節面試:連接一個不存在的 IP 地址,會發生什么?
-
通信
+關注
關注
18文章
6391瀏覽量
140039 -
HTTP
+關注
關注
0文章
537瀏覽量
35350 -
數據包
+關注
關注
0文章
270瀏覽量
25594
原文標題:直接用IP訪問百度,我發現了···
文章出處:【微信號:小林coding,微信公眾號:小林coding】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
請問SRIO每次出傳輸數據包的個數,數據包負載大小怎么設置?
請問為什么ZigBee網絡組建中會頻繁地廣播一個數據包?
發送一個數據包,網絡什么也看不到
解決Labview報表問題的一般思路
【睿賽德 RW007 WiFi 模塊試用連載】RW007模塊調試心路歷程
一個AVR新手藍牙模塊調試的心路歷程簡介遇到的問題
學習單片機的心路歷程分享
為什么一個數據包會收到兩個獨立的netbufs呢?
網絡數據包捕獲機制研究
ttl傳輸中過期可能是什么原因_ttl傳輸中過期怎么解決
黃仁勛分享作為工程師的心路歷程
一個AVR新手藍牙模塊調試的心路歷程
探究!一個數據包在網絡中的心路歷程
評論