我是風箏,公眾號「古時的風箏」,一個兼具深度與廣度的程序員鼓勵師,一個本打算寫詩卻寫起了代碼的田園碼農!
文章會收錄在 JavaNewBee 中,更有 Java 后端知識圖譜,從小白到大牛要走的路都在里面。
當你在訪問淘寶、京東准備剁手的時候,雖然進入頁面的時候有很多的圖片、很多的內容,但是加載起來卻很快,讓你剁手的動作如水般絲滑。嗖的一下好看的商品圖片就出來了,嗖的一下就付款了。當然圖片算是比較小的資源了,那些視頻網站呢,每一個視頻好幾百M、好幾個G,同時有好多的請求過來,就算服務器能抗住,帶寬能跟的上嗎?
難道就是靠大廠背后充足的服務器、寬帶資源以及過硬的優化技術了嗎?當然了,這肯定是必要的條件,除此之外就靠我們今天要說的 CDN 技術了。
什么是 CDN
CDN即內容分發網絡(Content Delivery Network)的簡稱,是建立在承載網基礎上的虛擬分布式網絡,能夠將源站內容(包括各類動靜態資源)智能緩存到全球各節點服務器上。這樣不僅方便了用戶就近獲取內容,提高了資源的訪問速度,也分擔了源站壓力。
CDN(Content Delivery Network)是指內容分發網絡,也稱為內容傳送網絡,這個概念始於1996年,是美國麻省理工學院的一個研究小組為改善互聯網的服務質量而提出的。為了能在傳統IP網上發布豐富的寬帶媒體內容,他們提出在現有互聯網基礎上建立一個內容分發平台專門為網站提供服務,並於1999年成立了專門的CDN服務公司,為Yahoo提供專業服務。由於CDN是為加快網絡訪問速度而被優化的網絡覆蓋層,因此被形象地稱為“網絡加速器”。
CDN 的核心就是加快網絡訪問速度,看下面這張圖,不同地方的終端用戶會訪問到最近的 CDN 服務器,而 CDN 服務器上的內容是源服務器集群上的,不管是通過主動拉取還是被動接收的,總之數據內容是一致的,而且離用戶最近,獲取成本最小速度更快。

現在國內一些比較有實力的大公司會自建 CDN 網絡,用來提升服務性能,當然,成本也是很巨大的,想想看啊,方便用戶就近獲取內容就意味着要在各個地方建立內容節點服務器,就不說向全世界提供服務,就面向整個中國,就要有多少個節點吧。
好在現在很多國內雲服務提供商都有 CDN 服務,可以大大降低自建 CDN 的成本。
使用場景
從 CDN 含義本身分析,內容分發網絡嘛,肯定是需要快速獲取內容的場景才需要 CDN。這些內容包括以下這些:
- 網站中的靜態資源文件,比如圖片、js 腳本、樣式文件等小文件;
- 大文件,比如一些軟件下載站、一些視頻、圖像資源下載站等;
- 在線音頻、視頻網站,比如網易雲音樂、騰訊視頻等;
比如我打開天貓商城看了一下,看到其中很多靜態文件都來自於不同的域名,有很多域名中帶着 CDN 字樣,明顯都是來自於 CDN 節點的。

那都是靜態文件啊,動態內容能不能也放到 CDN 上呢?那這就變味兒了,CDN 只放靜態內容可以快速簡單的實現,如果加入動態內容,那不就成了多機房分布式部署了嗎。倒也不是沒有折中的辦法,邊緣計算就是這樣一種策略,邊緣節點既能做 CDN,也具備一些計算能力,可以有一些簡單的動態執行能力。這就不在討論的范圍之內了。
如果你做過前端開發的話,可能用過一些 JavaScript 開發CDN,比如七牛雲和又拍雲等等。

原理
沒有 CDN 的請求路徑
在沒有 CDN 的情況下,一次資源請求的路徑是什么樣子的呢。
1、首先用戶在瀏覽器輸入域名,比如進入天貓主頁;
2、用戶所在的電腦查詢 hosts 中看是否有對應的 IP ,如果有就直接請求 IP;
3、如果沒有在本地緩存,則向本地 DNS 發起請求,本地 DNS 查找域名對應的 IP(一般是 A 記錄);
4、如果本地 DNS 沒有找到,則向上級 DNS 服務器請求,一級一級的知道查到最頂級 DNS 服務器;
5、向找到的域名對應的 IP 發起請求;
6、資源所在的集群向客戶端返回請求的資源,比如圖片、樣式文件、視頻文件等;
有了 CDN 之后
當有了 CDN 接入之后,事情就稍微變得復雜了一點。
1、用戶在瀏覽器輸入域名,比如進入天貓主頁;
2、用戶所用的電腦向本地 DNS 服務器請求,查詢域名的IP地址;
3、本地 DNS 服務器中如果緩存有這個域名的記錄,則直接響應用戶的解析請求,否則本地DNS向根DNS 查詢域名的授權服務器;
4、根DNS將域名授權DNS記錄返回給本地DNS;
5、本地 DNS 得到域名的授權DNS記錄后,繼續向域名授權DNS查詢域名的IP地址;
6、域名授權DNS查詢域名記錄后(一般是CNAME),返回給本地DNS;
7、本地DNS得到域名記錄后,向智能DNS查詢域名的IP地址;
8、智能DNS根據一定的算法和策略(比如靜態拓撲,容量等),將最合適的CDN節點IP地址返回給 本地DNS;
9、本地DNS將得到的域名IP地址,返回給用戶終端;
10、用戶得到域名IP地址后,訪問站點服務器;
11、CDN節點服務器應答請求,將內容返回給客戶端,CDN服務器同時在本地進行保存,以備下次使用。
下面的流程圖畫出了整個請求過程。

