直接用IP訪問知乎,我發(fā)現(xiàn)了一個秘密···

我們先來ping知乎的域名,然后可以得到響應(yīng)的服務(wù)器的ip,

之后我們用瀏覽器來訪問這個ip,結(jié)果如下

被拒絕訪問了。
而用ip來訪問百度,則沒啥問題,如圖


訪問知乎的時候,域名可以訪問,ip不可以訪問,這究竟是為啥?
我們知道,ipv4的ip地址是非常有限的,如果每個人都想擁有一個全球ip,那肯定是不夠分配的,不知道啥是全球ip的可以看我這篇文章:談?wù)凬AT:什么?全球IP和私有IP是什么鬼?
所以,很多網(wǎng)站在發(fā)布的時候,是有可能幾個域名共用一個CDN服務(wù)器的。

稍微解釋下CDN是啥: CDN服務(wù)器可以說是一種緩存服務(wù)器。當(dāng)我們要訪問某個網(wǎng)站的資源時,如果該網(wǎng)站的服務(wù)器離我們很遠(yuǎn),這樣的話響應(yīng)速度就會很慢,為了讓響應(yīng)速度快一些,我們可以把資源分布放在各個地方,然后響應(yīng)客戶端的時候,把離客戶端較近的資源傳送給他。
當(dāng)我們用域名訪問知乎的時候,CDN服務(wù)器可以根據(jù)訪問的域名知道你想要的是哪個網(wǎng)站的資源,然后直接給你返回對應(yīng)的資源。
但是當(dāng)你用公網(wǎng) ip 訪問就不一樣了,由于一個CDN服務(wù)器的公網(wǎng) ip 對應(yīng)多個域名網(wǎng)站,他不知道你想要的是哪個網(wǎng)站的資源,也就是說,當(dāng)你用 118.89.204.192 去訪問知乎的時候,CDN 服務(wù)器不知道你要訪問的是 zhihu.com,還是訪問 a.com 或 b.com,所以他也干脆明了點,直接拒絕你的訪問。
有人可能會問,我輸入域名之后,DNS 服務(wù)器幫我自動解析成對應(yīng)的ip,去訪問知乎的時候,也還是用ip訪問的啊,這貌似和ip訪問沒啥區(qū)別啊。
確實,訪問的時候,DNS 服務(wù)器都會幫們我把域名解析成 ip 去訪問,CDN 服務(wù)器之所以能夠檢測到對應(yīng)的域名,其實是這樣的:
當(dāng)客戶端用域名訪問知乎的時候,DNS 會解析成對應(yīng)的 ip 去訪問 CDN 服務(wù)器,然后 CDN 服務(wù)器可以根據(jù) SNI 機制獲得該 ip 對應(yīng)的來源域名,然后返回對應(yīng)的資源。
這里簡單介紹下 SNI 機制:
SNI 全稱 Server Name Indicatio,是 STL 的一個拓展,該機制主要是用來解決一個服務(wù)器對應(yīng)多個域名時產(chǎn)生的一些問題,通過這種機制,服務(wù)器可以提前知道(還沒建立鏈接)客戶端想要訪問的網(wǎng)站。
想要知道更加具體的我已經(jīng)給你們準(zhǔn)備好文章:https://blog.csdn.net/firefile/article/details/80532161
好了,知道了用域名可以訪問知乎,而用ip不可以訪問知乎之后,我們再來說說百度。
為啥百度ip和域名都可以訪問呢?
這其實很簡單,就是百度用的CDN服務(wù)器,只對應(yīng)一個網(wǎng)站域名唄,說白了,就是百度有錢!
完
print_r('點個好看吧!');
var_dump('點個好看吧!');
NSLog(@"點個好看吧!");
System.out.println("點個好看吧!");
console.log("點個好看吧!");
print("點個好看吧!");
printf("點個好看吧!");
cout << "點個好看吧!" << endl;
Console.WriteLine("點個好看吧!");
fmt.Println("點個好看吧!");
Response.Write("點個好看吧!");
alert("點個好看吧!")
echo "點個好看吧!"
推薦閱讀
