一個文件請求到服務器CDN的過程?
以下文章講解絕對是搬磚了,公司內部技術分享講解的內容,一字不落的通讀一遍感覺真心不錯,可以在MS的時候當問你瀏覽器加載URL發生了什么的時候把這些加上噴死MSG。還有,着重看下CDN工作過程和DNS解析過程。
CDN
由於在不同的地域或者不同的運營商的用戶訪問網站的響應速度存在差異,為了提高用戶的訪問速度,需要在用戶和服務器之間增加一層中間層,使用戶能以最快的速度,從最近的地方獲得所需的信息,徹底解決網絡擁塞,提升響應速度,是目前大型網站使用的流行的應用方案。CDN的全稱是Content Delivery Nerwork,即內容分發網絡。CDN是構建在網絡之上的內容分發網絡,通過在現有的Internet中增加一層新的cache層,依靠部署在各地的邊緣服務器,通過中心平台的負載均衡、內容分發、調度等功能模塊,CDN系統能夠實時的根據網絡流量和各節點的鏈接、負載狀況以及用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上,使用戶就近獲取所需的內容,降低網絡擁塞,提高用戶訪問的響應速度和命中率。
CDN的組成
CDN網絡主要由中心節點、邊緣節點兩部分構成。
中心節點
包括CDN網管中心和全局負載均衡系統,負責整個CDN網絡的分發及管理CDN負載均衡系統通過對DNS重定向解析,將用戶的請求導向整個CDN網絡中的最佳節點。通常負載均衡可以分為兩個層次:全局負載均衡(GSLB)和區域負載均衡(SLB)。全局負載均衡主要的目的是在整個網絡范圍內將用戶的請求定向到最近的節點(或者區域)。因此,就近性判斷是全局負載均衡的主要功能。區域負載均衡一般局限於一定的區域范圍內,其目標是在特定的區域范圍內尋找一台最適合的節點提供服務,因此,CDN節點的健康性、負載情況、支持的媒體格式等運行狀態是本地負載均衡進行決策的主要依據。
邊緣節點
每個邊緣節點有兩部分組成:負載均衡設備和高速緩存服務器。負載均衡設備負責每個節點中各個cache的負載均衡,保證節點的工作效率;同時負載均衡設備還負責收集節點與周圍環境的信息,保持與全局負載DNS的通信,實現整個系統的負載均衡;高速緩存服務器(cache)負責存儲客戶網站的大量信息,就像一個靠近用戶的網站服務器一樣響應本地用戶的訪問請求。
CND的工作過程
這塊讀下來感覺挺好的 會把整個請求機制(不涉及瀏覽器渲染、ajax請求那些東西,僅僅是請求地址解析這塊)講的步驟很清晰了
-
輸入一個網址,瀏覽器發現本地沒有關於整個網址的DNS緩存,然后向本地的DNS服務器請求該域名的解析
-
本地DNS服務器中如果緩存有這個域名的解析記錄,則直接響應用戶的請求,如果沒有關於整這個域名的解析記錄的緩存,則以迭代查詢的方式進行DNS解析,將結果返回給瀏覽器
-
(沒有使用CDN的情況)瀏覽器得到域名解析的結果,就是該域名對應的服務器的IP地址
-
(使用CDN的情況)瀏覽器得到的域名解析結果是網站的DNS服務器設置的CNAME,指向了某個CDN服務器(如阿里,騰訊雲之類的供應商),CDN的DNS服務器將CDN的全局負載均衡設備的IP地址返回給用戶
-
用戶向CDN的全局負載均衡設備發起URL訪問請求
-
CDN全局負載均衡設備根據用戶IP地址,以及用戶請求的URL,選擇一台用戶所在區域的區域負載均衡設備,告訴用戶向這台設備發起請求。
-
區域負載均衡設備會為用戶選擇一台合適的緩存服務器提供服務,選擇的依據包括:根據用戶的IP地址,判斷哪一台服務器離用戶最近;根據用戶所請求的URL中攜帶的內容名稱,判斷哪一台服務器上有用戶所需的內容;查詢各個服務器當前的負載情況,判斷哪一台服務器上有服務能力。基於以上這些條件的綜合分析后,區域負載均衡設備會向全局負載均衡設備返回一台緩存服務器的IP地址。
- 全局負載均衡設備把服務器的IP地址返給用戶。
- 用戶向緩存服務器發起請求,緩存服務器響應用戶請求,將用戶所需內容傳送到用戶終端。如果這台緩存服務器上沒有用戶想要的內容,而區域均衡設備依然將它分配給用戶,那么這台服務器就要向他的上一級緩存服務器請求內容,直至追溯到網站的源服務器將內容拉到本地。
注:瀏覽器對訪問的域名進行解析,由於CDN參與后,對域名解析過程進行了調整,解析的結果不再是一個IP地址,而是該域名對應的CNAME。但CNAME無法完成最終的內容獲取,所以瀏覽器要再次對獲得CNAME進行DNS解析,以得到實際的IP地址。在此過程中,CDN會根據用戶實際的地理位置解析對應的IP地址,使用戶能就近訪問。單一服務器的場景下,通過將大量子域名指向到CNAME,再由CNAME指向單一域名,解決了服務器更換、遷移帶來的大量域名重新指向的問題。另一方面,CNAME配合負載均衡系統,還可以實現將大量訪問需求通過CNAME指向到多台服務器,以提高用戶訪問的速度。在不同區域的用戶訪問同一個域名卻得到不同CDN節點的IP地址,依靠的是智能調度DNS。當用戶訪問加入CDN服務的網站時,域名解析請求將最終由”智能調度DNS“負責處理。它通過一組預先定義后的策略,將當時最接近用戶的節點地址提供給用戶,使用戶可以得到快速的服務。同時它需要與分布在各地的CDN節點保持通信、跟蹤各節點的健康狀態、容量等信息、確保將用戶的請求分配到就近可用的節點上。
結合上述兩點,為了使用CDN緩存,我們至少要對靜態資源的部署作出兩項改變:
- 將靜態資源部署到不同網絡線路的服務器中,以加速對應網絡中CDN節點無緩存時回源的速度
- 加載靜態資源時使用與頁面不同的域名,一方面是便於接入為CDN而設置的智能DNS解析服務,另一方面因為靜態資源和主頁面不同域,這樣加載資源的HTTP請求就不會帶上主頁面中的cookie等數據,減少了數據傳輸量,又進一步加快網絡訪問。
回源:當有用戶訪問某個資源的時候,如果被解析到的那個CDN節點沒有緩存響應的內容,或是緩存已經過期,就會回源站去獲取。沒有人訪問,CDN節點不會主動去源站請求資源
特點:
CDN節點解決了跨運營商和跨地域訪問的問題,訪問延時大大降低;
大部分請求在CDN邊緣節點完成,CDN起到了分流作用,減輕了源站的負載;
可以有效地預防黑客入侵以及降低各種DDoS攻擊對網站的影響
注:想了解 DDoS攻擊 可以自己查查資料了解一下
DNS
DNS(Domain Name System)域名系統是互聯網的一項核心服務,它的作用就是把域名映射成計算機可以識別的IP地址,這個過程稱為域名解析,域名解析需要專門的域名解析服務器來完成
域名的層級
www.example.com真正的域名是www.example.com.root,簡寫為www.example.com。因為根域名.root對於所有域名都是一樣的,所以一般是省略。根域名的下一級,叫做頂級域名(top-level domain,縮寫為TLD),比如.com、.net;再下一級叫次級域名(second-level domain,縮寫為SLD),比如www.example.com里面的.example,這一級的域名使用戶可以注冊的;再下一級是主機名(host),比如www.example.com里面的www,這是用戶在自己的域里面為服務器分配的名稱,是用戶可以任意分配的。
DNS記錄類型
域名與IP之間的對應關系,稱為”記錄“(record)。
- A(Address)地址記錄:是用來指定域名對應的IP地址記錄。
- NS域名服務器記錄(Name Server):返回保存下一級域名信息的服務器地址。該記錄只能設置為域名,不能設置為IP地址。
- CNAME記錄:即別名記錄,就是把域名解析到另外一個域名,這種記錄允許將多個名字映射到另外一個域名。
- MX郵件記錄(Mail eXchagne):表示域名對應的事郵件服務器地址。
- PTR逆向查詢記錄(Pointer Record):用於從IP地址反查域名。
DNS服務器根據域名的層級,進行分級查詢。所謂”分級查詢“,就是從根域名開始,依次查詢每一級域名的NS記錄,直到查到最終的IP地址,大致過程如下:
- 從根域名服務器查到頂級域名服務器的NS記錄和A記錄
- 從頂級域名服務器查到次級域名服務器的NS記錄和A記錄
- 從次級域名服務器查出主機名的IP地址
DNS解析過程
域名解析實際上就是解析出指定的域名所對應的IP地址,或者該域名的一個CNAME。如果這個域名對應的是IP地址,則返回這個IP地址,如果對應的是CNAME,則繼續查找CNAME域名對應的IP地址,然后將該地址返回。一個域名在DNS服務器中可以配置多個A記錄,即對應對個IP地址,DNS服務器利用負載均衡算法計算出一個IP地址並返回,這樣通過在A記錄中配置多個服務器就可以構成一個集群實現負載均衡。
域名解析過程
主機向本地域名服務器LDNS的查詢一般都是采用遞歸查詢。所謂遞歸查詢就是:如果主機所詢問的本地域名服務器不知道被查詢域名的IP地址,那么本地域名服務器就以DNS客戶的身份向其他根域名服務器繼續發出查詢請求報文(即替主機繼續查詢),而不是讓主機自己進行下一步查詢。因此,遞歸查詢返回的查詢結果或者是所要查詢的IP地址或者是報錯,表示無法查詢所需的IP地址。本地域名服務器LDNS向根域名服務器的查詢是迭代查詢。迭代查詢的特點:當根域名服務器收到本地域名服務器發出的迭代請求報文時,要么給出所要的IP地址,要么告訴本地服務器下一步應當向哪一個域名服務器進行查詢。然后本地服務器進行后續的查詢。根域名服務器通常是把自己知道的頂級域名服務器的IP地址告訴本地域名服務器,讓本地域名服務器再向頂級域名服務器查詢。頂級域名服務器在收到本地域名服務器的查詢請求后,要么給出所要查詢的IP地址,要么告訴本地域名服務器下一步應當向哪一個權限域名服務器進行查詢。最后知道了所要解析的IP地址或報錯,然后把這個結果返回給發起查詢的主機。
- 瀏覽器會檢查緩存中有沒有這個域名對應的解析過的IP地址,如果有,這個解析過程就結束了,直接拿到IP地址進行訪問。這個瀏覽器緩存域名是有限制的,除了緩存大小有限制緩存時間也有限制,由TTL屬性來配置。
- 如果用戶瀏覽器緩存中沒有,瀏覽器會查找操作系統中是否有這個域名對應的DNS解析結果。Windows中C:/windows/system32/drivers/etc/hosts文件設置,linux中/etc/hosts文件中設置。當解析到這個配置文件中的某個域名時,操作系統會在緩存中緩存這個結果。(修改hosts文件不立即生效的原因)
- 當前面兩步驟都不能解析時,操作系統會把這個域名發送到LDNS,一般是本地區域名服務器或者是自己設置的域名服務器地址,如果命中,那解析就此結束並返回IP並標記為非權威服務器的應答。如果是學校的互聯網,那么你的DNS服務器肯定在你的學校,如果你是一個小區接入互聯網,那這個DNS就是提供給你接入互聯網的應用供應商(電信、聯通等),Windows中可以用ipconfig查看DNS服務器地址,Linux中cat/etc/resolv.conf可以查看DNS服務器地址。
- 如果LDNS沒有命中,LDNS就會像Root Server域名服務器請求解析。LDNS會從配置文件里面讀取13個根域名服務器地址,然后向其中一台發起請求。
- 根服務器拿到請求后,返回這個頂級域名.com對應的NS記錄,一般來說是13台主機名和IP(gTLD-國際頂級域名服務器地址),返回給本地域名服務器即LDNS。
- LDNS再向上一步返回的其中一台gLTD服務器發送請求,.com域名服務器(gLTD)返回次級域名xx.com對應的NS記錄,返回給本地域名服務器即LDNS。
- LDNS接受gLTD返回的服務器地址(即域名服務提供商的域名服務器)並向其中的一台再次發起請求,在xx.com的域下面查詢是否有www的這台主機,如果有就把這個IP地址返回。
- LDNS接受返回的IP地址和TTL值。
- LDNS緩存這個域名和IP的對應關系,緩存時間由TTL控制。
- LDNS把解析的結果返回給用戶,用戶根據TTL值緩存在本地系統的緩存中,域名解析結束。
TTL(Time-To-Live),簡單的說它表示一條域名解析記錄在DNS服務器上緩存的時間。當各地的DNS服務器接收到解析請求時,就會向域名指定的DNS服務器發出解析請求從而獲得解析記錄;
在獲得這個記錄之后,記錄會在DNS服務器中保存一段時間,這段時間內如果再接受到這個域名的解析請求,DNS服務器將不再向下一級的DNS服務器發出請求,而是直接返回剛才獲得的記錄;
而這個記錄在DNS服務器上保留的時間就是TTL值。
利用dig查看DNS解析過程 https://www.cnblogs.com/jeavenwong/p/11406922.html
QUESTION SECTION:查詢的內容
ANSWER SECTION:相應的內容,一般會得到至少一條A記錄,否則就還沒有定義
AUTHORITY SECTION:授權信息
ADDITIONAL SECTION:每個授權服務器的IP地址
SERVER:查詢的DNS服務器,可能會被緩存