http缓存机制和原理详解
【背景】
http1.1
http1.1 是1997年開始使用的。
http是一種協議,用于傳輸瀏覽器發送的數據并接收由http server響應的數據。 瀏覽器就是解釋html語言等內容的。
http協議構成:
request 有client(瀏覽器)發送
起始行 first line:
? ? <method> <url> <version>
????as:?GET?/ex?i=mm_28347190_2425761_9313994?HTTP/1.1首部 Header:
????filed:value
? ? ?as:?
主體 Body:
? ?數據向POST方法的json數據等
responsed(由http server發送):
起始行 first line:
? ? <version> <code> <reason phrase>
????as:?HTTP/1.1?200?OK首部 Header:
????filed:value
? ? ?as:?
主體 Body:
? ?響應的數據內容html文本或者圖片或者css js
注意:
1 client和server端是相對的概念的。不是說client一定是瀏覽器 如elinks curl splider ...程序
2 C/S 和 B/S架構的區別。主要是理解B/S架構B是指Broswer瀏覽器,是指將獨立應用程序的實現放在瀏覽器中。比如瀏覽器中的office不用獨立的office軟件就可以打開word excel文檔。
3 其中一個提高網頁瀏覽速度的技術是緩存技術。比如一些網頁游戲,在開始前都會加載一會就是將一些元素載入到瀏覽器中緩存起來。加快速度。
【緩存技術】
注意:
1 cache 中的private cache和public cache是相對的。對應存入自己電腦中的cache是只對user1可以使用的,user2 是不能使用的。所以這個緩存就是private私有緩存。 ?正向代理的緩存對于user1 和user2 都是可以使用的,就能同時加快user1 和user2 的速度,這個就是public cache。
2 緩存最終不是最權威的資源,會所有失效的必要性。所有要重點探索和設定的緩存時間。
【http 1.0緩存機制】
C ---> S
第一次 ?client向serve發起一個request,server 向client respond回應內容的頭部中加入一個Expire(1.0版本中唯一一個控制緩存的頭部和策略)過期時間。?
第二次 client想server發起請求的時候,第一種情況:如果內容在過期時間之內,就會使用本地的緩存。第二種情況:如果超過了過期時間,重新發起請求,并從Server端獲取數據(不管數據是否有更新)
缺點: 在第二的第二種情況在,client想server端發起的請求時,如果server中的數據沒有更新也被完整的響應一份數據到client端。這樣就浪費了帶寬資源。和服務器的響應資源。
所以引入了http1.1 版本,有一個詢問的機制條件式判斷,請求的時候可以發送一個頭部為If-Modify-Since到Server端。自動那個時候,內容是否有更新呢? 如果沒更新就返回304的響應碼,Not-Modify。
【http 1.1緩存機制】
豐富的頭部信息控制緩存策略
1、緩存相關的HTTP首部
HTTP協議提供了多個首部用以實現頁面緩存及緩存失效的相關功能,這其中最常用的有:
(1)Expires:用于指定某web對象的過期日期/時間,通常為GMT格式;一般不應該將此設定的未來過長的時間,一年的長度對大多場景來說足矣;其常用于為純靜態內容如JavaScripts樣式表或圖片指定緩存周期;
(2)Cache-Control:用于定義所有的緩存機制都必須遵循的緩存指示,這些指示是一些特定的指令,包括public、private、no-cache(表示可以存儲,但在重新驗正其有效性之前不能用于響應客戶端請求)、no-store、max-age、s-maxage以及must-revalidate等;Cache-Control中設定的時間會覆蓋Expires中指定的時間;
????public: 定義為共有的緩存
????private: 私有的緩存
????no-cache: 存儲但必須校驗
????no-store:不存儲
????max-age:緩存最大時長
????s-maxage:只能用于公共緩存或者共享式緩存 中指定最大緩存時長
????must-revalidate:必須重新校驗
????
????
(3)Etag:響應首部,用于在響應報文中為某web資源定義版本標識符;(解決 時間戳對比 秒級別的粗糙,無法判斷文件是否更新,用于驗證秒一下級別的更新)
條件時請求判斷機制:
(4)Last-Mofified:響應首部,用于回應客戶端關于Last-Modified-Since或If-None-Match首部的請求,以通知客戶端其請求的web對象最近的修改時間;
(5)If-Modified-Since:條件式請求首部,如果在此首部指定的時間后其請求的web內容發生了更改,則服務器響應更改后的內容,否則,則響應304(not modified);
(6)If-None-Match:條件式請求首部;web服務器為某web內容定義了Etag首部,客戶端請求時能獲取并保存這個首部的值(即標簽);而后在后續的請求中會通過If-None-Match首部附加其認可的標簽列表并讓服務器端檢驗其原始內容是否有可以與此列表中的某標簽匹配的標簽;如果有,則響應304,否則,則返回原始內容;
(7)Vary:響應首部,原始服務器根據請求來源的不同響應的可能會有所不同的首部,最常用的是Vary: Accept-Encoding,用于通知緩存機制其內容看起來可能不同于用戶請求時Accept-Encoding-header首部標識的編碼格式;
(8)Age:緩存服務器可以發送的一個額外的響應首部,用于指定響應的有效期限;瀏覽器通常根據此首部決定內容的緩存時長;如果響應報文首部還使用了max-age指令,那么緩存的有效時長為“max-age減去Age”的結果;
?Age(響應標頭,HTTP1.1)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
Age標頭,對于原始服務器來說,用于指明,當前資源被生成了多久,即存活期.而對于一個緩存代理服務器來說,它表示緩存副本,被緩存了多久.緩存代理服務器,必須生成Age頭.其值以秒為單位.且可能為負值.
壽命:即響應的壽命,指從原始服務器發出實體后所經歷的時間,或者是重新驗證,證明某緩存仍處于最新狀態(可信賴)之后,所經歷的時間. 參考響應頭中的 Age,其單位是秒.
【實踐-分析-理解】
谷歌瀏覽器 f5(ctrl +r) 和 ctrl+f5的區別
f5是刷新,但是不徹底: 會在請求的是后加上?
If-Modified-Since: ?和 max-age:0 ?
請求的時候問 server你是否有更新,有如server 查看更新時間一樣,就返回304 表示沒有更新。
ctrl+f5是強制更新,刷新頁面,server返回的一定是200(資源存在的前提)。 會在http的請求頭加上
Cache-Control: no-cache
概念解釋如下:
Cache-Control ?no-cache — 強制每次請求直接發送給源服務器,而不經過本地緩存版本的校驗。這對于需要確認認證應用很有用(可以和public結合使用),或者嚴格要求使用最新數據 的應用(不惜犧牲使用緩存的所有好處)?
Pragma 當"no-cache"出現在請求消息中時,應用程序應當向原始服務器推送此請求,即使它已?
經在上次請求時已經緩存了一份拷貝。這樣將保證客戶端能接收到最權威的回應。它也用來?
在客戶端發現其緩存中拷貝不可用或過期時,對拷貝進行強制刷新。?
cache-control?
max-age>0 時 直接從游覽器緩存中 提取?
max-age<=0 時 向server 發送http 請求確認 ,該資源是否有修改?
有的話 返回200 ,無的話 返回304.?
?
轉載于:https://blog.51cto.com/cuidehua/1867220
總結
以上是生活随笔為你收集整理的http缓存机制和原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos ruby通过rvm更新版本
- 下一篇: 【java】 linux下利用nohup