10分鐘徹底搞懂Http的強制快取和協商快取

2021-10-06 18:24:54 字數 2431 閱讀 6089

瀏覽器快取

瀏覽器快取是瀏覽器在本地磁碟對使用者最近請求過的文件進行儲存,當訪問者再次訪問同一頁面時,瀏覽器就可以直接從本地磁碟載入文件。

所以根據上面的特點,瀏覽器快取有下面的優點:

瀏覽器快取是web效能優化的重要方式。那麼瀏覽器快取的過程究竟是怎麼樣的呢?

在瀏覽器第一次發起請求時,本地無快取,向web伺服器傳送請求,伺服器起端響應請求,瀏覽器端快取。過程如下:

在第一次請求時,伺服器會將頁面最後修改時間通過last-modified標識由伺服器傳送給客戶端,客戶端記錄修改時間;伺服器還會生成乙個etag,並傳送給客戶端。

瀏覽器後續再次進行請求時:

瀏覽器快取主要分為強強快取(也稱本地快取)和協商快取(也稱弱快取)。根據上圖,瀏覽器在第一次請求發生後,再次傳送請求時:

一 強制快取

強制快取整體流程比較簡單,就是在第一次訪問伺服器取到資料之後,在過期時間之內不會再去重複請求。實現這個流程的核心就是如何知道當前時間是否超過了過期時間。

強制快取的過期時間通過第一次訪問伺服器時返回的響應頭獲取。在 http 1.0 和 http 1.1 版本中通過不同的響應頭欄位實現。

在 http 1.0 版本中,強制快取通過 expires 響應頭來實現。 expires 表示未來資源會過期的時間。也就是說,當發起請求的時間超過了 expires 設定的時間,即表示資源快取時間到期,會傳送請求到伺服器重新獲取資源。而如果發起請求的時間在 expires 限定的時間之內,瀏覽器會直接讀取本地快取資料庫中的資訊(from memory or from disk),兩種方式根據瀏覽器的策略隨機獲取。

在 http 1.1 版本中,強制快取通過 cache-control 響應頭來實現。cache-control 擁有多個值:

最常用的字段就是 max-age=*** ,表示快取的資源將在 *** 秒後過期。一般來說,為了相容,兩個版本的強制快取都會被實現。

總結

強制快取只有首次請求才會跟伺服器通訊,讀取快取資源時不會發出任何請求,資源的 status 狀態碼為 200,資源的 size 為 from memory 或者 from disk ,http 1.1 版本的實現優先順序會高於 http 1.0 版本的實現。

二 協商快取

協商快取與強制快取的不同之處在於,協商快取每次讀取資料時都需要跟伺服器通訊,並且會增加快取標識。在第一次請求伺服器時,伺服器會返回資源,並且返回乙個資源的快取標識,一起存到瀏覽器的快取資料庫。當第二次請求資源時,瀏覽器會首先將快取標識傳送給伺服器,伺服器拿到標識後判斷標識是否匹配,如果不匹配,表示資源有更新,伺服器會將新資料和新的快取標識一起返回到瀏覽器;如果快取標識匹配,表示資源沒有更新,並且返回 304 狀態碼,瀏覽器就讀取本地快取伺服器中的資料。

在 http 協議的 1.0 和 1.1 版本中也有不同的實現方式。

在 http 1.0 版本中,第一次請求資源時伺服器通過 last-modified 來設定響應頭的快取標識,並且把資源最後修改的時間作為值填入,然後將資源返回給瀏覽器。在第二次請求時,瀏覽器會首先帶上 if-modified-since 請求頭去訪問伺服器,伺服器會將 if-modified-since 中攜帶的時間與資源修改的時間匹配,如果時間不一致,伺服器會返回新的資源,並且將 last-modified 值更新,作為響應頭返回給瀏覽器。如果時間一致,表示資源沒有更新,伺服器返回 304 狀態碼,瀏覽器拿到響應狀態碼後從本地快取資料庫中讀取快取資源。

這種方式有乙個弊端,就是當伺服器中的資源增加了乙個字元,後來又把這個字元刪掉,本身資源檔案並沒有發生變化,但修改時間發生了變化。當下次請求過來時,伺服器也會把這個本來沒有變化的資源重新返回給瀏覽器。

在 http 1.1 版本中,伺服器通過 etag 來設定響應頭快取標識。etag 的值由服務端生成。在第一次請求時,伺服器會將資源和 etag 一併返回給瀏覽器,瀏覽器將兩者快取到本地快取資料庫。在第二次請求時,瀏覽器會將 etag 資訊放到 if-none-match 請求頭去訪問伺服器,伺服器收到請求後,會將伺服器中的檔案標識與瀏覽器發來的標識進行對比,如果不相同,伺服器返回更新的資源和新的 etag ,如果相同,伺服器返回 304 狀態碼,瀏覽器讀取快取。

總結

協商快取每次請求都會與伺服器互動,第一次是拿資料和標識的過程,第二次開始,就是瀏覽器詢問伺服器資源是否有更新的過程。每次請求都會傳輸資料,如果命中快取,則資源的 status 狀態碼為 304 而不是 200 。同樣的,一般來講為了相容,兩個版本的協商快取都會被實現,http 1.1 版本的實現優先順序會高於 http 1.0 版本的實現。

您可能感興趣的文章:

10分鐘徹底搞懂Http的強制快取和協商快取

強制快取整體流程比較簡單,就是在第一次訪問伺服器取到資料之後,在過期時間之內不會再去重複請求。實現這個流程的核心就是如何知道當前時間是否超過了過期時間。強制快取的過期時間通過第一次訪問伺服器時返回的響應頭獲取。在http 1.0和http 1.1版本中通過不同的響應頭欄位實現。在http 1.0版本...

1分鐘徹底搞懂關於nginx的proxy pass

下面這段不重要,知道就好 nginx的官網將proxy pass分為兩種型別 一種是只包含ip和埠號的 連埠之後的 也沒有,這裡要特別注意 比如proxy pass http localhost 8080,這種方式稱為不帶uri方式 另一種是在埠號之後有其他路徑的,包含了只有單個 的如proxy p...

10分鐘入門HTTP協議

所學習的協議版本是http 1.1 http是基於tcp的協議,所以可靠性是由傳輸層來保障的.在使用協議時,發出請求的是客戶端,接收請求的是服務端。所以在操作方面,http協議分為了2部分 request請求 response響應 uri uniform resourceidentifier 格式 ...