做者:滌生_Woo
連接:http://www.jianshu.com/p/6e9e4156ece3
來源:簡書
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
本篇文章篇幅比較長,先來個思惟導圖預覽一下。html
利用 TCP/IP 協議族進行網絡通訊時,會經過分層順序與對方進行通訊。發送端從應用層往下走,接收端則從鏈路層往上走。以下:算法
以下圖所示:瀏覽器
在網絡體系結構中,包含了衆多的網絡協議,這篇文章主要圍繞 HTTP 協議(HTTP/1.1版本)展開。緩存
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議。它可使瀏覽器更加高效,使網絡傳輸減小。它不只保證計算機正確快速地傳輸超文本文檔,還肯定傳輸文檔中的哪一部分,以及哪部份內容首先顯示(如文本先於圖形)等。
HTTP是客戶端瀏覽器或其餘程序與Web服務器之間的應用層通訊協議。在Internet上的Web服務器上存放的都是超文本信息,客戶機須要經過HTTP協議傳輸所要訪問的超文本信息。HTTP包含命令和傳輸信息,不只可用於Web訪問,也能夠用於其餘因特網/內聯網應用系統之間的通訊,從而實現各種應用資源超媒體訪問的集成。
咱們在瀏覽器的地址欄裏輸入的網站地址叫作URL (Uniform Resource Locator,統一資源定位符)。就像每家每戶都有一個門牌地址同樣,每一個網頁也都有一個Internet地址。當你在瀏覽器的地址框中輸入一個URL或是單擊一個超級連接時,URL就肯定了要瀏覽的地址。瀏覽器經過超文本傳輸協議(HTTP),將Web服務器上站點的網頁代碼提取出來,並翻譯成漂亮的網頁。安全
HTTP通訊機制是在一次完整的 HTTP 通訊過程當中,客戶端與服務器之間將完成下列7個步驟:性能優化
GET/sample/hello.jsp HTTP/1.1
HTTP/1.1 200 OK
Connection:keep-alive
,TCP 鏈接在發送後將仍然保持打開狀態,因而,客戶端能夠繼續經過相同的鏈接發送請求。保持鏈接節省了爲每一個請求創建新鏈接所需的時間,還節約了網絡帶寬。應用 HTTP 協議時,一定是一端擔任客戶端角色,另外一端擔任服務器端角色。僅從一條通訊線路來講,服務器端和客服端的角色是肯定的。HTTP 協議規定,請求從客戶端發出,最後服務器端響應該請求並返回。換句話說,確定是先從客戶端開始創建通訊的,服務器端在沒有接收到請求以前不會發送響應。服務器
HTTP 是一種無狀態協議。協議自身不對請求和響應之間的通訊狀態進行保存。也就是說在 HTTP 這個級別,協議對於發送過的請求或響應都不作持久化處理。這是爲了更快地處理大量事務,確保協議的可伸縮性,而特地把 HTTP 協議設計成如此簡單的。
但是隨着 Web 的不斷髮展,咱們的不少業務都須要對通訊狀態進行保存。因而咱們引入了 Cookie 技術。有了 Cookie 再用 HTTP 協議通訊,就能夠管理狀態了。cookie
Cookie 技術經過在請求和響應報文中寫入 Cookie 信息來控制客戶端的狀態。Cookie 會根據從服務器端發送的響應報文內的一個叫作 Set-Cookie 的首部字段信息,通知客戶端保存Cookie。當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入 Cookie 值後發送出去。服務器端發現客戶端發送過來的 Cookie 後,會去檢查到底是從哪個客戶端發來的鏈接請求,而後對比服務器上的記錄,最後獲得以前的狀態信息。網絡
HTTP 協議使用 URI 定位互聯網上的資源。正是由於 URI 的特定功能,在互聯網上任意位置的資源都能訪問到。架構
HTTP 協議的初始版本中,每進行一個 HTTP 通訊都要斷開一次 TCP 鏈接。好比使用瀏覽器瀏覽一個包含多張圖片的 HTML 頁面時,在發送請求訪問 HTML 頁面資源的同時,也會請求該 HTML 頁面裏包含的其餘資源。所以,每次的請求都會形成無畏的 TCP 鏈接創建和斷開,增長通訊量的開銷。
爲了解決上述 TCP 鏈接的問題,HTTP/1.1 和部分 HTTP/1.0 想出了持久鏈接的方法。其特色是,只要任意一端沒有明確提出斷開鏈接,則保持 TCP 鏈接狀態。旨在創建一次 TCP 鏈接後進行屢次請求和響應的交互。在 HTTP/1.1 中,全部的鏈接默認都是持久鏈接。
持久鏈接使得多數請求以管線化方式發送成爲可能。之前發送請求後需等待並接收到響應,才能發送下一個請求。管線化技術出現後,不用等待亦可發送下一個請求。這樣就能作到同時並行發送多個請求,而不須要一個接一個地等待響應了。
好比,當請求一個包含多張圖片的 HTML 頁面時,與挨個鏈接相比,用持久鏈接可讓請求更快結束。而管線化技術要比持久鏈接速度更快。請求數越多,時間差就越明顯。
用於 HTTP 協議交互的信息被稱爲 HTTP 報文。請求端(客戶端)的 HTTP 報文叫作請求報文;響應端(服務器端)的叫作響應報文。HTTP 報文自己是由多行(用 CR+LF 做換行符)數據構成的字符串文本。
HTTP 報文大體可分爲報文首部和報文主體兩部分。二者由最初出現的空行(CR+LF)來劃分。一般,並不必定有報文主體。以下:
請求報文的首部內容由如下數據組成:
請求報文的示例,以下:
響應報文的首部內容由如下數據組成:
響應報文的示例,以下:
舉個栗子,下面是一個 HTTP 請求的報文:
GET /index.htm HTTP/1.1 Host: sample.com
其中,下面的這行就是請求行,
GET /index.htm HTTP/1.1
/index.htm
指明瞭請求訪問的資源對象,也叫作請求 URI;HTTP/1.1
,即 HTTP 的版本號,用來提示客戶端使用的 HTTP 協議功能。綜合來看,大意是請求訪問某臺 HTTP 服務器上的 /index.htm
頁面資源。
一樣舉個栗子,下面是一個 HTTP 響應的報文:
HTTP/1.1 200 OK Date: Mon, 10 Jul 2017 15:50:06 GMT Content-Length: 256 Content-Type: text/html <html> ...
其中,下面的這行就是狀態行,
HTTP/1.1 200 OK
HTTP/1.1
表示服務器對應的 HTTP 版本;200 OK
表示請求的處理結果的狀態碼和緣由短語。先來回顧一下首部字段在報文的位置,HTTP 報文包含報文首部和報文主體,報文首部包含請求行(或狀態行)和首部字段。
在報文衆多的字段當中,HTTP 首部字段包含的信息最爲豐富。首部字段同時存在於請求和響應報文內,並涵蓋 HTTP 報文相關的內容信息。使用首部字段是爲了給客服端和服務器端提供報文主體大小、所使用的語言、認證信息等內容。
首部字段名 | 冒號 | 字段值 |
---|---|---|
Content-Type | : | text/html |
Keep-Alive | : | timeout=30, max=120 |
首部字段根據實際用途被分爲如下4種類型:
類型 | 描述 |
---|---|
通用首部字段 | 請求報文和響應報文兩方都會使用的首部 |
請求首部字段 | 從客戶端向服務器端發送請求報文時使用的首部。補充了請求的附加內容、客戶端信息、響應內容相關優先級等信息 |
響應首部字段 | 從服務器端向客戶端返回響應報文時使用的首部。補充了響應的附加內容,也會要求客戶端附加額外的內容信息。 |
實體首部字段 | 針對請求報文和響應報文的實體部分使用的首部。補充了資源內容更新時間等與實體有關的的信息。 |
首部字段名 | 說明 |
---|---|
Cache-Control | 控制緩存的行爲 |
Connection | 逐挑首部、鏈接的管理 |
Date | 建立報文的日期時間 |
Pragma | 報文指令 |
Trailer | 報文末端的首部一覽 |
Transfer-Encoding | 指定報文主體的傳輸編碼方式 |
Upgrade | 升級爲其餘協議 |
Via | 代理服務器的相關信息 |
Warning | 錯誤通知 |
經過指定首部字段 Cache-Control 的指令,就能操做緩存的工做機制。
可用的指令按請求和響應分類以下:
緩存請求指令
指令 | 參數 | 說明 |
---|---|---|
no-cache | 無 | 強制向服務器再次驗證 |
no-store | 無 | 不緩存請求或響應的任何內容 |
max-age = [秒] | 必需 | 響應的最大Age值 |
max-stale( =[秒]) | 可省略 | 接收已過時的響應 |
min-fresh = [秒] | 必需 | 指望在指定時間內的響應仍有效 |
no-transform | 無 | 代理不可更改媒體類型 |
only-if-cached | 無 | 從緩存獲取資源 |
cache-extension | - | 新指令標記(token) |
緩存響應指令
指令 | 參數 | 說明 |
---|---|---|
public | 無 | 可向任意方提供響應的緩存 |
private | 可省略 | 僅向特定用戶返回響應 |
no-cache | 可省略 | 緩存前必須先確認其有效性 |
no-store | 無 | 不緩存請求或響應的任何內容 |
no-transform | 無 | 代理不可更改媒體類型 |
must-revalidate | 無 | 可緩存但必須再向源服務器進行確認 |
proxy-revalidate | 無 | 要求中間緩存服務器對緩存的響應有效性再進行確認 |
max-age = [秒] | 必需 | 響應的最大Age值 |
s-maxage = [秒] | 必需 | 公共緩存服務器響應的最大Age值 |
cache-extension | - | 新指令標記(token) |
public 指令
Cache-Control: public
當指定使用 public 指令時,則明確代表其餘用戶也可利用緩存。
private 指令
Cache-Control: private
當指定 private 指令後,響應只以特定的用戶做爲對象,這與 public 指令的行爲相反。緩存服務器會對該特定用戶提供資源緩存的服務,對於其餘用戶發送過來的請求,代理服務器則不會返回緩存。
no-cache 指令
Cache-Control: no-cache
Cache-Control: no-cache=Location
由服務器返回的響應中,若報文首部字段 Cache-Control 中對 no-cache 字段名具體指定參數值,那麼客戶端在接收到這個被指定參數值的首部字段對應的響應報文後,就不能使用緩存。換言之,無參數值的首部字段可使用緩存。只能在響應指令中指定該參數。
no-store 指令
Cache-Control: no-store
當使用 no-store 指令時,暗示請求(和對應的響應)或響應中包含機密信息。所以,該指令規定緩存不能在本地存儲請求或響應的任一部分。
注意:no-cache 指令表明不緩存過時的指令,緩存會向源服務器進行有效期確認後處理資源;no-store 指令纔是真正的不進行緩存。
s-maxage 指令
Cache-Control: s-maxage=604800(單位:秒)
max-age 指令
Cache-Control: max-age=604800(單位:秒)
min-fresh 指令
Cache-Control: min-fresh=60(單位:秒)
min-fresh 指令要求緩存服務器返回至少還未過指定時間的緩存資源。
max-stale 指令
Cache-Control: max-stale=3600(單位:秒)
only-if-cached 指令
Cache-Control: only-if-cached
表示客戶端僅在緩存服務器本地緩存目標資源的狀況下才會要求其返回。換言之,該指令要求緩存服務器不從新加載響應,也不會再次確認資源的有效性。
must-revalidate 指令
Cache-Control: must-revalidate
使用 must-revalidate 指令,代理會向源服務器再次驗證即將返回的響應緩存目前是否仍有效。另外,使用 must-revalidate 指令會忽略請求的 max-stale 指令。
proxy-revalidate 指令
Cache-Control: proxy-revalidate
proxy-revalidate 指令要求全部的緩存服務器在接收到客戶端帶有該指令的請求返回響應以前,必須再次驗證緩存的有效性。
no-transform 指令
Cache-Control: no-transform
使用 no-transform 指令規定不管是在請求仍是響應中,緩存都不能改變實體主體的媒體類型。這樣作可防止緩存或代理壓縮圖片等相似操做。
Cache-Control: private, community="UCI"
經過 cache-extension 標記(token),能夠擴展 Cache-Control 首部字段內的指令。上述 community 指令即擴展的指令,若是緩存服務器不能理解這個新指令,就會直接忽略掉。
Connection 首部字段具有如下兩個做用:
控制再也不轉發的首部字段
Connection: Upgrade
在客戶端發送請求和服務器返回響應中,使用 Connection 首部字段,可控制再也不轉發給代理的首部字段,即刪除後再轉發(即Hop-by-hop首部)。
管理持久鏈接
Connection: close
HTTP/1.1 版本的默認鏈接都是持久鏈接。當服務器端想明確斷開鏈接時,則指定 Connection 首部字段的值爲 close。
Connection: Keep-Alive
HTTP/1.1 以前的 HTTP 版本的默認鏈接都是非持久鏈接。爲此,若是想在舊版本的 HTTP 協議上維持持續鏈接,則須要指定 Connection 首部字段的值爲 Keep-Alive。
代表建立 HTTP 報文的日期和時間。
Date: Mon, 10 Jul 2017 15:50:06 GMT
HTTP/1.1 協議使用在 RFC1123 中規定的日期時間的格式。
Pragma 首部字段是 HTTP/1.1 版本以前的歷史遺留字段,僅做爲與 HTTP/1.0 的向後兼容而定義。
Pragma: no-cache
Cache-Control: no-cache
指定緩存的處理方式最爲理想。可是要總體掌握全部中間服務器使用的 HTTP 協議版本倒是不現實的,因此,發送的請求會同時包含下面兩個首部字段:Cache-Control: no-cache Pragma: no-cache
Trailer: Expires
首部字段 Trailer 會事先說明在報文主體後記錄了哪些首部字段。可應用在 HTTP/1.1 版本分塊傳輸編碼時。
Transfer-Encoding: chunked
Upgrade: TSL/1.0
用於檢測 HTTP 協議及其餘協議是否可以使用更高的版本進行通訊,其參數值能夠用來指定一個徹底不一樣的通訊協議。
Via: 1.1 a1.sample.com(Squid/2.7)
該首部字段一般會告知用戶一些與緩存相關的問題的警告。
Warning 首部字段的格式以下:
Warning:[警告碼][警告的主機:端口號] "[警告內容]"([日期時間])
最後的日期時間可省略。
HTTP/1.1 中定義了7種警告,警告碼對應的警告內容僅推薦參考,另外,警告碼具有擴展性,從此有可能追加新的警告碼。
警告碼 | 警告內容 | 說明 |
---|---|---|
110 | Response is stale(響應已過時) | 代理返回已過時的資源 |
111 | Revalidation failed(再驗證失敗) | 代理再驗證資源有效性時失敗(服務器沒法到達等緣由) |
112 | Disconnection operation(斷開鏈接操做) | 代理與互聯網鏈接被故意切斷 |
113 | Heuristic expiration(試探性過時) | 響應的試用期超過24小時(有效緩存的設定時間大於24小時的狀況下) |
199 | Miscellaneous warning(雜項警告) | 任意的警告內容 |
214 | Transformation applied(使用了轉換) | 代理對內容編碼或媒體類型等執行了某些處理時 |
299 | Miscellaneous persistent warning(持久雜項警告) | 任意的警告內容 |
首部字段名 | 說明 |
---|---|
Accept | 用戶代理可處理的媒體類型 |
Accept-Charset | 優先的字符集 |
Accept-Encoding | 優先的內容編碼 |
Accept-Language | 優先的語言(天然語言) |
Authorization | Web認證信息 |
Expect | 期待服務器的特定行爲 |
From | 用戶的電子郵箱地址 |
Host | 請求資源所在服務器 |
If-Match | 比較實體標記(ETag) |
If-Modified-Since | 比較資源的更新時間 |
If-None-Match | 比較實體標記(與 If-Macth 相反) |
If-Range | 資源未更新時發送實體 Byte 的範圍請求 |
If-Unmodified-Since | 比較資源的更新時間(與 If-Modified-Since 相反) |
Max-Forwards | 最大傳輸逐跳數 |
Proxy-Authorization | 代理服務器要求客戶端的認證信息 |
Range | 實體的字節範圍請求 |
Referer | 對請求中 URI 的原始獲取方 |
TE | 傳輸編碼的優先級 |
User-Agent | HTTP 客戶端程序的信息 |
Accept: text/html, application/xhtml+xml, application/xml; q=0.5
q=[數值]
來表示權重值,用分號(;)進行分隔。權重值的範圍 0~1(可精確到小數點後三位),且 1 爲最大值。不指定權重值時,默認爲 1。Accept-Charset: iso-8859-5, unicode-1-1; q=0.8
Accept-Charset 首部字段可用來通知服務器用戶代理支持的字符集及字符集的相對優先順序。另外,可一次性指定多種字符集。一樣使用 q=[數值]
來表示相對優先級。
Accept-Encoding: gzip, deflate
Accept-Encoding 首部字段用來告知服務器用戶代理支持的內容編碼及內容編碼的優先順序,並可一次性指定多種內容編碼。一樣使用 q=[數值]
來表示相對優先級。也可以使用星號(*)做爲通配符,指定任意的編碼格式。
Accept-Lanuage: zh-cn,zh;q=0.7,en=us,en;q=0.3
告知服務器用戶代理可以處理的天然語言集(指中文或英文等),以及天然語言集的相對優先級,可一次性指定多種天然語言集。一樣使用 q=[數值]
來表示相對優先級。
Authorization: Basic ldfKDHKfkDdasSAEdasd==
告知服務器用戶代理的認證信息(證書值)。一般,想要經過服務器認證的用戶代理會在接收到返回的 401 狀態碼響應後,把首部字段 Authorization 加入請求中。共用緩存在接收到含有 Authorization 首部字段的請求時的操做處理會略有差別。
Expect: 100-continue
告知服務器客戶端指望出現的某種特定行爲。
From: Deeson_Woo@163.com
告知服務器使用用戶代理的電子郵件地址。
Host: www.jianshu.com
Host:
。形如 If-xxx 這種樣式的請求首部字段,均可稱爲條件請求。服務器接收到附帶條件的請求後,只有判斷指定條件爲真時,纔會執行請求。
If-Match: "123456"
412 Precondition Failed
的響應。If-Modified-Since: Mon, 10 Jul 2017 15:50:06 GMT
304 Not Modified
的響應。If-None-Match: "123456"
首部字段 If-None-Match 屬於附帶條件之一。它和首部字段 If-Match 做用相反。用於指定 If-None-Match 字段值的實體標記(ETag)值與請求資源的 ETag 不一致時,它就告知服務器處理該請求。
If-Range: "123456"
412 Precondition Failed
做爲響應返回,其目的是催促客戶端再次發送請求。這樣一來,與使用首部字段 If-Range 比起來,就須要花費兩倍的功夫。If-Unmodified-Since: Mon, 10 Jul 2017 15:50:06 GMT
首部字段 If-Unmodified-Since 和首部字段 If-Modified-Since 的做用相反。它的做用的是告知服務器,指定的請求資源只有在字段值內指定的日期時間以後,未發生更新的狀況下,才能處理請求。若是在指定日期時間後發生了更新,則以狀態碼 412 Precondition Failed
做爲響應返回。
Max-Forwards: 10
經過 TRACE 方法或 OPTIONS 方法,發送包含首部字段 Max-Forwards 的請求時,該字段以十進制整數形式指定可通過的服務器最大數目。服務器在往下一個服務器轉發請求以前,Max-Forwards 的值減 1 後從新賦值。當服務器接收到 Max-Forwards 值爲 0 的請求時,則再也不進行轉發,而是直接返回響應。
Proxy-Authorization: Basic dGlwOjkpNLAGfFY5
Range: bytes=5001-10000
206 Partial Content
的響應。沒法處理該範圍請求時,則會返回狀態碼 200 OK
的響應及所有資源。Referer: http://www.sample.com/index.html
首部字段 Referer 會告知服務器請求的原始資源的 URI。
TE: gzip, deflate; q=0.5
TE: trailers
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101
首部字段名 | 說明 |
---|---|
Accept-Ranges | 是否接受字節範圍請求 |
Age | 推算資源建立通過時間 |
ETag | 資源的匹配信息 |
Location | 令客戶端重定向至指定 URI |
Proxy-Authenticate | 代理服務器對客戶端的認證信息 |
Retry-After | 對再次發起請求的時機要求 |
Server | HTTP 服務器的安裝信息 |
Vary | 代理服務器緩存的管理信息 |
WWW-Authenticate | 服務器對客戶端的認證信息 |
Accept-Ranges: bytes
Age: 1200
ETag: "usagi-1234"
ETag: W/"usagi-1234"
。Location: http://www.sample.com/sample.html
Proxy-Authenticate: Basic realm="Usagidesign Auth"
Retry-After: 180
503 Service Unavailable
響應,或 3xx Redirect 響應一塊兒使用。Server: Apache/2.2.6 (Unix) PHP/5.2.5
首部字段 Server 告知客戶端當前服務器上安裝的 HTTP 服務器應用程序的信息。不僅僅會標出服務器上的軟件應用名稱,還有可能包括版本號和安裝時啓用的可選項。
Vary: Accept-Language
WWW-Authenticate: Basic realm="Usagidesign Auth"
首部字段 WWW-Authenticate 用於 HTTP 訪問認證。它會告知客戶端適用於訪問請求 URI 所指定資源的認證方案(Basic 或是 Digest)和帶參數提示的質詢(challenge)。
首部字段名 | 說明 |
---|---|
Allow | 資源可支持的 HTTP 方法 |
Content-Encoding | 實體主體適用的編碼方式 |
Content-Language | 實體主體的天然語言 |
Content-Length | 實體主體的大小(單位:字節) |
Content-Location | 替代對應資源的 URI |
Content-MD5 | 實體主體的報文摘要 |
Content-Range | 實體主體的位置範圍 |
Content-Type | 實體主體的媒體類型 |
Expires | 實體主體過時的日期時間 |
Last-Modified | 資源的最後修改日期時間 |
Allow: GET, HEAD
405 Method Not Allowed
做爲響應返回。與此同時,還會把全部能支持的 HTTP 方法寫入首部字段 Allow 後返回。Content-Encoding: gzip
Content-Language: zh-CN
首部字段 Content-Language 會告知客戶端,實體主體使用的天然語言(指中文或英文等語言)。
Content-Length: 15000
首部字段 Content-Length 代表了實體主體部分的大小(單位是字節)。對實體主體進行內容編碼傳輸時,不能再使用 Content-Length首部字段。
Content-Location: http://www.sample.com/index.html
首部字段 Content-Location 給出與報文主體部分相對應的 URI。和首部字段 Location 不一樣,Content-Location 表示的是報文主體返回資源對應的 URI。
Content-MD5: OGFkZDUwNGVhNGY3N2MxMDIwZmQ4NTBmY2IyTY==
首部字段 Content-MD5 是一串由 MD5 算法生成的值,其目的在於檢查報文主體在傳輸過程當中是否保持完整,以及確認傳輸到達。
Content-Range: bytes 5001-10000/10000
針對範圍請求,返回響應時使用的首部字段 Content-Range,能告知客戶端做爲響應返回的實體的哪一個部分符合範圍請求。字段值以字節爲單位,表示當前發送部分及整個實體大小。
Content-Type: text/html; charset=UTF-8
首部字段 Content-Type 說明了實體主體內對象的媒體類型。和首部字段 Accept 同樣,字段值用 type/subtype 形式賦值。參數 charset 使用 iso-8859-1 或 euc-jp 等字符集進行賦值。
Expires: Mon, 10 Jul 2017 15:50:06 GMT
Last-Modified: Mon, 10 Jul 2017 15:50:06 GMT
首部字段 Last-Modified 指明資源最終修改的時間。通常來講,這個值就是 Request-URI 指定資源被修改的時間。但相似使用 CGI 腳本進行動態數據處理時,該值有可能會變成數據最終修改時的時間。
首部字段名 | 說明 | 首部類型 |
---|---|---|
Set-Cookie | 開始狀態管理所使用的 Cookie 信息 | 響應首部字段 |
Cookie | 服務器接收到的 Cookie 信息 | 請求首部字段 |
Set-Cookie: status=enable; expires=Mon, 10 Jul 2017 15:50:06 GMT; path=/;
下面的表格列舉了 Set-Cookie 的字段值。
屬性 | 說明 |
---|---|
NAME=VALUE | 賦予 Cookie 的名稱和其值(必需項) |
expires=DATE | Cookie 的有效期(若不明確指定則默認爲瀏覽器關閉前爲止) |
path=PATH | 將服務器上的文件目錄做爲Cookie的適用對象(若不指定則默認爲文檔所在的文件目錄) |
domain=域名 | 做爲 Cookie 適用對象的域名 (若不指定則默認爲建立 Cookie的服務器的域名) |
Secure | 僅在 HTTPS 安全通訊時纔會發送 Cookie |
HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 腳本訪問 |
Cookie 的 path 屬性可用於限制指定 Cookie 的發送範圍的文件目錄。
Cookie 的 secure 屬性用於限制 Web 頁面僅在 HTTPS 安全鏈接時,才能夠發送 Cookie。
Cookie: status=enable
首部字段 Cookie 會告知服務器,當客戶端想得到 HTTP 狀態管理支持時,就會在請求中包含從服務器接收到的 Cookie。接收到多個 Cookie 時,一樣能夠以多個 Cookie 形式發送。
HTTP 首部字段是能夠自行擴展的。因此在 Web 服務器和瀏覽器的應用上,會出現各類非標準的首部字段。
如下是最爲經常使用的首部字段。
X-Frame-Options: DENY
首部字段 X-Frame-Options 屬於 HTTP 響應首部,用於控制網站內容在其餘 Web 網站的 Frame 標籤內的顯示問題。其主要目的是爲了防止點擊劫持(clickjacking)攻擊。首部字段 X-Frame-Options 有如下兩個可指定的字段值:
X-XSS-Protection: 1
首部字段 X-XSS-Protection 屬於 HTTP 響應首部,它是針對跨站腳本攻擊(XSS)的一種對策,用於控制瀏覽器 XSS 防禦機制的開關。首部字段 X-XSS-Protection 可指定的字段值以下:
DNT: 1
首部字段 DNT 屬於 HTTP 請求首部,其中 DNT 是 Do Not Track 的簡稱,意爲拒絕我的信息被收集,是表示拒絕被精準廣告追蹤的一種方法。首部字段 DNT 可指定的字段值以下:
因爲首部字段 DNT 的功能具有有效性,因此 Web 服務器須要對 DNT作對應的支持。
P3P: CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND
首部字段 P3P 屬於 HTTP 響應首部,經過利用 P3P(The Platform for Privacy Preferences,在線隱私偏好平臺)技術,可讓 Web 網站上的我的隱私變成一種僅供程序可理解的形式,以達到保護用戶隱私的目的。
要進行 P3P 的設定,需按如下操做步驟進行:
200 OK
,以 3 位數字和緣由短語組成。數字中的第一位指定了響應類別,後兩位無分類。200 OK
。類別 | 緣由短語 | |
---|---|---|
1xx | Informational(信息性狀態碼) | 接收的請求正在處理 |
2xx | Success(成功狀態碼) | 請求正常處理完畢 |
3xx | Redirection(重定向狀態碼) | 須要進行附加操做以完成請求 |
4xx | Client Error(客戶端錯誤狀態碼) | 服務器沒法處理請求 |
5xx | Server Error(服務器錯誤狀態碼) | 服務器處理請求出錯 |
咱們能夠自行改變 RFC2616 中定義的狀態碼或者服務器端自行建立狀態碼,只要遵照狀態碼的類別定義就能夠了。
HTTP 狀態碼種類繁多,數量達幾十種。其中最經常使用的有如下 14 種,一塊兒來看看。
表示從客戶端發來的請求在服務器端被正常處理了。
表示客戶端進行了範圍請求,而服務器成功執行了這部分的 GET 請求。響應報文中包含由 Content-Range 首部字段指定範圍的實體內容。
永久性重定向。表示請求的資源已被分配了新的 URI。之後應使用資源如今所指的 URI。也就是說,若是已經把資源對應的 URI 保存爲書籤了,這時應該按 Location 首部字段提示的 URI 從新保存。
301 Moved Permanently
狀態碼類似,但 302 Found
狀態碼錶明資源不是被永久移動,只是臨時性質的。換句話說,已移動的資源對應的 URI 未來還有可能發生改變。303 See Othe
r 和 302 Found
狀態碼有着相同的功能,但 303 See Other
狀態碼明確表示客戶端應採用 GET 方法獲取資源,這點與 302 Found
狀態碼有區別。304 Not Modified
狀態碼返回時,不包含任何響應的主體部分。304 Not Modified
雖然被劃分到 3xx 類別中,但和重定向沒有關係。臨時重定向。該狀態碼與 302 Found
有着相同的含義。
200 OK
同樣對待該狀態碼。401 Unauthorized
的響應必須包含一個適用於被請求資源的 WWW-Authenticate 首部用以質詢(challenge)用戶信息。代表對請求資源的訪問被服務器拒絕了。服務器端沒有必要給出詳細的拒絕理由,固然也能夠在響應報文的實體主體部分對緣由進行描述。
代表服務器上沒法找到請求的資源。除此以外,也能夠在服務器端拒絕請求且不想說明理由的時候使用。
代表服務器端在執行請求時發生了錯誤。也多是 Web 應用存在的 bug 或某些臨時的故障。
代表服務器暫時處於超負載或正在進行停機維護,如今沒法處理請求。若是事先得知解除以上情況須要的時間,最好寫入 Retry-After 首部字段再返回給客戶端。
你們請仔細看看上面示例中,各個組成部分對應的內容。
接着,咱們來看看報文和實體的概念。若是把 HTTP 報文想象成因特網貨運系統中的箱子,那麼 HTTP 實體就是報文中實際的貨物。
咱們能夠看到,上面示例右圖中深紅色框的內容就是報文的實體部分,而藍色框的兩部份內容分別就是實體首部和實體主體。而左圖中粉紅框內容就是報文主體。
一般,報文主體等於實體主體。只有當傳輸中進行編碼操做時,實體主體的內容發生變化,才致使它和報文主體產生差別。
內容編碼類型:
編碼方式 | 描述 |
---|---|
gzip | 代表實體採用 GNU zip 編碼 |
compress | 代表實體採用 Unix 的文件壓縮程序 |
deflate | 代表實體採用 zlib 的格式壓縮的 |
identity | 代表沒有對實體進行編碼,當沒有 Content-Encoding 首部字段時,默認採用此編碼方式 |
內容編碼是對報文的主體進行的可逆變換,是和內容的具體格式細節緊密相關的。
傳輸編碼也是做用在實體主體上的可逆變換,但使用它們是因爲架構方面的緣由,同內容的格式無關。使用傳輸編碼是爲了改變報文中的數據在網絡上傳輸的方式。
分塊編碼把報文分割成若干已知大小的塊。塊之間是緊挨着發送的,這樣就不須要在發送以前知道整個報文的大小了。分塊編碼是一種傳輸編碼,是報文的屬性。
分塊編碼與持久鏈接
若客戶端與服務器端之間不是持久鏈接,客戶端就不須要知道它在讀取的主體的長度,而只須要讀取到服務器關閉主體鏈接爲止。
當使用持久鏈接時,在服務器寫主體以前,必須知道它的大小並在 Content-Length 首部中發送。若是服務器動態建立內容,就可能在發送以前沒法知道主體的長度。
分塊編碼爲這種困難提供瞭解決方案,只要容許服務器把主體分塊發送,說明每塊的大小就能夠了。由於主體是動態建立的,服務器能夠緩衝它的一部分,發送其大小和相應的塊,而後在主體發送完以前重複這個過程。服務器能夠用大小爲 0 的塊做爲主體結束的信號,這樣就能夠繼續保持鏈接,爲下一個響應作準備。
來看看一個分塊編碼的報文示例:
MIME 中的 multipart(多部分)電子郵件報文中包含多個報文,它們合在一塊兒做爲單一的複雜報文發送。每一部分都是獨立的,有各自的描述其內容的集,不一樣部分之間用分界字符串鏈接在一塊兒。
相應得,HTTP 協議中也採納了多部分對象集合,發送的一份報文主體內可包含多種類型實體。
多部分對象集合包含的對象以下:
206 Partial Content
響應報文包含了多個範圍的內容時使用。假設你正在下載一個很大的文件,已經下了四分之三,突然網絡中斷了,那下載就必須重頭再來一遍。爲了解決這個問題,須要一種可恢復的機制,即能從以前下載中斷處恢復下載。要實現該功能,這就要用到範圍請求。
有了範圍請求, HTTP 客戶端能夠經過請求曾獲取失敗的實體的一個範圍(或者說一部分),來恢復下載該實體。固然這有一個前提,那就是從客戶端上一次請求該實體到這一次發出範圍請求的時間段內,該對象沒有改變過。例如:
GET /bigfile.html HTTP/1.1 Host: www.sample.com Range: bytes=20224- ···
上面示例中,客戶端請求的是文檔開頭20224字節以後的部分。
HTTP 通訊時,除客戶端和服務器外,還有一些用於協助通訊的應用程序。以下列出比較重要的幾個:代理、緩存、網關、隧道、Agent 代理。
HTTP 代理服務器是 Web 安全、應用集成以及性能優化的重要組成模塊。代理位於客戶端和服務器端之間,接收客戶端全部的 HTTP 請求,並將這些請求轉發給服務器(可能會對請求進行修改以後再進行轉發)。對用戶來講,這些應用程序就是一個代理,表明用戶訪問服務器。
出於安全考慮,一般會將代理做爲轉發全部 Web 流量的可信任中間節點使用。代理還能夠對請求和響應進行過濾,安全上網或綠色上網。
瀏覽器第一次請求:
瀏覽器再次請求:
Web 緩存或代理緩存是一種特殊的 HTTP 代理服務器,能夠將通過代理傳輸的經常使用文檔複製保存起來。下一個請求同一文檔的客戶端就能夠享受緩存的私有副本所提供的服務了。客戶端從附近的緩存下載文檔會比從遠程 Web 服務器下載快得多。
網關是一種特殊的服務器,做爲其餘服務器的中間實體使用。一般用於將 HTTP 流量轉換成其餘的協議。網關接收請求時就好像本身是資源的源服務器同樣。客戶端可能並不知道本身正在跟一個網關進行通訊。
隧道是會在創建起來以後,就會在兩條鏈接之間對原始數據進行盲轉發的 HTTP 應用程序。HTTP 隧道一般用來在一條或多條 HTTP 鏈接上轉發非 HTTP 數據,轉發時不會窺探數據。
HTTP 隧道的一種常見用途就是經過 HTTP 鏈接承載加密的安全套接字層(SSL)流量,這樣 SSL 流量就能夠穿過只容許 Web 流量經過的防火牆了。
Agent 代理是表明用戶發起 HTTP 請求的客戶端應用程序。全部發布 Web 請求的應用程序都是 HTTP Agent 代理。