HTTP是一個客戶端和服務器端請求和應答的標準(TCP)。HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)用於從www服務器傳輸超文本到本地瀏覽器的傳輸協議。它可使瀏覽器更加高效,使網絡傳輸減小。它不只保證計算機正確快速地傳輸超文本文檔,還肯定傳輸文檔中的哪一部分,以及哪部份內容首先顯示(如文本先於圖形)等。html
HTTP協議採用了請求/響應模型,即客戶端向服務器發送一個請求,請求頭包括請求的方法、URL、協議版本、以及包含請求修飾符、客戶信息和內容的相似MIME的消息結構;服務器以一個狀態行做爲響應,響應的內容包括消息協議的版本、成功或者錯誤編碼加上包含服務器信息、實體源信息以及可能的實體內容。HTTP的頭信息包括通用頭、請求頭、響應頭和實體頭四部分,每一個頭域由一個域名、冒號(:)和域值三部分組成。瀏覽器
通用頭域包含請求和響應消息都支持的頭域,是做爲一個總體而不是特定資源與事務相關聯,包括Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。緩存
Cache-Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置Cache-Control並不會修改另外一個消息處理過程當中緩存處理過程,也就是每條消息都是相互獨立的,都有本身的緩存機制。下面列舉一些相關的緩存指令(詳細參考),指令不區分大小寫,而且具備可選參數,默認private。bash
客戶端能夠在HTTP請求中使用標準Cache-Control指令:服務器
Cache-Control: max-age=<seconds>
Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached網絡
服務器能夠在響應中使用的標準Cache-Control指令優化
Cache-control: must-revalidate
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-control: s-maxage=<seconds>網站
public
編碼
代表響應能夠被任何對象緩存(包括:發送請求的客戶端,代理服務器等)。url
private
代表響應只能被單個用戶緩存,不能做爲共享緩存(即代理服務器不能緩存它)。
no-cache
代表強制全部緩存了該響應的緩存用戶,在使用已存儲的緩存數據前,發送帶驗證器的請求到原始服務器
only-if-cached
代表若是緩存存在,只使用緩存,不管原始服務器數據是否有更新。
max-age=<seconds>
設置緩存存在的最大週期,超過這個時間的緩存被認爲過時。與Expires相反,時間是相對於請求的時間。
s-maxsage=<seconds>
覆蓋max-age或者Expires頭,可是僅適用於共享緩存(好比各個代理),而且私有緩存中會忽略它。
max-stale[=<seconds>]
表示客戶端願意接收一個已通過期的資源。可選的設置一個時間,表示響應不能超過的過期時間。
min-fresh=<seconds>
表示客戶端但願在指定時間內獲取最新的響應。
must-revalidate
緩存必須在使用以前驗證舊資源的狀態,而且不可以使用過時資源。
proxy-revalidate
與must-revalidate做用相同,可是僅適用於共享緩存(例如代理),並被私有緩存忽略。
immutable
表示響應正文不會隨時間而改變。資源(若是未過時)在服務器上不發生改變,所以客戶端不該發送從新驗證請求頭(例如If-None-Match或If-Modified-Since)來檢查更新,即便用戶顯示地刷新頁面。
no-store
用於防止重要的信息不被無心的發佈。在請求消息中發送將使得請求和響應消息都不使用緩存。
no-transform
不得對資源進行轉換或轉變。Content-Encoding、Content-Range、Content-Type等HTTP頭不能由代理修改。例如,非透明代理能夠對圖像格式進行轉換,以便節省緩存空間或者減小緩慢鏈路上的流量。no-transform指令不容許這樣作。
Cache-directive | 打開新的瀏覽器窗口 | 在原窗口單擊Enter按鈕 | 刷新 | 單擊Back按鈕 |
---|---|---|---|---|
pubic | 瀏覽器呈現來自緩存的頁面 | 瀏覽器呈現來自緩存的頁面 | 瀏覽器從新發送請求到服務器 | 瀏覽器呈現來自緩存的頁面 |
private | 瀏覽器從新發送請求到服務器 | 第一次,瀏覽器從新發送請求到服務器;此後,瀏覽器呈現來自緩存的頁面 | 瀏覽器從新發送請求到服務器 | 瀏覽器呈現來自緩存的頁面 |
no-cache/no-store | 瀏覽器從新發送請求到服務器 | 瀏覽器從新發送請求到服務器 | 瀏覽器從新發送請求到服務器 | 瀏覽器從新發送請求到服務器 |
must-revalidate/proxy-revalidate | 瀏覽器從新發送請求到服務器 | 第一次,瀏覽器從新發送請求到服務器;此後,瀏覽器呈現來自緩存的頁面 | 瀏覽器從新發送請求到服務器 | 瀏覽器呈現來自緩存的頁面 |
max-age=xxx | 在xxx秒後,瀏覽器從新發送請求到服務器 | 在xxx秒後,瀏覽器從新發送請求到服務器 | 瀏覽器從新發送請求到服務器 | 在xxx秒後,瀏覽器從新發送請求到服務器 |
結論:
操做 | 表現 |
---|---|
打開新窗口 | 若是指定cache-control的值爲private、no-cache、must-revalidate,那麼打開新窗口訪問時都會從新訪問服務器。而若是指定了max-age值,那麼在此值內的時間裏就不會從新訪問服務器,例如:Cache-control: max-age=5 表示當訪問此網頁後的5秒內不會去再次訪問服務器. |
在地址欄回車 | 若是值爲private或must-revalidate,則只有第一次訪問時會訪問服務器,之後就再也不訪問。若是值爲no-cache,那麼每次都會訪問。若是值爲max-age,則在過時以前不會重複訪問。 |
按後退按鈕 | 若是值爲private、must-revalidate、max-age,則不會重訪問,而若是爲no-cache,則每次都重複訪問. |
按刷新按鈕 | 不管爲什麼值都會從新訪問 |
Date頭域表示消息發送的時間,時間的描述格式由rfc822定義。Date描述的時間表示世界標準時間,換算成本地時間須要知道用戶所在的時區。
Pragma頭域用來包含實現特定的指令,最經常使用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache-Control:no-cache相同。
容許客戶端傳遞關於自身的信息和但願響應形式。
Host頭域指定請求資源的Internet主機和端口號,必須表示請求url的原始服務器或網關的位置。HTTP/1.1請求必須包含主機頭域,不然系統會以400狀態碼返回。
Referer頭域容許客戶端指定請求uri的源資源地址,這能夠容許服務器生成回退鏈表,可用來登錄、優化cache等。他容許廢除的或錯誤的鏈接因爲維護的目的被追蹤。若是請求的uri沒有本身的uri地址,Referer不能被髮送。若是指定的是部分uri地址,則此地址應該是一個相對地址。
Range頭域能夠請求實體的一個或者多個子範圍。可是服務器能夠忽略次請求頭,若是無條件GET包含Range請求頭,響應會以狀態碼206(PartialContent)返回而不是200(OK)。
User-Agent頭域的內容包含發送請求的用戶信息。
響應頭域容許服務器傳遞不能放在狀態行的附加信息,這些域主要描述服務器的信息和Request-URI進一步的信息。響應頭域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。對響應頭域的擴展要求通信雙方都支持,若是存在不支持的響應頭域,通常將會做爲實體頭域處理。狀態碼(StatusCode)主要用於機器自動識別,第一個數字定義響應的類別,後兩個數字沒有分類的做用。第一個數字可能取5個不一樣的值:
Location響應頭用於重定向接收者到一個新URI地址。
Server響應頭包含處理請求的原始服務器的軟件信息。
定義被傳送資源的信息,便可用於請求,也可用於響應。請求消息和響應消息均可以包含實體信息,實體信息通常由實體頭域和實體組成。實體頭域包含關於實體的原信息,實體頭包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD五、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。extension-header容許客戶端定義新的實體頭,可是這些域可能沒法未接受方識別。實體能夠是一個通過編碼的字節流,它的編碼方式由Content-Encoding或Content-Type定義,它的長度由Content-Length或Content-Range定義。
用於向接收方指示實體的介質類型,指定HEAD方法送到接收方的實體介質類型,或GET方法發送的請求介質類型Content-Range實體頭
用於指定整個實體中的一部分的插入位置,他也指示了整個實體的長度。在服務器向客戶返回一個部分響應,它必須描述響應覆蓋的範圍和整個實體長度。通常格式:
Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth
複製代碼
例如,傳送頭500個字節次字段的形式:Content-Range:bytes0-499/1234若是一個http消息包含此節(例如,對範圍請求的響應或對一系列範圍的重疊請求),Content-Range表示傳送的範圍,Content-Length表示實際傳送的字節數。
指定服務器上保存內容的最後修訂時間。
一次HTTP操做稱爲一個事務,其工做過程可分爲四步:
將網站名稱轉變爲IP地址
在客戶端和服務器之間創建正常的TCP網絡鏈接時:
(1)客戶端首先發出一個SYN消息,
(2)服務器使用SYN+ACK應答表示接收到了這個消息,
(3)客戶端再以ACK消息響應,
這樣在客戶端和服務器之間才能創建起可靠的TCP鏈接
所謂的http請求,也就是客戶端想服務器發送信息,這個信息由以下三部分組成:
(1)請求行例如:GET www.cnblogs.com HTTP/1.1 請求行寫法是固定的,由三部分組成, 第一部分是請求方法: 除了常見的只有Get和Post方法,實際上HTTP請求方法還有不少,好比: PUT方法,DELETE方法,HEAD方法,CONNECT方法,TRACE方法 第二部分是請求網址, 第三部分是HTTP版本。 複製代碼
(2)請求頭
HTTP頭在HTTP請求能夠是3種HTTP頭: 1. 請求頭(request header) 2. 普通頭(general header) 3. 實體頭(entity header) 一般來講,因爲Get請求每每不包含內容實體,所以也不會有實體頭。 複製代碼
(3)內容
只在POST請求中存在,由於GET請求並不包含任何實體 複製代碼
當服務器收到HTTP請求後,會根據請求的信息作某些處理(這些處理可能僅僅是靜態的返回頁,或是包含Asp.net,PHP,JSP等語言進行處理後的返回),相應的返回一個HTTP響應。HTTP響應在結構上相似HTTP請求,也是由三部分組成,分別爲:
一、狀態行例如:HTTP/1.1 200 OK 第一部分是HTTP版本 第二部分是響應狀態碼 第三部分是狀態碼的描述 複製代碼
二、HTTP頭
HTTP響應中包含的頭包括: 1. 響應頭(response header) 2. 普通頭(general header) 3. 實體頭(entity header)。 複製代碼
三、返回內容
HTTP響應內容就是HTTP請求所請求的信息。 這個信息能夠是一個HTML,也能夠是一個圖片。 響應的數據格式經過Content-Type字段來得到: Content-Type: image/png; 或者咱們熟悉的Content-Type: text/html 複製代碼