HTTP緩存和斷點續傳的標誌

每個瀏覽器都自帶了HTTP緩存實現功能。只需要確保每個服務器響應都提供正確的HTTP響應頭標誌,以指示瀏覽器何時可以緩存響應以及可以緩存多久。

Cache-Control

image.png

每個服務端資源可以通過Cache-Control標誌定義其緩存策略。

Cache-Control控制誰在什麼條件下可以緩存響應 以及 可以緩存多久。

  • max-age

指定從請求的時間開始,允許獲取的響應被重用的最長時間(單位:秒)。

例如,max-age=60表示可在接下來的60秒緩存和重用響應。

  • no-cacheno-store

no-cache 表示必須先與服務器確認返回的響應是否發生了變化,然後才能使用該響應來滿足後續對同一網址的請求。因此,如果存在合適的驗證令牌(ETag),no-cache會發起往返通信來驗證緩存的響應。如果資源未發生變化,則不下載資源。

no-store 相對簡單,直接禁止 瀏覽器以及所有中間緩存 存儲任何版本的返回響應。例如,包含個人隱私數據或銀行業務數據的響應。每次用戶請求該資源時,都會向服務器發送請求,並下載完整的響應。

  • publicprivate

public 表示無論什麼情況(比如,有與它相關聯的驗證ETag,響應狀態碼無法正常緩存),響應都可以被緩存。大多數情況下,public不是必須的,因爲明確的緩存信息(如 max-age)已表示響應是可以緩存的。

private 表示瀏覽器可以緩存這個響應,這個響應通常只爲單個用戶緩存,不允許任何中間緩存對其進行緩存。例如,用戶的瀏覽器可以緩存包含用戶信息的HTML網頁,但CDN不可以。

例子說明

Cache-Control: max-age=86400 

瀏覽器以及任何中間緩存均可以將響應(public響應)緩存長達1天(60秒 * 60分鐘 * 24小時)

Cache-Control: private,max-age=600 

客戶端的瀏覽器只能將響應緩存最長10分鐘(60秒 * 10分鐘)。

Cache-Control: no-store 

不允許緩存響應,每次請求都必須完整獲取。

ETag

image.png

服務器使用ETag標誌代表驗證令牌,它可以實現高效的資源更新檢查,資源未發生變化時不會傳送任何數據。

ETag 可以解決max-age過期重新請求,但服務端資源未發生變化,重新下載效率太低的問題。

比如這樣一個場景:假如在首次獲取資源120秒後(max-age=120),瀏覽器又對該資源發起了新的請求。首先,瀏覽器會檢查本地緩存並找到之前的響應。可惜該響應現在已過期,瀏覽器無法使用。此時,瀏覽器可以直接發出新的請求,並獲取新的完整響應。但是這樣做效率太低,因爲如果資源未發生變化,那麼下載 與緩存中相同 的資源,則太浪費網絡流量。

有了ETag就可以解決這樣的問題場景。服務器生成並返回的隨機令牌ETag通常是文件內容的哈希值 或 某個其他指紋。客戶端只需在下一次請求時,將其(ETag)發送至服務器。如果ETag仍然相同,則表示資源未發生變化,可以跳過下載。

例如上面圖片,客戶端自動在If-None-Match的HTTP請求頭中請求ETag令牌。服務器根據當前資源覈對令牌。如果它未發生變化,服務器將返回304 Not Modified響應,告知瀏覽器緩存中的響應未發生變化,可以再延用120秒。這樣瀏覽器就不用再次下載響應,節約時間和帶寬。

range & Content-Range

HTTP1.1 協議(RFC2616)開始支持獲取文件的部分內容,從而支持HTTP斷點續傳。客戶端的請求頭對應的參數是range,服務端的響應頭對應的參數是Content-Range

range

請求頭的參數,一般格式如下:

range: (unit=first byte pos)-[last byte pos]

指定第一個字節的位置和最後一個字節的位置。

例子說明

range: bytes=0-7569

表示第 0-7569 字節範圍的內容

range: bytes=-7569

表示最後7569字節的內容

range: bytes=0-

表示從第0字節開始到文件結束部分的內容

range: bytes=0-0,-1

表示第一個和最後一個字節

range: bytes=100-200,400-500,600-700

同時指定幾個範圍

Content-Range

響應頭的參數,服務器返回當前接受的範圍和文件總大小。一般格式如下:

Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]

例子說明

Content-Range: bytes 0-7569/50000

0-7569指當期發送的數據範圍,50000指文件的總大小

在響應完成後,返回的響應頭內容表示不同的意思

HTTP/1.1 200 Ok(不使用斷點續傳方式) 
HTTP/1.1 206 Partial Content(使用斷點續傳方式)

參考

https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching

HTTP 斷點續傳(分塊傳輸)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章