大致的流程就是上面的樣子,真實情況下,智能 DNS 可能更加復雜一些。因為一個地區的 CDN 很可能不是單純的一台機器或一個集群,而是一個小范圍的分布式部署。
比如全國范圍內是一個大的 CDN 網絡,那智能 DNS 其實就是一個智能負載均衡器,它會根據一系列的指標,比如地理位置、線路等情況返回一個 IP 地址,這個地址可能並不是一個 CDN 服務器的 IP,而是一個小范圍的智能負載均衡器地址,這個負載均衡器可能協調的某一個省的 CDN 節點,當定向到這個負載均衡器之后,又會根據一系列的指標,將返回一個最合適的 CDN 節點的 IP 給客戶端。
CDN 核心部件
智能 DNS
智能調度DNS是CDN服務中的關鍵系統,當用戶訪問加入CDN服務的網站時,域名解析請求將最終由 “智能調度DNS”負責處理。它通過一組預先定義好的策略,將當時最接近用戶的節點地址提供給用戶,使用戶可以得到快速的服務。同時它需要與分布在各地的CDN節點保持通信,跟蹤各節點的健康狀態、容量等信息,確保將用戶的請求分配到就近可用的節點上。
緩存功能服務
負載均衡器
CDN 節點通常都是以集群或者區域集群的形式存在的,負載均衡器可以將請求分派到最合適的 CDN 服務器上。負載均衡器可能是硬件 F5,也可能是 LVS、HA、Nginx 等軟件形式。
內容緩存服務器
CND 提供的就是內容加速,當然要有地方存內容了。如果是小的靜態文件還好,如果是大的視頻文件等,那對大容量的存儲和高速讀也是有一定要求的。
內容管理服務
最開始內容都是存儲在源服務器中的,那總得想辦法讓內容存儲到各個 CDN 節點上。那通過什么方式呢,最簡單的辦法就是當客戶端訪問的某個 CDN 之后,發現里面沒有需要的內容,就到源服務器上去拉取。
內容傳輸可以有兩種模式,一種推模式,一種拉模式。推模式是源服務器像各個 CDN 節點主動推送,這種方式就比較靈活了,但是實現比較復雜,假設有個管理控制台,管理員選擇某些需要推送的文件,然后選擇需要推送的 CDN 節點,點擊推送按鈕,將文件主動推送過去。
指標
通用指標
衡量 CDN 服務的性能有如下幾個指標:
- 延時:指一個數據包從用戶的計算機發送到網站服務器,然后再立即從網站服務器返回用戶計算機的來回時間。延時越低,性能越好。
- 下載速度:指用戶從網絡上或者網絡服務器上下載的數據時的傳輸速度。下載速度越快,性能越好。
- 打開速度:指用戶打開網站的速度。打開速度越快,性能越好。
- 丟包率:指用戶在網絡傳輸中所丟失數據包數量占所發送數據組的比率。
- 回源率:回源率分為回源請求數比例及回源流量比例兩種。
- 回源請求數比:指邊緣節點對於沒有緩存、緩存過期(可緩存)和不可緩存的請求占全部請求記錄的比例。越低則性能越好。
- 回源流量比:回源流量是回源請求文件大小產生的流量和請求本身產生的流量。所以回源流量比=回源流量/(回源流量+用戶請求訪問的流量),比值越低,性能越好。
- 緩存命中率:指終端用戶訪問加速節點時,該節點已緩存了要被訪問的數據的次數占全部訪問次數的比例。緩存命中率越高,性能越好。
好處
1、本地Cache加速,提高了企業站點(尤其含有大量圖片和靜態頁面站點)的訪問速度,並大大提高以上性質站點的穩定性;
2、鏡像服務消除了不同運營商之間互聯的瓶頸造成的影響,實現了跨運營商的網絡加速,保證不同網絡中的用戶都能得到良好的訪問質量;
3、遠程訪問用戶根據DNS負載均衡技術,智能自動選擇Cache服務器,選擇最快的Cache服務器,加快遠程訪問的速度;
4、帶寬優化:自動生成服務器的遠程Mirror(鏡像)cache服務器,遠程用戶訪問時從cache服務器上讀取數據,減少遠程訪問的帶寬、分擔網絡流量、減輕原站點WEB服務器負載等功能;
5、集群抗攻擊:廣泛分布的CDN節點加上節點之間的智能冗余機制,可以有效地預防黑客入侵以及降低各種DDos攻擊對網站的影響,同時保證較好的服務質量 。
這位英俊瀟灑的少年,如果覺得還不錯的話,給個推薦可好!
公眾號「古時的風箏」,Java 開發者,全棧工程師,bug 殺手,擅長解決問題。
一個兼具深度與廣度的程序員鼓勵師,本打算寫詩卻寫起了代碼的田園碼農!堅持原創干貨輸出,你可選擇現在就關注我,或者看看歷史文章再關注也不遲。長按二維碼關注,跟我一起變優秀!

