CDN(Content Delivery Network,內容分發網絡)將源站的內容發佈到接近用戶的網絡「邊緣」,用戶能夠就近獲取所需數據,不只下降了網絡的擁塞情況、提升請求的響應速度,也可以減小源站的負載壓力。php
不少同窗都比較熟悉CDN的做用和功能,可是可能也會像我以前同樣,對CDN的原理不是十分了解。因此本文旨在對CDN的工做原理和核心組件進行簡要的描述。緩存
爲了更加清楚地展現CDN的原理,咱們首先回顧一下不使用緩存直接到源站請求數據的過程:服務器
如上圖所示,若是要訪問的網站名爲:"join.qq.com",客戶端首先會在本機的hosts文件和hosts緩存中查找該域名對應的IP地址;若是本機中沒有此信息,則會到咱們的本地DNS
進行詢問該域名對應的IP地址;若是本地DNS中仍然沒有該域名的IP信息時,則會由本地DNS依次向根DNS
、頂級域DNS
、權威DNS
進行詢問,最終本地DNS
將IP地址發送給客戶端。客戶端經過IP地址向遠程的源站服務器發出HTTP請求並獲取相應的數據內容。網絡
以上是經過DNS的迭代解析
模式獲取域名對應的IP地址併發送HTTP請求的過程。源站的提供商經過配置權威DNS將源站的域名與提供服務的服務器主機進行綁定,使客戶端經過DNS服務能夠順利地獲取源站域名對應的IP地址並經過IP地址與源站進行通訊。併發
爲了方便後續的討論,須要瞭解DNS是如何對查詢請求進行應答的。負載均衡
在DNS系統中,最多見的資源記錄方式是Internet類記錄,該記錄由包含4個字段的數據構成:Name、Value、Type、TTL。其中Name和Value能夠理解爲一對鍵值對,可是其具體含義取決於Type的類型,TTL記錄了該條記錄應當從緩存中刪除的時間。在資源記錄的類型中中,最爲常見且重要的類型Type主要有:ide
A記錄(Address)網站
A記錄用於描述目標域名到IP地址的映射關係,將目標域名與A記錄的Name字段進行匹配,將成功匹配的記錄的Value字段的內容(IP地址)輸出到DNS迴應報文中。code
NS記錄(Name Server)cdn
NS記錄用於描述目標域名到負責解析該域名的DNS的映射關係,根據目標域名對NS記錄的Name字段進行匹配,將成功匹配的記錄的Value字段(負責解析目標域名的DNS的IP地址)輸出到DNS迴應報文中。
CNAME記錄
CNAME記錄用於描述目的域名和別名的對應關係,若是說A記錄能夠將目標域名轉換爲對應主機的IP地址,那麼CNAME記錄則能夠將一個域名(別名)轉換爲另外一個域名,若是多條CNAME記錄指向同一個域名,則能夠將多個不一樣的域名的請求指向同一臺服務器主機。而且,CNAME記錄一般還對應了一條A記錄,用於提供被轉換的域名的IP地址。
在上一章節中主要介紹了經過DNS服務直接訪問源站的請求響應過程。與其不一樣的是,CDN將咱們對源站的請求導向了距離用戶較近的緩存節點,而非源站。
如圖所示是經過CDN進行請求響應的過程圖。經過圖中能夠看出,在DNS解析域名時新增了一個全局負載均衡系統(GSLB)
,GSLB的主要功能是根據用戶的本地DNS的IP地址判斷用戶的位置,篩選出距離用戶較近的本地負載均衡系統(SLB)
,並將該SLB的IP地址做爲結果返回給本地DNS。SLB主要負責判斷緩存服務器集羣
中是否包含用戶請求的資源數據,若是緩存服務器中存在請求的資源,則根據緩存服務器集羣中節點的健康程度、負載量、鏈接數等因素篩選出最優的緩存節點,並將HTTP請求重定向到最優的緩存節點上。
爲了更清晰地說明CDN的工做原理,下面以客戶端發起對"join.qq.com/video.php"的HTTP請求爲例進行說明:
根DNS
發送DNS查詢報文;根DNS
發現域名的前綴爲"com",則給出負責解析com
的頂級DNS
的IP地址;頂級DNS
發送DNS查詢報文;頂級DNS
發現域名的前綴爲"qq.com",在本地記錄中查找負責該前綴的權威DNS
的IP地址並進行回覆;權威DNS
發送DNS查詢報文;CNAME記錄
(由服務提供者配置),該記錄的Value字段爲"join.qq.cdn.com";而且還找到另外一條NAME字段爲"join.qq.cdn.com"的A記錄,該記錄的Value字段爲GSLB的IP地址;本地DNS
的IP地址判斷用戶的大體位置爲深圳,篩選出位於華南地區且綜合考量最優的SLB的IP地址填入DNS迴應報文,做爲DNS查詢的最終結果;其中較爲關鍵的步驟爲6~9,與普通的DNS過程不一樣的是,這裏須要服務提供者(源站)配置它在其權威DNS中的記錄,將直接指向源站的A記錄修改成一條CNAME記錄及其對應的A記錄,CNAME記錄將目標域名轉換爲GSLB的別名,A記錄又將該別名轉換爲GSLB的IP地址。經過這一系列的操做,將解析源站的目標域名的權力交給了GSLB,以至於GSLB能夠根據地理位置等信息將用戶的請求引導至距離其最近的"緩存節點",減緩了源站的負載壓力和網絡擁塞。
以上主要介紹了目前CDN中最爲常見的工做方式,這種工做方式利用CNAME將域名和目標IP之間進行解耦,將目標IP的解析權下放到GSLB中,方便實現更多自定義的功能,是一種更加靈活的方式。