HTTP是一個客戶端和伺服器端請求和應答的標準(TCP)。HTTP協議(HyperText Transfer Protocol,超文字傳輸協議)用於從www伺服器傳輸超文字到本地瀏覽器的傳輸協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文字文件,還確定傳輸文件中的哪一部分,以及哪部分內容首先顯示(如文字先於圖形)等。
一、協議基礎
HTTP協議採用了請求/響應模型,即客戶端向伺服器傳送一個請求,請求頭包括請求的方法、URL、協議版本、以及包含請求修飾符、客戶資訊和內容的類似MIME的訊息結構;伺服器以一個狀態行作為響應,響應的內容包括訊息協議的版本、成功或者錯誤編碼加上包含伺服器資訊、實體源資訊以及可能的實體內容。HTTP的頭資訊包括通用頭、請求頭、響應頭和實體頭四部分,每個頭域由一個域名、冒號(:)和域值三部分組成。
1、通用頭域
通用頭域包含請求和響應訊息都支援的頭域,是作為一個整體而不是特定資源與事務相關聯,包括Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。
Cache-Control頭域
Cache-Control指定請求和響應遵循的快取機制。在請求訊息或響應訊息中設定Cache-Control並不會修改另一個訊息處理過程中快取處理過程,也就是每條訊息都是相互獨立的,都有自己的快取機制。下面列舉一些相關的快取指令(詳細參考),指令不區分大小寫,並且具有可選引數,預設private。
快取請求指令
客戶端可以在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
表明響應可以被任何物件快取(包括:傳送請求的客戶端,代理伺服器等)。
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頭域
Date頭域表示訊息傳送的時間,時間的描述格式由rfc822定義。Date描述的時間表示世界標準時間,換算成本地時間需要知道使用者所在的時區。
Pragma頭域
Pragma頭域用來包含實現特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache-Control:no-cache相同。
2、請求頭域
允許客戶端傳遞關於自身的資訊和希望響應形式。
Host頭域
Host頭域指定請求資源的Internet主機和埠號,必須表示請求url的原始伺服器或閘道器的位置。HTTP/1.1請求必須包含主機頭域,否則系統會以400狀態碼返回。
Referer頭域
Referer頭域允許客戶端指定請求uri的源資源地址,這可以允許伺服器生成回退連結串列,可用來登陸、優化cache等。他允許廢除的或錯誤的連線由於維護的目的被追蹤。如果請求的uri沒有自己的uri地址,Referer不能被髮送。如果指定的是部分uri地址,則此地址應該是一個相對地址。
Range頭域
Range頭域可以請求實體的一個或者多個子範圍。但是伺服器可以忽略次請求頭,如果無條件GET包含Range請求頭,響應會以狀態碼206(PartialContent)返回而不是200(OK)。
User-Agent頭域
User-Agent頭域的內容包含傳送請求的使用者資訊。
3、響應頭域
響應頭域允許伺服器傳遞不能放在狀態行的附加資訊,這些域主要描述伺服器的資訊和Request-URI進一步的資訊。響應頭域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。對響應頭域的擴充套件要求通訊雙方都支援,如果存在不支援的響應頭域,一般將會作為實體頭域處理。狀態碼(StatusCode)主要用於機器自動識別,第一個數字定義響應的類別,後兩個數字沒有分類的作用。第一個數字可能取5個不同的值:
- 1xx:資訊響應類,表示接收到請求並且繼續處理
- 2xx:處理成功響應類,表示動作被成功接收、理解和接受
- 3xx:重定向響應類,為了完成指定的動作,必須接受進一步處理
- 4xx:客戶端錯誤,客戶端請求包含語法錯誤或者是不能正確執行
- 5xx:服務端錯誤,伺服器不能正確執行一個正確的請求
Location響應頭
Location響應頭用於重定向接收者到一個新URI地址。
Server響應頭
Server響應頭包含處理請求的原始伺服器的軟體資訊。
4、實體頭域
定義被傳送資源的資訊,即可用於請求,也可用於響應。請求訊息和響應訊息都可以包含實體資訊,實體資訊一般由實體頭域和實體組成。實體頭域包含關於實體的原資訊,實體頭包括Allow、Content-Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、Etag、Expires、Last-Modified、extension-header。extension-header允許客戶端定義新的實體頭,但是這些域可能無法未接受方識別。實體可以是一個經過編碼的位元組流,它的編碼方式由Content-Encoding或Content-Type定義,它的長度由Content-Length或Content-Range定義。
Content-Type實體頭
用於向接收方指示實體的介質型別,指定HEAD方法送到接收方的實體介質型別,或GET方法傳送的請求介質型別Content-Range實體頭
Content-Range實體頭
用於指定整個實體中的一部分的插入位置,他也指示了整個實體的長度。在伺服器向客戶返回一個部分響應,它必須描述響應覆蓋的範圍和整個實體長度。一般格式:
Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth
複製程式碼
例如,傳送頭500個位元組次欄位的形式:Content-Range:bytes0-499/1234如果一個http訊息包含此節(例如,對範圍請求的響應或對一系列範圍的重疊請求),Content-Range表示傳送的範圍,Content-Length表示實際傳送的位元組數。
Last-modified實體頭
指定伺服器上儲存內容的最後修訂時間。
二、工作流程
一次HTTP操作稱為一個事務,其工作過程可分為四步:
- 域名解析
將網站名稱轉變為IP地址
- 發起TCP的3次握手協議
在客戶端和伺服器之間建立正常的TCP網路連線時:
(1)客戶端首先發出一個SYN訊息,
(2)伺服器使用SYN+ACK應答表示接收到了這個訊息,
(3)客戶端再以ACK訊息響應,
這樣在客戶端和伺服器之間才能建立起可靠的TCP連線
- 建立TCP連線後發起http請求
所謂的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請求,瀏覽器得到html程式碼
當伺服器收到HTTP請求後,會根據請求的資訊做某些處理(這些處理可能僅僅是靜態的返回頁,或是包含Asp.net,PHP,JSP等語言進行處理後的返回),相應的返回一個HTTP響應。HTTP響應在結構上類似HTTP請求,也是由三部分組成,分別為:
1、狀態行例如:HTTP/1.1 200 OK 第一部分是HTTP版本 第二部分是響應狀態碼 第三部分是狀態碼的描述 複製程式碼
2、HTTP頭
HTTP響應中包含的頭包括: 1. 響應頭(response header) 2. 普通頭(general header) 3. 實體頭(entity header)。 複製程式碼
3、返回內容
HTTP響應內容就是HTTP請求所請求的資訊。 這個資訊可以是一個HTML,也可以是一個圖片。 響應的資料格式通過Content-Type欄位來獲得: Content-Type: image/png; 或者我們熟悉的Content-Type: text/html 複製程式碼
- 瀏覽器解析html程式碼,並請求html程式碼中的資源
- 瀏覽器對頁面進行渲染並呈現給使用者