一次完整 HTTP 調用涉及到的技術
- 2020 年 2 月 19 日
- 筆記
DNS 解析域名
什麼是 DNS
我們訪問網站的時候會輸入域名,而在真實網路中主機通訊是通過 IP 地址進行通訊的,DNS 伺服器的作用就是將這域名字元串解析為對應的 IP 地址
有哪些 DNS 伺服器
如果說每輸入一個域名都需要去一個 DNS 伺服器解析的話,全世界這麼高的訪問量,肯定是無法承載的,所以會對 DNS 伺服器進行按層分級,不同類型的 DNS 伺服器負責解析不同的域名
- 本地 DNS 快取:電腦會將解析到的域名和 IP 地址等快取到本地上,windows 可以通過
ipconfig /displaydns
查看 - 本地 DNS 伺服器
- 如果電腦是自己設置了 DNS 那麼本地 DNS 伺服器就是這個地址
- 如果是根據路由器 DHCP 自動分配,那麼本地 DNS 伺服器就是路由器的 DNS 地址
- 路由器會將請求分發給上層的網路服務提供商的 DNS
- 根域名伺服器:根伺服器主要用來管理互聯網的主目錄,它包含了頂級域名伺服器的 IP 地址
- .com 頂級域名伺服器對應的 IP 地址
- .cn 頂級域名伺服器對應的 IP 地址
- .net 頂級域名伺服器對應的 IP 地址
- 其它
- 頂級域名伺服器:在它其中包含了權威域名的伺服器的 IP 地址
- 權威域名伺服器:返回域名對應的目標主機 IP
DNS 解析流程

當我們輸入 www.abc.com 域名的時候
- 首先去本地快取中查找域名對應的 IP 是否存在,如果存在則直接返回
- 如果不存在則去本地 DNS 伺服器中查找,如果本地 DNS 伺服器有則直接返回
- 如果本地 DNS 伺服器中不存在則開始遞歸查找
- 首先查找根域名伺服器發現訪問的是 .com 然後返回給本地 .com DNS 伺服器對應的 IP 地址
- 然後本地繼續去請求 .com 這個頂級域名伺服器,頂級域名伺服器查找到了 www.abc.com 對應的 DNS 伺服器的 IP 地址返回給客戶端
- 然後本地去請求 www.abc.com 對應的 DNS 伺服器解析這個域名,DNS 伺服器解析後返回對應的主機 IP 地址
在第 6 步驟,DNS 伺服器解析後可以返回多個對應的主機 IP 地址,那麼客戶端訪問的時候可以通過隨機或者輪詢等訪問做簡單的負載均衡處理
上述流程就是一個沒有給域名配置 CDN 的流程
CDN 加速靜態資源訪問
什麼是 CDN
百度百科:CDN是構建在現有網路基礎之上的智慧虛擬網路,依靠部署在各地的邊緣伺服器,通過中心平台的負載均衡、內容分發、調度等功能模組,使用戶就近獲取所需內容,降低網路擁塞,提高用戶訪問響應速度和命中率。CDN的關鍵技術主要有內容存儲和分發技術
記憶體存儲
比如說我們有個圖片網站應用部署在成都,一開始應用只在成都當地推廣本地人使用。後面業務發展出去了,全國各地的人都在訪問了,處於新疆烏魯木齊的用戶發現圖片載入的速度變得很慢(因為圖片這些數據需要從成都通過網線傳輸到烏魯木齊太遠了,而且中途可能存在網路擁擠等等原因)那麼想個辦法,我們在烏魯木齊部署一個快取伺服器,後續烏魯木齊的用戶只要訪問過某張圖片就將其快取到烏魯木齊的伺服器上,後續的訪問就可以變得更快
分發技術
比如說訪問烏魯木齊快取伺服器沒有對應的圖片快取的時候,這個時候可以去訪問西北數據中心獲取數據,西北數據中心沒有再去源數據中心獲取,這樣可以儘可能的減少對源數據中心的訪問減少源數據中心壓力的同時,加速用戶的訪問體驗

- 邊緣結點:距離用戶最近的數據訪問中心,比如成都
- 區域結點:如果邊緣結點中沒有查找到到對應的快取可以去區域結點中,比如西南區域
- 中心節點:如果區域結點數據還是沒有命中則需要回源(訪問源數據中心節點)
經過一層一層數據中心節點數據訪問過後,數據會依次快取到對應的數據中心節點中,後續用戶訪問就可以臨近訪問了
CDN 可以快取什麼
網頁、圖片、文件等一些不經常改變的數據,可以快取到 CDN 中
CDN 如何更新數據
查找的數據有可能不存在,也有可能過期了,如何更新 CDN 快取呢
- 拉取模式
- 推送模式
如果是某份熱點數據,一開始就近 CDN 快取中沒有就向上拉取,如果出現回源,可能導致源數據中心壓力會過大。
這個時候可以採取主動推送模式,將熱點數據主動推送到邊緣結點。
CDN 帶來的問題
- 防盜鏈問題
- 請求附帶 refer 標示來源
- 時間戳防盜鏈
- 數據過期問題
- 當伺服器數據更新後,CDN 數據還未更新時靜態資源訪問可能存在不一致的問題
- 資源都是有設置過期時間的,等到過期時間到了就會回源拉取最新內容
- 主動刷新 CDN 快取,強制性的讓快取失效全部回源拉取最新數據
CDN 解析流程

- 此時配置了 CDN 後,不會直接返回對應的 IP 地址而是返回 CNAME 對應的 CDN 域名 abc.cdn.com
- 解析 abc.cdn.com 得到對應的 IP 地址後請求該 CDN DNS 伺服器,此時返回全局負載均衡域名地址
- 解析 abc.cdn.gslb.com 得到對應的 IP 地址後請求該全局負載均衡器,根據用戶的 IP 地址、所處運營商、URL 攜帶內容以及各 CDN 伺服器的負載情況選擇最為合適的最近的一台或者多態伺服器的 IP 地址給客戶端
- 客戶端可以通過簡單的隨機或者輪詢等操作發起調用
建立 HTTP 連接
HTTP 協議通過 TCP 協議進行數據傳輸,在傳輸數據之前需要建立 TCP 連接

在 HTTP 通訊的時候,建立連接和斷開連接分別需要 3 次握手和四次揮手,效率還是很低的在 HTTP/1.0 的時候每次發送數據都需要建立連接響應完成後就需要斷開連接。自 HTTP/1.1 開始就是長連接了,除非一端主動斷開連接,這樣極大的提升了通訊的效率。
服務端負載均衡處理
服務端一般採用 Nginx 等伺服器來做負載均衡處理,客戶端過來的 HTTP 請求會與 Nginx 建立長連接後開始數據傳輸到達 Nginx,Nginx 會維護到達不同伺服器的長連接將數據轉發到真實的後端伺服器
當然 nginx 也可以以短連接的方式發起請求,只是使用長連接能夠減少 3 次握手和 4 次揮手大大的提升通訊效率,減緩網路擁擠的情況

長連接帶來的問題
我們使用長連接的時候會設置長連接的超時時間,到達時候會釋放連接,那麼在連接釋放的時候,首先服務端會發送 FIN 包到達客戶端,客戶端還未收到 FIN 包的時候,發起了一個 HTTP 請求的話,那麼這個請求就會響應 NoHttpResponseException
解決方案:
- 客戶端重試機制(指定最多重試的次數)
- 定時提前清理閑置的鏈接,客戶端啟用定時任務,在超時之前主動與服務端斷開連接即可
參考
- 圖解 HTTP
- 圖解 TCP/IP 協議
- 極客時間,趣談網路協議