域名、主機伺服器、ip、網卡、網站之間的關係是什麼?

我知道域名是通過DNS解析出ip然後返回給請求者,然後請求者通過這個ip找到相應主機。

Q1:但是現在一個大型網站,比如sina或者baidu,他們的伺服器主機肯定超級多,如果一個主機一個公網ip的話,那麼一個http://www.baidu.com域名就對應很多ip,究竟訪問哪一個呢,這些主機上的數據是否是冗餘存儲的?

Q2:還有就是做虛擬主機服務的這些公司,他們應該是一台主機伺服器上面設置有很多網站,那麼應該是一個ip對應了很多域名,請求者可以通過域名找到主機,但是如何找到網站呢?

Q3:一個ip能否對應多個主機(一個公網ip,而不是私有ip)?這個我看書上說可以,但是不理解,感覺太矛盾了。


Q1:

大型網站你看到的它的IP地址所對應的東西不是一個網站伺服器,而是一個負載均衡器,它負責分發外部請求到具體的網站伺服器上,具體的伺服器有很多台,數據是冗餘的,但也可能是從另外一台存儲伺服器上獲得的數據。

總之,對於大型網站,外網IP對應的不是一個真實的網站伺服器。

Q2:

一個IP可以對應多個域名,當你請求一個網頁的時候,你的HTTP請求里包含了你要請求的主機的名字,比如你打開google的時候請求的內容是這樣的:

GET http://download.google.com/somedata.exe

Host: http://download.google.com


