我知道到的HTTP

HTTP是一個客戶端和服務器端請求和應答的標準(TCP)。HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)用於從www服務器傳輸超文本到本地瀏覽器的傳輸協議。它可使瀏覽器更加高效,使網絡傳輸減小。它不只保證計算機正確快速地傳輸超文本文檔,還肯定傳輸文檔中的哪一部分,以及哪部份內容首先顯示(如文本先於圖形)等。html

1、協議基礎

HTTP協議採用了請求/響應模型,即客戶端向服務器發送一個請求,請求頭包括請求的方法、URL、協議版本、以及包含請求修飾符、客戶信息和內容的相似MIME的消息結構;服務器以一個狀態行做爲響應,響應的內容包括消息協議的版本、成功或者錯誤編碼加上包含服務器信息、實體源信息以及可能的實體內容。HTTP的頭信息包括通用頭、請求頭、響應頭和實體頭四部分,每一個頭域由一個域名、冒號(:)和域值三部分組成。瀏覽器

一、通用頭域

通用頭域包含請求和響應消息都支持的頭域,是做爲一個總體而不是特定資源與事務相關聯,包括Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。緩存

Cache-Control頭域

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頭域

Date頭域表示消息發送的時間,時間的描述格式由rfc822定義。Date描述的時間表示世界標準時間,換算成本地時間須要知道用戶所在的時區。

Pragma頭域

Pragma頭域用來包含實現特定的指令,最經常使用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache-Control:no-cache相同。

二、請求頭域

容許客戶端傳遞關於自身的信息和但願響應形式。

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頭域的內容包含發送請求的用戶信息。

三、響應頭域

響應頭域容許服務器傳遞不能放在狀態行的附加信息,這些域主要描述服務器的信息和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響應頭包含處理請求的原始服務器的軟件信息。

四、實體頭域

定義被傳送資源的信息,便可用於請求,也可用於響應。請求消息和響應消息均可以包含實體信息,實體信息通常由實體頭域和實體組成。實體頭域包含關於實體的原信息,實體頭包括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定義。

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實體頭

指定服務器上保存內容的最後修訂時間。

2、工做流程

一次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請求,也是由三部分組成,分別爲:
一、狀態行

例如: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
複製代碼
  1. 瀏覽器解析html代碼,並請求html代碼中的資源
  2. 瀏覽器對頁面進行渲染並呈現給用戶
相關文章
相關標籤/搜索