我知道到的HTTP

書生今天不吃飯發表於2018-03-29

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操作稱為一個事務,其工作過程可分為四步:

  1. 域名解析

將網站名稱轉變為IP地址

  1. 發起TCP的3次握手協議

在客戶端和伺服器之間建立正常的TCP網路連線時:
(1)客戶端首先發出一個SYN訊息,
(2)伺服器使用SYN+ACK應答表示接收到了這個訊息,
(3)客戶端再以ACK訊息響應,
這樣在客戶端和伺服器之間才能建立起可靠的TCP連線

  1. 建立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請求並不包含任何實體
複製程式碼
  1. 伺服器響應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
複製程式碼
  1. 瀏覽器解析html程式碼,並請求html程式碼中的資源
  2. 瀏覽器對頁面進行渲染並呈現給使用者

相關文章