Web 緩存大體能夠分爲:數據庫緩存、服務器端緩存(代理服務器緩存、CDN 緩存)、瀏覽器緩存。數據庫
瀏覽器緩存也包含不少內容: HTTP 緩存、indexDB、cookie、localstorage 等等。這裏咱們只討論 HTTP 緩存相關內容。瀏覽器
瀏覽器緩存主要是 HTTP 協議定義的緩存機制。緩存
2.緩存過時機制
強緩存能夠認爲沒有過時的緩存,協調緩存指已過時但未被服務器修改的內容。服務器
3.強緩存 命中強緩存時,瀏覽器並不會將請求發送給服務器。在Chrome的開發者工具中看到http的返回碼是200,可是在Size列會顯示爲(from cache)。cookie
強緩存是利用http的返回頭中的Expires或者Cache-Control兩個字段來控制的,用來表示資源的緩存時間。 ide
緩存過時時間,用來指定資源到期的時間,是服務器端的具體的時間點。工具
Expires是Web服務器響應消息頭字段,表明資源的失效時間,是絕對是時間。.net
因爲失效時間是一個絕對時間,因此當客戶端本地時間被修改之後,服務器與客戶端時間誤差變大之後,就會致使緩存混亂。因此出現了3.2 Cache-Control3d
https://blog.csdn.net/u012375924/article/details/82806617,講的不錯。localstorage
請求中Cache-Control可選項:
在響應中使用Cache-Control 時,它可選的值有:
Cache-Control是一個相對時間,例如Cache-Control:3600,表明着資源的有效期是3600秒。
Cache-Control比Expires優先級高。
若未命中強緩存,則瀏覽器會將請求發送至服務器。服務器根據http頭信息中的Last-Modify/If-Modify-Since或Etag/If-None-Match來判斷是否命中協商緩存。若是命中,則http返回碼爲304,瀏覽器從緩存中加載資源。
瀏覽器第一次請求一個資源的時候,服務器返回的header中會加上Last-Modify,Last-modify是一個時間標識該資源的最後修改時間:
當瀏覽器再次請求該資源時,發送的請求頭中會包含If-Modify-Since,該值爲緩存以前返回的Last-Modify。服務器收到If-Modify-Since後,根據資源的最後修改時間判斷是否命中緩存。
若是命中緩存,則返回http304,而且不會返回資源內容,而且不會返回Last-Modify。因爲對比的服務端時間,因此客戶端與服務端時間差距不會致使問題。
既然有這個爲何還有4.2 ETag呢?
1. Last-Modified標註的最後修改只能精確到秒級,若是某些文件在1秒鐘之內,被修改屢次的話,它將不能準確標註文件的修改時間;
2. 若是某些文件會被按期生成,修改時間變了,但內容沒變,但Last-Modified卻改變了,致使文件無法使用緩存;
3.有可能存在服務器沒有準確獲取文件修改時間,或者與代理服務器時間不一致等情形。
Etag/If-None-Match返回的是一個校驗碼(ETag: entity tag)。ETag能夠保證每個資源是惟一的,資源變化都會致使ETag變化*。ETag值的變動則說明資源狀態已經被修改。服務器根據瀏覽器上發送的If-None-Match值來判斷是否命中緩存。
5.總結
https://blog.csdn.net/u012375924/article/details/82806617
從狀態碼的角度來看,它們的關係以下圖:
總結:304就是在過時的但沒有失效的狀況下,協助緩存的結果。