為什麼需要CDN
根本上的原因是,通路速度對網際網路應用的使用者體驗、口碑、甚至說直接的營收都有巨大的影響,任何的企業都渴望自己站點有更快的通路速度。而HTTP傳輸時延對web的通路速度的影響很大,在絕大多數情況下是起決定性作用的,這是由TCP/IP協定的一些特點決定的。實體層上的原因是光速有限、信道有限,協定上的原因有丢包、慢啟動、擁塞控制等。
要提高通路速度,最簡單的做法當然就是多設定幾個伺服器,讓終端使用者離伺服器“更近”。典型的例子是各類下載下傳網站在不同地域不同營運商設定鏡像站,或者是像Google那樣設定多個資料中心。但是多設幾個伺服器的問題也不少,一是多地部署時的困難,二是一緻性沒法保障,三則是管理困難、成本很高。實際上,在排除多地容災等特殊需求的情況下,對大多數公司這種做法是不太可取的。當然,這種方案真正做好了,甚至是比後續所說的使用CDN要好的。
CDN是一種公共服務,他本身有很多台位于不同地域、接入不同營運商的伺服器,而所謂的使用CDN實質上就是讓CDN作為網站的門面,使用者通路到的是CDN伺服器,而不是直接通路到網站。由于CDN内部對TCP的優化、對靜态資源的緩存、預取,加上使用者通路CDN時,會被智能地配置設定到最近的節點,降低大量延遲,讓通路速度可以得到很大提升。
CDN的原理
CDN做了兩件事,一是讓使用者通路最近的節點,二是從緩存或者源站擷取資源
CDN有個源站的概念,源站就是提供内容的站點(網站的真實伺服器), 從源站取内容的過程叫做回源。
每次通路的具體流程如圖(以最普通的CDN為例)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CN4MjYlVjMhlDO5E2NiljY0QWOlFzNyQzYmNzYwEzYk9CX1IzLcZDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
具體舉個例子:
使用者在首次通路 https://assets-cdn.github.com/pinned-octocat.svg , 假設不委托local DNS伺服器遞歸查詢,會經曆以下幾個過程
- 浏覽器檢查本地有沒有這個東東的有效緩存,有則使用緩存,沒有有效緩存則進行對
的DNS查詢,獲得一個 CNAME記錄,assets-cdn.github.com
,值得注意的是,多個加速域名可以解析到同一個CNAME,CDN回源和緩存的時候考慮到了hostname,?;igithub.map.fastly.net
- 進行對
的DNS查詢,獲得一個A/AAAA記錄,給出位址github.map.fastly.net
(視網站不同傳回的不一樣,可以有多個), 這一步對CDN來說時十分重要的,它給出了離使用者最近的邊緣節點;103.245.222.133
- 浏覽器選一個傳回的位址,然後進行真正的http請求,開始向
握手,握手完了把http請求頭也發給了該邊緣伺服器;103.245.222.133
- 邊緣伺服器檢查自己的cache裡面有沒有
這個資源,有則傳回給使用者,如果沒有,向CDN中心伺服器發起請求;https://assets-cdn.github.com/pinned-octocat.svg
- CDN中心伺服器檢查自己的cache裡面有沒有這個資源,有則傳回給邊緣伺服器,沒有則回源;
- 中心伺服器發現客戶配置了
的回源位址(這個隻有cdn會知道,假設是github.map.fastly.net
),就把http請求發到源站位址上,源站傳回後傳回給請求方;xxx.xxx.xxx.xxx