【前五篇】系列文章傳送門:
網路協議 13 - https 協議:加密路上無盡頭
網路協議 14 - 流**協議:要說愛你不容易
網路協議 15 - p2p 協議:小種子大學問
網路協議 16 - dns 協議:網路世界的位址簿
網路協議 17 - httpdns:私人定製的 dns 服務
到現在為止,我們基本上已經了解了網路協議中的大部分常用協議,對於整個 http 請求流程也較為熟悉了。從無到有後,我們就要考慮如何優化「有」這個過程,也就是我們常見的請求優化。而現在的技術棧中,cdn 是最常用的一種方式。
在了解 cdn 前,我們可以先了解下現代社會的物流配送。
例如我們去電商**下單買東西,這個東西一定要從電商總部的中心倉庫送過來嗎?在電商剛興起的時候,所有的配送都是從中心倉庫發貨,所以買家可能要很久才能收到貨。但是後來電商**的物流系統學聰明了,他們在全國各地建立了很多倉庫,而不是只有總部的中心倉庫才可以發貨。
電商**根據統計大概知道,北京、上海、廣州、深圳、杭州等地,每天能夠賣出去多少書籍、紙巾、包、電器等存放期較長的商品,就將這些商品分布存放在各地倉庫中,客戶一下單,就從臨近的倉庫發貨,大大減少了運輸時間,提高了使用者體驗。
同樣的,網際網路也借鑑了「就近配送」這個思路。
全球有那麼多的資料中心,無論在**上網,臨近不遠的地方基本上都有資料中心。可以在每個資料中心裡部署幾台機器,形成乙個快取集群來快取部分熱資料,這樣使用者訪問資料的是,就可以就近訪問了。
這些分布在各個地方的各個資料中心的節點,我們一般稱為邊緣節點。
由於邊緣節點數目比較多,但是每個集群規模比較小,不可能快取下來所有東西,因而可能無法命中,這樣就會在邊緣節點之上,形成了區域節點。
區域節點規模較大,快取的資料也較多,命中的概率也就更大。而在區域節點之上是中心節點,規模更大,快取資料更多。
就這樣,在這樣一層層的節點中快取資料,提高響應速度。但是所有的節點都沒有快取資料,就只有進行回源**訪問了。
如上圖,就是cdn 的分發系統的架構。cdn 系統的快取,是一層層的,能不訪問源資料,就不訪問。這也是電商**物流系統的思路,廣州找不到,找華南局,華南局找不到,再找南方局。
有了這個分發系統之後,客戶端如何找到相應的邊緣節點進行訪問呢?
還記得咱們之前了解的基於 dns 的全域性負載均衡嗎?這個負載均衡主要用來選擇乙個就近的相同運營商的伺服器進行訪問。
同樣的,cdn 分發網路也可以用相同的思路選擇最合適的邊緣節點。
如上圖,cdn 的負載均衡流程圖。
1)沒有 cdn 的情況(圖中虛線部分)。使用者向瀏覽器輸入 www.web.com 這個網域名稱,客戶端訪問本地 dns 伺服器的時候,如果本地 dns 伺服器有快取,則返回**的位址。如果沒有,遞迴查詢到**的權威 dns 伺服器,這個權威 dns 伺服器是負責 web.com 的,它會返回**的 ip 位址。本地 dns 伺服器快取下 ip 位址,將 ip 位址返回,然後客戶端直接訪問這個 ip 位址,就訪問到了**。
2)有 cdn 的情況(圖中實線部分)。此時,在 web.com 這個權威 dns 伺服器上,會設定乙個 cname 別名,指向另外乙個網域名稱 www.web.cdn.com,返回給本地 dns 伺服器。
當本地 dns 伺服器拿到這個新的網域名稱時,需要繼續解析這個新的網域名稱。這個時候,再訪問的就不是 web.com 這個權威 dns 伺服器了,而是 web.cdn.com 的權威 dns 伺服器,這是 cdn 自己的權威 dns 伺服器,在這個伺服器上,還是會設定乙個 cname,指向另外乙個網域名稱,也就是 cdn 網路的全域性負載均衡器。
接下來,本地 dns 伺服器去請求 cdn 的全域性負載均衡器解析網域名稱。全域性負載均衡器會為使用者選擇一台合適的快取伺服器提供服務,選擇的依據包括:
基於以上這些條件,進行綜合分析之後,全域性負載均衡器會返回一台快取伺服器的 ip 位址。
保質期長的日用品因為不容易過期,因此比較容易快取。同樣的,網際網路中的靜態頁面、等,幾乎不怎麼改變,所以也適合快取。而像生鮮之類的儲存時間較短的,對應網際網路中的動態資源,就需要用到動態 cdn。
靜態資源快取
還記得上圖這個接入層快取的架構嗎?在進入資料中心的時候,我們希望通過最外層接入層的快取,將大部分靜態資源的訪問攔在邊緣。而 cdn 則更進一步,將這些靜態資源快取到離使用者更近的資料中心外。總體來說,就是縮短使用者的「訪問距離」。離客戶越近,客戶訪問效能越好,時延越低。
流** cdn
在靜態內容中,流**也大量使用了 cdn。
cdn 支援流**協議。例如前面講過的 rtmp 協議。在很多情況下,這相當於乙個**,從上一級快取讀取內容,**給使用者。由於流**往往是連續的,因而可以進行預先快取的策略,也可以預先推送到使用者的客戶端。
對於靜態頁面來講,內容的分發往往採取拉取的方式。也即,當發現快取未命中的是,再去上一級進行拉取。
這個方式對於流**就不合適了。流**資料量大,如果出現回源,壓力會比較大,所以往往採取主動推送的模式,將熱點資料主動推送到邊緣節點。
對於防盜煉問題,最常用也最簡單的方法就是利用 http 頭的 refer 字段。當瀏覽器傳送請求的時候,一般會帶上 refer。告訴伺服器是從哪個頁面鏈結過來的,伺服器基於此可以獲得一些資訊用於處理。如果 refer 資訊不是來自本站,就阻止訪問或者跳到其它鏈結。
refer 的機制相對比較容易破解,所以還需要其它的機制配合。
一種常用的機制是時間戳防盜煉。使用 cdn 的管理員可以在配置介面上,和 cdn 廠商約定乙個加密字串。
在服務端,取出過期時間,和當前 cdn 節點時間進行比較,確認請求是否過期。然後 cdn 服務端根據請求的資源及路徑、時間戳、和約定的加密字串進行簽名。只有簽名和客戶端傳送的一致,才會將資源返回給客戶。
動態資源快取
對於動態資源,用到動態 cdn。動態 cdn 主要有兩種模式:
1)「生鮮超市模式」,也就是邊緣計算模式。
既然資料是動態生成的,所以資料的邏輯計算和儲存,也相應的放在邊緣的節點。其中定時從源資料那裡同步儲存的資料,然後在邊緣節點進行計算得到結果。
這種方式很像現在的生鮮超市。新鮮的海鮮大餐是動態的,很難事先做好快取,因而將生鮮超市放在你家旁邊,既能夠送貨上門,也能夠現場烹飪。這就是邊緣計算的一種體現。
2)「冷鏈運輸模式」,也就是路徑優化模式。資料不是在邊緣計算生成的,而是在源站生成的,但是資料的下發則可以通過 cdn 的網路,對路徑進行優化。
因為 cdn 節點較多,能夠找到離源站很近的邊緣節點,也能找到離使用者很近的邊緣節點。中間的鏈路完全由 cdn 來規劃,選擇乙個更加可靠的路徑,使用類似專線的方式進行訪問。
除此之外,這些資源進行傳輸的時候,由於 tcp 的流量控制和擁塞控制,可以在 cdn 加速網路中調整 tcp 的引數,使得 tc 可以更加激進的傳輸資料。
所有這些手段就像冷鏈傳輸,優化整個物流運輸,全程冷凍高速運輸。不管是生鮮從你家旁邊超市送過去,還是從產地運送,保證到你家是新鮮的。
參考:what is a cdn?;
[維基百科 - content delivery network
](劉超 - 趣談網路協議系列課;
網路協議 HTTP協議詳解 CDN快取
cdn 概述 前面我們介紹了 http 快取的原理,以及基於瀏覽器快取和閘道器快取來實現 http 快取,瀏覽器快取由於其侷限性並不是主流的快取實現方案,而閘道器快取雖然解決了瀏覽器快取的問題,但是所有請求仍然要傳送到伺服器部署的資料中心,而我們的使用者是分散在天南海北的,距離資料中心越遠網路延遲越...
CDN網路架構
cdn網路架構主要由兩大部分,分為中心和邊緣兩部分,中心指cdn網管中心和dns重定向解析中心,負責全域性負載均衡,裝置系統安裝在管理中心機房,邊緣主要指異地節點,cdn分發的載體,主要由cache和負載均衡器等組成。當使用者訪問加入cdn服務的 時,網域名稱解析請求將最終交給全域性負載均衡dns進...
cdn網路加速
cdn全稱content delivery network,即內容分發網路。其基本思路是盡可能避開網際網路上有可能影響資料傳輸速度和穩定性的瓶頸和環節,使內容傳輸的更快 更穩定。通過在網路各處放置節點伺服器所構成的在現有的網際網路基礎之上的一層智慧型虛擬網路,cdn系統能夠實時地根據網路流量和各節點...