CDN:我的 DNS 怎麼可能根據訪問者的位置提供不同的 IP?
我發現了這個解釋CDN 是如何工作的。但有一件事我真的不明白。假設我在我的位置設置了多個 DNS 伺服器,它們使用名稱伺服器域
dns1.example.com
,dns2.example.com
並且dns3.example.com
. 該 DNS 伺服器能夠根據訪問者的位置(ping、地理數據庫、瀏覽器語言或其他)提供伺服器 IP。www.example.org
現在我在系統資料庫中為我的域更新此名稱伺服器設置。現在,
www.example.org
帶有過期 TTL 的第一個請求會嘗試解析域。它問:
- 本地 .hosts/DNS,如果 TTL 過期:
- 網際網路提供商 DNS,如果 TTL 過期:
- 根 DNS,如果 TTL 過期:
- 我當地的
dns1.example.com
但是,如果我理解正確,那麼新 IP 將被添加到所有這些名稱伺服器記憶體中,直到 TTL 再次過期。那麼如何根據訪問者的位置向訪問者發送其他 IP 呢?
在this answer theandym說請求是“轉發”的,但我不認為這是CDN的工作方式,因為“轉發”意味著延長傳輸方式導致更長的載入時間。或者 CDN 是否要求域的 TTL 為零?
Update1
通過這個問題,我找到了Google 的文件,描述了他們如何優化 CDN 性能。它沒有解釋 CDN 的一般工作原理,但有一些有趣的解釋,如下所示:
此後,每當客戶端嘗試獲取託管在 CDN 上的內容時,客戶端都會被重定向到被確定為其前綴具有最短延遲的節點。但是,此重定向基於與代表客戶端解析內容 URL 的 DNS 名稱伺服器的 IP 地址相對應的前綴,通常與客戶端位於同一位置。
這意味著 Google 首先會檢查所有 IP 前綴的延遲,並為所有可用的前綴定義一個 DNS 解析表 (?)。如果訪問者擁有 IP
198.51.100.231
,則使用 Google 伺服器 IP,即為 prefix 設置198.51.100.0
。但又一次:Google 的 DNS 如何知道訪問者使用的是哪個 IP?大多數訪問者通過他們的網際網路提供商解析Google的域,並且解析是通過那些外部 DNS 伺服器完成的?作為另一個範例:如果我
facebook.com
使用不同的線上工具(託管在不同的國家/地區)為域啟動 DNS 解析,則會將其解析為具有不同域的不同 IP,例如:
- 31.13.92.36 反向:edge-star-mini-shv-01-frt3.facebook.com
- 31.13.76.68 反向:edge-star-mini-shv-01-sea1.facebook.com
- 31.13.69.228 反向:edge-star-mini-shv-01-iad3.facebook.com
- 157.240.2.35 反向:edge-star-mini-shv-01-ort2.facebook.com
之後我認為這可能取決於訪問者使用的 DNS 伺服器位置,但我嘗試了我自己的(德國電信,德國)、Google的(8.8.8.8)和法國的主要伺服器(橙色),他們都返回
facebook.com
了智慧財產權31.13.92.36
。
好吧,看來我現在可以粗略回答我自己的問題了。Anurag Bhatia說 CDN 的工作方式有兩種:
域名系統
讓 DNS 發揮作用,即當來自網路 ISP A 的使用者查找 cdn.website.com 時,他們應該得到記憶體 A 的單播 IP 地址作為回報,同樣對於來自 ISP B 網路的使用者,記憶體 B 的單播 IP 應該返回。
假設我們有一個 IP
1.2.3.4
位於美國的伺服器和一個 IP2.3.4.5
位於德國的記憶體伺服器。現在訪問者嘗試解析域example.org
。如果他沒有更改他的網路設置,他會使用他的網際網路服務提供商 (ISP) 的 DNS 伺服器。這個 ISP 現在向dns1.example.com
(域的名稱伺服器)詢問 IP。現在它取決於 ISP 的位置。如果它位於德國dns1.example.com
返回2.3.4.5
,如果它位於美國返回1.2.3.4
。但是這種方法可能有一個缺點:每次使用者更改他的網路設置並使用 EDNS0 (參見 IETF 草案)不兼容的 DNS 提供程序(例如公司的中央 DNS 伺服器)時,
dns1.example.com
都會使用與這些 DNS 最接近的 IP 再次回答位置,但這次訪問者很可能在不同的位置,從而導致更高的延遲。EDNS0 兼容的 DNS 提供商正在將有關使用者的資訊傳遞給權威的 DNS 伺服器。所以權威的DNS伺服器可以用使用者位置旁邊的IP進行響應:
今天,如果您使用 OpenDNS 或 Google 公共 DNS 並訪問網站或使用全球網際網路加速中的參與網路或 CDN 之一提供的服務,那麼您的 IP 地址的截斷版本將被添加到 DNS 請求中。Internet 服務或 CDN 將使用此截斷的 IP 地址做出更明智的響應決定,以便您可以連接到最佳伺服器。
…
; EDNS: version: 0, flags:; udp: 512 ; CLIENT-SUBNET: 130.89.89.0/24/21
任播
基於“任播路由”概念,路由到最近的記憶體節點。在這裡,記憶體 A、記憶體 B 和記憶體 C 將使用相同的相同 IP 地址,並且路由將負責到達最近的 IP 地址。
由於 BGP 等原因,我不太了解 Anycast,但我認為對 Anurag Bhatia 的進一步解釋給出了它如何工作的想法:
- 優化基於 BGP 路由和公告,DNS 的作用很小。
- 這種設置很難建立和擴展,因為要在全球範圍內完美地執行任播,需要在每個位置有大量的對等和一致的傳輸提供商。如果任何對等點洩漏到上游或其他對等點的路由,則由於任播中斷,給定集群上可能會出現大量意外流量。
- 此設置不依賴 DNS 遞歸,因此 Google DNS 或 OpenDNS 可以正常工作。
- 這可以節省大量 IP 地址,因為在多個位置使用相同的池。
Anycast 也有一個缺點:路由很靈活。在 TCP 會話開始時,目標節點可能位於網路 A 中,它可能會更改為網路 B。因此,Anycast 在實踐中僅用於 UDP。UDP 是一種無會話協議。
大多數 CDN 使用 DNS 處理 HTTP/HTTPS 流量,使用 Anycast 處理 DNS 請求。