public DNS是如何解決CDN分發的問題的?

public DNS遞歸查詢的時候用的是自己的ip,如此一來CDN分配的伺服器就是離public DNS最近的伺服器而不是離用戶最近的伺服器。

DNSPod之類的大型public DNS是如何解決這個問題的呢?是否是分別在不同ISP/地區部署節點,然後再根據用戶IP調用離用戶最近的節點來完成遞歸的呢?


關於DNS的問題不請自來。

這裡牽扯到2個知識點,知道這兩個點就自然知道是怎麼做到的了。

  1. AnyCast。中文翻譯做任播。網路基礎學習過的人基本都知道IP間通信有單播,多播。現在多了一個任播。這種通訊方式的特點就是同一個IP(例如8.8.8.8)可以被配置在不同的伺服器上,客戶往伺服器發送請求後,離客戶最近的伺服器會負責響應。至於怎樣保證「最近」,是依賴於路由協議的實現,典型如BGP的路由。現在很多CDN服務商都運用了了BGP AnyCast技術,Public DNS也大多應用了。對於公共DNS來說,這是為什麼只提供一個IP,卻有不同地域多組伺服器可以就近給客戶提供服務的技術基礎。
  2. edns-client-subnet。這是DNS協議的一個擴展,目前還處於草案階段,見Client IP information in DNS requests。簡單來說,就是DNS伺服器之間的請求,帶上了客戶IP的信息。這樣就可以直接通過這個信息來斷定客戶的物理位置,而不是通過請求來源的DNS伺服器來斷定了。這樣即使客戶DNS配置錯誤,也能精準的定位到客戶的物理位置從而匹配到更塊的結果。這個擴展雖然還是草案階段但據我所知不少Public DNS提供商都已經支持了,像Google,OpenDNS。國內服務商我沒有確切資料。

1. Public DNS IP,通常都使用了任播技術,這樣用戶請求DNS時就是離自己最近的伺服器,所以一些Public DNS能做到全國範圍十幾毫秒內。PS: 某巨頭髮布自己的Public DNS的時候,宣稱使用任播,實際只是個北京BGP,現在不知道升級沒有。
2. 遞歸。遞歸分為兩種情況,一種是edns-client-subnet,一種是非edns。
2.1 非edns,Public DNS所在地的DNS伺服器收到查詢請求後,先查該域名的NS,然後從客戶端相應的ISP出口去權威DNS獲取解析結果,然後返回給客戶端。(比如客戶端是電信,則使用電信。這裡涉及內部的查詢路由,可能會設計得比較複雜,比如每個省份*ISP+國際區域都有回權威的出口)
這裡的每一步的結果都可以緩存。
2.2 edns。這個在遞歸的時候就簡單多了,但Public DNS需要不少改造。
遞歸時可以省掉內部的路由,直接到權威,帶上客戶端IP的C段即可,因為權威可以從edns判斷應該返回什麼結果。
edns帶來一些新問題:權威要支持,目前國內權威支持的很少;Public DNS也要支持,這個的全面支持更是遙遙無期了;Public DNS要對edns結果進行存儲優化,否則緩存的數據量要增加很多倍。8.8.8.8使用白名單,在列表裡的域名走edns。


ECS,實際上cdn廠商的權威dns會收到用戶的實際ip段,然後返回正確的調度。谷歌8.8.8.8,opendns,dnspod都是這樣做的

利益相關:某最大CDN服務商調度組


推薦閱讀:

114.114.114.114 的 DNS 靠譜嗎?
Google Public DNS在大陸有伺服器了?
Google是如何拿到8.8.8.8和8.8.4.4這兩個IP地址的?
關於dns欺騙,dns劫持的問題,Windows為什麼不能識別替換或自組的dns響應包?
公共DNS哪家強?

TAG:CDN | 計算機網路 | DNS | DNSPod |