圖解HTTP權威指南(五) | HTTP快取

作者簡介

李先生(Lemon),高級運維工程師(自稱),SRE專家(目標),夢想在35歲買一輛保時捷。喜歡鑽研底層技術,認為底層基礎才是王道。一切新技術都離不開作業系統(CPU、記憶體、磁碟)、網路等。堅持輸入輸出,記錄自己學習的點滴,在平凡中堅持前行,總有一天會遇見不一樣的自己。公眾號:運維汪(ID:Leeeee_Li)。
                                                                 
                                                                                   
 

一、快取的優點

1、減少冗餘數據傳輸
當很多客戶端訪問一個伺服器時,伺服器會多次傳輸一份文檔每次傳送給一個客戶端。一些相同的位元組會在網路中一遍遍的傳輸,這些冗餘的數據傳輸會耗盡網路頻寬,降低傳輸速度,加種Web伺服器的負載。有了快取,就可以保留第一條伺服器響應的副本,後續請求就可以由快取的副本來響應。
 
2、緩解網路瓶頸
快取可以緩解網路的瓶頸。很多網路為本地網路客戶端提供的頻寬比遠程伺服器提供的頻寬要寬。客戶端會以路徑上最慢的網速訪問伺服器。如果客戶端從一個快速區域網的快取中得到了一個副本,那麼快取就可以提高性能,尤其在傳輸的文件比較大時。
 
3、瞬間擁塞
快取在破壞瞬間擁塞時起到重要的作用。
 
4、距離時延
當頻寬不成問題的情況下,每台路由器會增加網際網路流量的時延。
 

二、快取命中

1、快取命中  
 
已有的副本為某些到達快取的請求提供服務,稱為快取命中(cache hit)
 

 

 

2、快取未命中
 
一些到達快取的請求可能會由於沒有副本可用,而被轉發到原始伺服器,稱為快取未命中(cache miss)
 

 

 

3、HTTP再驗證
 
原始伺服器的內容可能會發生變化,快取要對其進行檢測,看他們保存的副本是否仍然是伺服器上最新的副本,這種新鮮度檢測被稱為HTTP再驗證。
 
3.1、再驗證命中
 
快取對快取的副本進行再驗證時,會向原始伺服器發送一個小的再認證請求。如果內容沒有變化,伺服器返回304 Not Modified。這種認證稱為再驗證命中(revalidate hit)或緩慢命中(slow hit)
 

 

 

3.2、再驗證未命中
 
如果伺服器對象已與快取副本不同,伺服器返回200 OK
 

 

 

3.3 對象被刪除
 
如果伺服器對象已經被刪除了,伺服器就返回404 Not Found響應,快取也會將其副本刪除。
 
4、快取命中率
 
快取提供服務的請求所佔的比例稱為快取命中率(cache hit rate),也稱文檔命中率(document hit rate)。
 
5、位元組命中率
 
位元組命中率表示的是快取提供的位元組在傳輸的所有位元組中所佔的比例。
 
 

三、快取的處理步驟

 

 

1、接收–快取從網路中接收抵達的請求報文。
2、解析–快取對報文進行解析,提取出URL和各種首部。
3、查詢–快取查看是否有本地副本可用,如果沒有,就去伺服器獲取一份並保存在本地。
4、新鮮度檢查–快取查看已快取的副本是否新鮮,如果不是,就詢問伺服器是否有任何更新。
5、創建響應–快取用新的首部和已快取的主體來構建一條響應報文。
6、發送–快取通過網路將響應發回給客戶端。
7、日誌–快取可選的創建一個日誌文件條目來描述這個事務。
 
 

四、標記

1、過期響應首部
 
Cache-Control: max-stale 快取可以隨意提供過期的文件
Cache-Control: max-stale=<s> 在<s>秒時間內,文檔就不能過期
Cache-Control: min-fresh=<s> 至少在為了<s>秒內文檔要保持新鮮
Cache-Control: max-age 資源能夠被快取(保持新鮮)的最大時間,max-age是距離請求發起的時間的秒數
Cache-Control:no-cache 每次由請求發出時,快取會將此請求發送到伺服器進行再認證,如果沒有過期,快取才使用本地的快取副本返回
Cache-Control:no-store 快取中不得存儲任何關於客戶端和服務端響應的內容,每次由客戶端發起的請求都會下載完整的響應內容
Expires 指定一個絕對的過期日期,如果過期日期已經過了,就說明文檔不再新鮮了。如Wed, 06 Jan 2021 09:35:39 GMT

 

 
在快取文檔過期前,快取可以任意頻率使用這些副本,無需與伺服器聯繫(特殊情況除外)。一旦已快取文檔過期,快取就必須與伺服器進行核對,詢問文檔是否被修改過,如果被修改過,就要獲取一份新的(帶有新的過期日期)的副本。
 
2、條件方法再驗證
 
If-Modified-Since: <date> 如果從指定日期之後文檔被修改過了,就執行請求的方法。可以與Last-Modifed伺服器響應首部配合使用,只有在內容被修改後與已快取版本有所不同的時候採取獲取內容。
If-None-Match:<tags> 伺服器可以為文檔提供特殊的標籤(ETag),而不是將其與最近修改的日期相匹配。這些標籤就像序列號一樣。如果已快取標籤與伺服器文檔中的標籤不一樣。If-None-Match首部就會執行所請求的方法。
 

五、學習交流

歡迎大家關注我的公眾號,一起交流、學習。