天天看點

http緩存機制和原理詳解

【背景】

http1.1

<a href="http://s1.51cto.com/wyfs02/M02/89/7B/wKiom1gUpleCwoS3AABEfy6yhXE725.png" target="_blank"></a>

http1.1 是1997年開始使用的。

http是一種協定,用于傳輸浏覽器發送的資料并接收由http server響應的資料。 浏覽器就是解釋html語言等内容的。

http協定構成:

request 有client(浏覽器)發送

起始行 first line:

    &lt;method&gt; &lt;url&gt; &lt;version&gt;

<code>    </code><code>as: </code>

<code>    </code><code>GET /ex?i=mm_28347190_2425761_9313994 HTTP/1.1</code>

首部 Header:

    filed:value

     as: 

<code>    </code><code>Host:www.baidu.com</code>

<code>    </code><code>Accept-Encoding:gzip, defalt</code>

<code>    </code><code>Referer: www.taobao.com/xxx </code>

<code>    </code><code>User-Aagent: IE8...</code>

<code>    </code><code>Cookie:xxxx</code>

<code>    </code><code>.......</code>

主體 Body:

   資料向POST方法的json資料等

responsed(由http server發送):

    &lt;version&gt; &lt;code&gt; &lt;reason phrase&gt;

<code>    </code><code>HTTP/1.1 200 OK</code>

<code>    </code><code>Expires: Sat, 29 Oct 2016 13:59:01 GMT</code>

<code>    </code><code>Data:  Sat, 29 Oct 2016 13:44:01 GMT</code>

<code>    </code><code>Server: nginx</code>

<code>    </code><code>Content-Type: text/html; charset=utf-8 </code>

<code>    </code><code>Cache-Control:  max-age=900</code>

<code>    </code><code>Content-Encoding: gzip</code>

<code>    </code><code>Age: 541</code>

<code>    </code><code>X-Via: 1.1 xzai69:8 (Cdn Cache Server V2.0), 1.1 sdta234:0 (Cdn Cache Server V2</code>

<code>    </code><code>Connection: keep-alive</code>

   響應的資料内容html文本或者圖檔或者css js

注意:

1 client和server端是相對的概念的。不是說client一定是浏覽器 如elinks curl splider ...程式

2 C/S 和 B/S架構的差別。主要是了解B/S架構B是指Broswer浏覽器,是指将獨立應用程式的實作放在浏覽器中。比如浏覽器中的office不用獨立的office軟體就可以打開word excel文檔。

3 其中一個提高網頁浏覽速度的技術是緩存技術。比如一些網頁遊戲,在開始前都會加載一會就是将一些元素載入到浏覽器中緩存起來。加快速度。

【緩存技術】

<a href="http://s4.51cto.com/wyfs02/M00/89/7B/wKiom1gUrAThtY4pAACjLzHcs_g617.png" target="_blank"></a>

注意:

1 cache 中的private cache和public cache是相對的。對應存入自己電腦中的cache是隻對user1可以使用的,user2 是不能使用的。是以這個緩存就是private私有緩存。  正向代理的緩存對于user1 和user2 都是可以使用的,就能同時加快user1 和user2 的速度,這個就是public cache。

2 緩存最終不是最權威的資源,會所有失效的必要性。所有要重點探索和設定的緩存時間。

【http 1.0緩存機制】

C ---&gt; 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&gt;0 時 直接從遊覽器緩存中 提取 

max-age&lt;=0 時 向server 發送http 請求确認 ,該資源是否有修改 

有的話 傳回200 ,無的話 傳回304. 

本文轉自殘劍部落格51CTO部落格,原文連結http://blog.51cto.com/cuidehua/1867220如需轉載請自行聯系原作者

cuizhiliang