Accept:*/*


Pragma: no-cache

Cache-Control: no-cache


Referer: http://download.google.com/


User-Agent:Mozilla/4.04[en](Win95;I;Nav)


Range:bytes=554554-

看到加粗的部分了嗎?你要訪問的域名也包含其中。

所以虛擬主機收到它以後,根據host欄位就可以確定你到底訪問的是哪個網站。在IIS或者Apache中,這都可以設置。你自己部署的IIS伺服器也可以綁多個網站。

Q3:

同上,Q2已經說的很明白了,一個IP可以對應多個域名,IIS或者Apache都有能力解析。


你這裡每個問題都可以回答成一篇文章了呀。

首先,你需要了解三個基礎網路知識。

1 DNS

1.1 DNS簡單說就是你給它一個域名,它解析一個IP給你。但是實際上情況不是這麼簡單的。

客戶端發起一個DNS查詢請求,提交一個完整主機名(例如www.abc.com)到設置的DNS服務器上,DNS服務器如果查詢到相關記錄,則返回這個記錄。對於IPv4,記錄分為A記錄或者CNAME。A記錄表示是一個IPv4的地址,CNAME表示為另外一個主機名(例如server1.realserver.com)。A記錄允許同名存在,多個不同的IP被對應到同一個主機名上,也允許使用根記錄,本例中即為abc.com,不帶任何前綴;CNAME不允許同名存在,不允許根記錄,也不允許與A記錄同名。如果客戶端得到的返回是一個CNAME,則會重新再來一次DNS查詢去解析這個CNAME的IP。對於這個CNAME的查詢,可能返回另外的CNAME,則這個過程會很長,直至解析出A記錄。

1.2 如果DNS服務器上沒有查詢到相關記錄,則會詢問上一層的DNS服務器。如果上一層服務器解析出結果,則它在返回給用戶結果時,順便自己緩存一份。緩存的時間由域名的TTL決定。

1.3 每個域名首先要註冊在跟DNS上NS服務器名稱。當一個區域中最頂層的DNS也沒有用戶查詢的主機名記錄時,則會首先向INTERNET跟DNS獲取這個NS服務器名稱,並嘗試向這個NS服務器發起查詢請求。NS服務器必須響應並回應這個查詢。如果DNS跟服務器無法被連接到、NS無法被找到、無法被連接到或者NS服務器無法解析,則本主機名最終解析失敗。

1.4 DNS如果返回多條A記錄時,會生成一個有序集合。這個排序根據歷史查詢散列,並根據訪問者的IP所在區域優化。客戶端拿到的集合中的第一條IP通常為一個優化後的地址,但其他地址依舊可作為備選使用。

1.5 DNS服務器通常不歸主機管理商所有,並且由於需要快速響應,在查詢的時候是無法判斷主機狀態和負載的。但一些較大的機構,會自己擁有一個重新設計的DNS服務器,考慮到這些信息。而對於這種情況,外部公網的DNS只能解析出一個CNAME,並交由這個DNS來進行後續解析(這個DNS被註冊為這個CNAME對應的NS)。這種設計下的DNS通常被認為是NLB(網路負載均衡)設計的一部份。

1.6 由於1.2提及的代理查詢以及TTL的機制,DNS其實並不能良好的實現服務器的輪詢負載均衡,但是可以實現區域優化查詢,即對某個特定區域儘量返回其區域內的IP結果。

2 HTTP頭

在發起HTTP請求時,客戶端會同時提交要訪問的文件(一般在GET命令後)以及主機名(HOST欄位),對方服務器會根據這個HOST來確定它要訪問的域名。所以一個主機在一個IP上並行存在多個不同的主機地址。

3 NLB

通常的NLB有三種解決辦法。

3.1 本地DNS加速,如1.5所述的方法。

3.2 CDN(內容分發網路)。CDN可以被看做是一個獨立的HTTP代理網路。使用CDN的時候,DNS應把域名解析到某個CDN的全球IP群上。CDN服務器得到HTTP請求後,會在轉發原真實服務器的數據時,本地緩存一份。甚至可以實現數據的預推送。因此CDN非常適合於靜態數據的全球化緩存。例如微軟發佈補丁、蘋果發佈新產品、Wordpress、Amazon網站的圖片緩存都是使用了CDN技術。

3.3 虛擬IP地址。通常情況下,一個IP不應該被設置到超過一個設備上,因為超過這個設置後,上層的路由器就不知道如何轉發這個包了。但是,如果路由器經過了設置(例如BGP協議或者專門設計的路由軟體等),是可以在多個設備下共享同一個IP的。這種共享既可以是物理的(多個設備同時使用一個IP,由上層路由進行分支選擇或者廣播、組播數據包),或者是輪詢的(多個設備輪流使用一個IP,同時只有一個設備使用這個IP,而這個IP可以在多個設備間高速切換)。如果某個應用必須基於IP地址(例如DNS服務本身),只能使用這種方式來處理。

那麼回頭看你三個問題。

Q1 返回多個A紀錄後,客戶端會按照集合的順序依次嘗試訪問。這些數據在NS服務器上是單一存在的,但是會被多層DNS緩存。

Q2 HTTP頭段已經講述。

Q3 希望你看過NLB段後能理解。


可以根據你網路所處位置、各伺服器負載情況,返回一個最優的地址,或者返回一個頁面,重定向一下


Q1:大型網站的伺服器都有均衡負載策略,雖然是一個IP,但對應的可能是多台內部伺服器,由負載均衡策略決定每次訪問落實到哪台伺服器。

Q2:具體不太清楚,我只知道WindowsAzure國內雲服務是給每個虛擬機都分配虛擬外部IP並向內網做映射的。

Q3:在Q1那種情況下,一個公網IP是可以對應一個伺服器集群的。外部看起來只有一台伺服器,其實是多台伺服器進行負載均衡。


看到知乎竟然吧這個問題推薦到我的個人首頁了,我就進來簡要的回答一下

Q1:一台主機可以對應一個公網ip也可以對應多個,也可以沒有,前者的ip相當於你私有的,而後者則是常用的共享ip技術。

你的第一個問題,我猜想你應該想問的是一個域名對應多個ip的情況,這個分配主要是由dns來完成。也就是智能解析。

域名智能解析是指dns伺服器根據來訪者的IP類型,對同一域名作出相應不同解析。對IP來自電信的訪問者,將域名解析到該域名對應IP地址為電信的伺服器上。對IP來自網通的訪問者,將域名解析到該域名對應IP地址為網通的伺服器上。以保證訪問者不因網通電信線路瓶頸而造成網速慢。

出處:http://baike.baidu.com/view/3088909.htm

也就是說,dns伺服器會使用Bind Views和edns的技術來對你的as段進行分配,並且返回最適合你的伺服器節點。

至於這些主機上的數據是否是冗餘存儲的?,我可以說,絕對不是,雖然現在硬碟可以相當於是白菜價,但也是要錢的。並且多地冗餘儲存對節點間如何進行實時高效的同步的技術難度簡直無法想像。

目前最常見的技術就是設置一兩個核心運算節點,然後面對用戶的則採用了CDN(內容傳遞網路)分發,來保證各地用戶訪問的流暢性。

Q2:

這是我在本地抓的一個封包,看到host木有,http://baidu.com,只要知道這個之後,剩下的活就丟給nginx幹了

然後我可以在nginx寫下這樣的規則

server

{

listen 80;

server_name http://baidu.com/; #域名

index index.htm index.html index.php;

root /home/www/; #根目錄

include location.conf;

error_page 404 /404.html;

}

保存,重啟,只要tcp包的 host==server_name 域名就對應上了。

Q3:這貨叫任播(BGP Global AnyCast)。114和4個8就這這樣子乾的,這個請移步wiki,我就不轉過來了

http://zh.wikipedia.org/wiki/%E4%BB%BB%E6%92%AD

擴展閱讀:

淺析智能DNS,CDN加速,雙線加速的原理與區別

DNS多點部署IP Anycast+BGP實戰分析


前兩個問題都回答過了,我只說第三個問題,書中說的任播是ipv6的概念。在ipv6裡面是可以的。


推薦閱讀:

遊戲加密技術真能發展到過幾年就沒有破解盜版的地步?
如何從零寫一個http server?
網路評論員是激化了還是緩解了輿論矛盾?
學習網路工程的女生後來都怎樣了?
如何系統地做計算機網路實驗?

TAG:伺服器 | 網站 | 計算機網路 | TCPIP | 雲主機 |