HTTP首部解析

来源:https://www.cnblogs.com/unclekeith/archive/2018/01/13/8278991.html
-Advertisement-
Play Games

HTTP首部解析 轉載請註明出處: "HTTP首部解析" 文章目錄 1.與HTTP協議相關的Web伺服器 2.HTTP首部 與HTTP協議相關的Web伺服器 在說明HTTP首部相關知識之前,有必要先瞭解一下與HTTP協作的Web伺服器。 用一臺主機實現多個功能變數名稱 HTTP/1.1規範明確提出,允許一臺 ...


HTTP首部解析

轉載請註明出處:HTTP首部解析

文章目錄

1.與HTTP協議相關的Web伺服器

2.HTTP首部


與HTTP協議相關的Web伺服器

在說明HTTP首部相關知識之前,有必要先瞭解一下與HTTP協作的Web伺服器。

用一臺主機實現多個功能變數名稱

HTTP/1.1規範明確提出,允許一臺Web伺服器實現多個功能變數名稱。即使物理層面上只有一臺伺服器,但只要使用虛擬主機(又稱虛擬伺服器)的功能,就可以假想已經具有多台伺服器。

虛擬主機,又可以叫做虛擬伺服器,是一種在單一主機獲主機群上,實現多網域服務的方法,可以運行多個網站或服務的技術。具體內容可參考wiki。傳送門:wiki: 虛擬主機

但是在同一臺伺服器上部署多個網站功能變數名稱會有一個問題,因為只有一臺物理伺服器,意味著只有一個IP地址,在DNS服務將功能變數名稱解析成IP地址之後,在收到請求之後就需要弄清楚究竟要訪問哪個功能變數名稱。

這個問題其實有兩種方法可以解決。一是在發送請求時必須請求頭部欄位中增加Host欄位,表明請求的主機名。二是在一臺伺服器上使用不同的IP地址來管理多個服務。

通信數據轉發程式:代理

代理伺服器位於伺服器和客戶端之間,接收由客戶端發送的請求並轉發給伺服器,同時也接收伺服器返回的響應並轉發給客戶端。前端工程師常用的抓包軟體Fiddler、Charles就是通過代理來實現抓包的。

代理伺服器的基本行為就是接收客戶端發送的請求後轉發給伺服器,代理不改變請求URI,會直接發送給前方具有資源的目標伺服器。持有資源實體的伺服器稱為源伺服器,從源伺服器返回的響應經過代理伺服器後再傳給客戶端。每經過一次代理伺服器,都會追加Via首部欄位信息,表明經過的代理伺服器信息。要不然都不知道誰跟誰了...

總的來說呢,使用代理伺服器有以下好處

1.利用緩存技術減少伺服器網路帶寬流量的消耗

2.針對特定網站的訪問控制(控制哪些站點可以訪問伺服器,哪些不能訪問,實現訪問過濾功能)

代理有多種使用方法,按照兩種基準分類,一種是是否緩存(緩存代理),另一種是是否會修改報文(透明代理)。詳細資料可參見wiki。傳送門:wiki: 代理伺服器

保存資源的緩存

上面所說的緩存技術是指代理伺服器或客戶端本地磁碟內保存的資源副本。利用緩存可以減少對源伺服器的訪問(從代理伺服器或瀏覽器讀取未過期的緩存資源),因此也就節省了通信流量和通信時間了。

緩存(代理)伺服器的優勢在於利用緩存可避免多次從源伺服器請求資源。因此客戶端可就近從瀏覽器或代理伺服器上獲取資源,而源伺服器也不必多次處理相同的請求了。

但是不管是瀏覽器或者是代理伺服器上緩存的資源,都存在緩存過期的情況。如果緩存未過期,那麼就可以直接讀取緩存資源;如果緩存過期了,代理伺服器將會再次從源伺服器上獲取更新之後的資源。而瀏覽器並不會馬上發起一個請求給伺服器,而是會發起一個條件GET請求(If-Modified-Since和Last-Modified欄位)。

稍微總結一下。

1.一臺Web伺服器可以配置多個功能變數名稱,在請求時需要添加Host欄位表示請求的主機名或者是多個IP管理不同的服務。

2.代理伺服器的基本行為是將客戶端發送的請求轉發給伺服器,然後直接將請求資源直接轉發給源伺服器。可以利用代理伺服器或者瀏覽器對響應進行緩存,減少同一請求對源伺服器的訪問所產生的帶寬資源的浪費。

HTTP首部

請求頭和響應頭共有的首部欄位包括:通用首部欄位、實體首部欄位、其他首部欄位。而請求頭特有的首部欄位是請求首部欄位,響應頭特有的首部欄位是響應首部欄位。以下是HTTP/1.1定義了47種首部欄位。




以下就簡單的說明一下每一個欄位。

HTTP/1.1通用首部欄位

通用首部欄位是指,請求報文和響應報文雙方都會使用的首部。

Cache-Control指令:

能夠控制緩存的工作行為。指令的參數是可選的,多個指令之間通過','分隔。Cache-Control指令可用於請求和響應時。


public:緩存響應指令。明確表明其他用戶也可以利用緩存。

private:緩存響應指令。表示響應只以特定的用戶作為對象,代理伺服器只會對特定用戶提供緩存資源,對於其他用戶發送過去來的請求,代理伺服器則不會返回緩存。

no-cache:目的是為了防止從緩存中返回過期的資源。客戶端發送的請求如果包含no-cache指令,表示客戶端將不會接收緩存過的響應。於是,代理伺服器必須把客戶端請求轉發給源伺服器。如果伺服器返回的響應中包含no-cache指令,那麼代理伺服器不能對資源進行緩存。源伺服器以後也將不再對代理伺服器請求中提出的資源有效性進行確認,且禁止其對響應資源進行緩存操作。

no-store:禁止代理伺服器緩存響應資源。

s-maxage:表示處於公共代理伺服器情況下緩存過期沒有超過指定時間時,就會返回緩存。對於向同一個用戶重覆返迴響應的伺服器來說,這個指令沒有任何作用。另外呢,當使用s-maxage指令後,則直接忽略對Expires首部欄位及max-age指令的處理。例如Cache-Control: s-maxage=600(秒)表示公共代理伺服器中緩存過期沒超過10分鐘則可以返回緩存資源。

max-age:形式為Cache-Control: max-age=600(秒)。如果客戶端發送的請求中包含max-age指令時,表示緩存過期沒超過指定的時間,那麼客戶端就接收緩存的資源。如果max-age值為0,表示代理伺服器需要將請求轉發給源伺服器。

當源伺服器返回的響應中包含max-age指令時,代理伺服器將不對資源的有效性進行確認,而max-age數值代表資源保存為緩存的最長時間。

在HTTP/1.1版本的代理伺服器遇到同時存在Expires欄位的情況下,會優先處理max-age指令而忽略掉Expires欄位。

min-fresh:要求代理伺服器返回至少還沒有超過指定時間的緩存資源。如Cache-Control: min-fresh=60(秒)當指定min-fresh為60秒後,60秒內的響應可以返回,而超過60秒的響應就無法返回了。

max-stale:表示緩存過期在指定時間內,客戶仍然會接收。如果未指定任何參數值,那麼無論經過多久,客戶端都會接受響應。

only-if-cached:表示客戶端僅在代理伺服器本地緩存目標資源的情況下才會要求其返回。也就是說,該指令會要求代理伺服器不重新載入響應,也不會再次確認資源的有效性。若發生請求代理伺服器的本地緩存無響應,則返回狀態碼504 Gateway Timeout

must-revalidate:表示代理伺服器會向源伺服器再次驗證即將返回的響應緩存是否仍然有效。如果代理無法連通源伺服器再次獲取有效資源的話,代理伺服器會給客戶端返回504(Gateway Timeout)狀態碼。另外會忽略請求的max-stale指令。

proxy-revalidate:要求代理伺服器對緩存的響應有效性再進行驗證。

no-transform:無論是在請求中還是在響應頭中,緩存都不能改變實體主體的媒體類型。

Connection

Connection欄位具有以下兩個作用

控制不再轉發給代理伺服器的首部欄位:格式如下Connection: 不再轉發的首部欄位名。在客戶端發送請求和伺服器返迴響應內,使用Connection欄位可以控制不在轉發給代理伺服器

持久連接:Connection: keep-alive。HTTP/1.1版本預設連接是持久連接。客戶端和伺服器只需建立一次TCP連接,就可以相互進行多次HTTP通信了。直到有一方明確表示需要斷開TCP連接,持久連接才會結束。

Pragma

該首部欄位僅作為與HTTP/1.0的向後相容而定義。形式如下Pragma: no-cache。只用在響應頭中,表示代理伺服器不能對響應進行緩存。

pargma首部欄位與no-cache指令作用相同,但是為了相容HTTP協議版本的問題,HTTP響應頭中會同時含有下麵兩個欄位。

Trailer

Trailer欄位會事先說明在報文主體後記錄了哪些首部欄位。主要用於HTTP/1.1版本的分塊傳輸編碼時。

Transfer-Encoding

Transfer-Encoding欄位規定了傳輸報文主體時採用的編碼方式,僅對分塊傳輸編碼有效。

HTTP/1.1 200 OK Transfer-Encoding: chunked Connection: keep-alive cfo <--16進位(10進位為3312) ·····3312位元組分塊數據····· 392 <--16進位(10進位為914) `````914位元組分塊數據······

以上例子中,Transfer-Encoding欄位值有效使用分塊傳輸編碼,且被分成了3312位元組和914位元組大小的分塊數據。

Upgrade

Upgrade欄位檢測HTTP協議及其他協議是否可以使用更高的版本進行通信。如在使用WebSocket協議時會使用到此欄位,在HTTP通信過程中,會使用HTTP升級將HTTP協議升級為WebSocket協議。之後伺服器端返回101 Switching Protocols狀態碼表示協議轉換成功,此時就可以使用WebSocket協議進行全雙工雙向通信了。對WebSocket不熟悉的朋友可以參考這篇文章。傳送門:WebSocket協議解析

Via

Via欄位的目的是為了追蹤客戶端與伺服器之間的請求和響應報文的傳輸路徑。報文在經過代理伺服器或網關時,會在Via欄位中附加自身伺服器的信息,然後再進行轉發。通常Via欄位會與Max-Forwards欄位配合使用。對Max-Forwards欄位的解釋請看這篇文章。傳送門: Max-Forwards

請求首部欄位

Accept

Accept欄位可以通知伺服器,用戶代理能夠處理的媒體類型及媒體類型的相對優先順序。可以使用type/subtype這種形式,一次指定多種媒體類型,通過q=來給媒體類型增加優先順序,最大為1.0, 最小為0,預設值為1.0

Accept:q=1.0 application/json; q=0.8 text/plain; q=0.7 */*

Accept-Charset

Accept-Charset欄位用來通知伺服器用戶代理支持的字元集及字元集的相對優先順序。另外,可一次性指定多種字元集。與Accept欄位相同的是可用權重q值來表示相對優先順序。

Accept-Encoding

Accept-Encoding欄位用來通知伺服器用戶代理支持的內容編碼及內容編碼的相對優先順序。內容編碼包括gzip、compress、deflate、identity(不執行壓縮的預設編碼格式)等。

Accept-Language

Accept-Language用來告知伺服器用戶代理能夠處理的自然語言集(中文或者英文), 以及自然語言集的相對優先順序,可一次性指定多種自然語言集

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

Authorization

Authorization欄位用來告知伺服器,用戶代理的認證信息(證書)。通常想要通過伺服器認證的用戶代理會在接收到返回的401狀態碼響應後,把欄位Authorization加入請求中。

Host

Host欄位會告知伺服器請求的資源所處的互聯網主機名和埠號。請求被髮送到伺服器時,會使用DNS服務將功能變數名稱解析成IP地址。如果此時相同的IP地址下部署了多個功能變數名稱(虛擬主機),那麼伺服器就無法理解究竟是哪個功能變數名稱對應的請求。因此就需要使用Host欄位來明確指出請求的主機名。

If-None-Match
If-None-Match欄位與Etag配合使用,當與Etag欄位值不一致時,伺服器會處理請求。如果一致,則伺服器端會返回304 Not Modified。

在典型的用法中,當一個URL被請求,Web伺服器會返回資源和其對應的Etag值,會被放置在HTTP響應頭中。

Etag: "686897696a7c876b7e"

然後,客戶端可以決定是否緩存這個資源和Etag。以後,如果客戶端想再次請求相同的url,將會發送一個包含已保存的Etag和If-None-Match欄位的請求。

If-None-Match: "686897696a7c876b7e"

客戶端請求之後,伺服器可能會比較客戶端的Etag和當前版本資源的ETag。如果ETag值匹配,這就意味著資源沒有改變,伺服器便會發送回一個極短的響應,包含HTTP “304 Not Modified”的狀態。304狀態告訴客戶端,它的緩存版本是最新的,並應該使用它。
然而,如果ETag的值不匹配,這就意味著資源很可能發生了變化,那麼,一個完整的響應(200 OK)就會被返回,包括資源的內容,就好像ETag沒有被使用。這種情況下,客戶端可以用新返回的資源和新的ETag替代先前的緩存版本。

If-Modified-Since

If-Modified-Since欄位與響應頭的Last-Modified欄位匹配使用。當Last-Modified欄位值的時間在其之後,表示資源發生了更新,則伺服器會返回200 OK的狀態碼,當Last-Modified欄位值的時間在其之前,表明資源沒有發生更新,則伺服器會返回304 Not Modified狀態碼。當與If-None-Match欄位聯合使用的時候,If-Modified-Since欄位會被忽略,除非伺服器不支持If-None-Match欄位。If-Modified-Since用於確認代理伺服器或客戶端擁有的本地資源的有效性。

If-Range

If-Range欄位會告知伺服器若指定的If-Range欄位值和請求資源的Etag值獲時間相一致,則作為範圍請求處理,返回的響應頭會包含Content-Range欄位,表示返回的範圍位元組數。反之,則返回全體資源。此欄位會與Range欄位配合使用。

Proxy-Authorization

Proxy-Authorization: Basic dFDGADdjgjadfDSFJ5

接收到代理伺服器發送過來的認證信息之後,客戶端會發送包含該首部欄位的請求,以告知伺服器認證所需要的信息。

Referer

Referer欄位會告知伺服器請求的原始資源的URI。

響應首部欄位

Accept-Ranges

Accpet-Ranges欄位用來告知客戶端伺服器能否處理範圍請求,以指定獲取伺服器端某個部分的資源。可指定的欄位值有兩種,可處理範圍請求時指定其為bytes,反之指定為none。

ETag

伺服器會為每份資源分配對應的ETag值,當資源更新時,ETag值也需要更新。ETag欄位通常與If-None-Match欄位配合使用。當ETag值與If-None-Match值相互匹配時,表示請求的資源沒有發生變化,則伺服器會返回304 Not Modified狀態碼;如果相互不匹配,則會返回200 OK狀態碼。另外,ETag分為強ETag和弱ETag,它們通過ETag標識符的開頭是否存在“W/”來區分,如

"123456789"   -- 一個強ETag驗證符
W/"123456789"  -- 一個弱ETag驗證符

具體的區別可參考wiki。傳送門: HTTP ETag

Proxy-Authenticate && WWW-Authenticate
Proxy-Authenticate欄位會把有代理伺服器所要求的認證信息發送給客戶端,通常與Proxy-Authorization欄位配合使用。

WWW-Authenticate欄位用於HTTP訪問認證。通常與Authorization欄位配合使用。

實體首部欄位

實體首部欄位是包含在請求報文和響應報文中的實體部分所使用的首部,用於補充內容的更新時間等與實體相關的信息。
Allow

形式如Allow: GET, POST。Allow欄位用於通知客戶端能夠支持的HTTP方法。當伺服器接收到不支持的HTTP方法時,會以狀態碼405 Method Not Allowed作為響應返回。

Content-Encoding

該欄位會告知客戶端伺服器對實體的主體部分選用的內容編碼方式。主要採用4種內容編碼方式:gzip、compress、deflate、identity。

Content-Language && Content-Length

Content-Language告知客戶端實體主體採用的自然語言集。Content-Length告知客戶端實體主體的大小。

Content-Range && Content-Type

Content-Range告知客戶端響應返回的實體的哪個部分符合範圍請求,該欄位針對範圍請求。欄位值以位元組為單位,表示當前發送部分及整個實體大小。形式如Content-Range: bytes 5001-10000/10000

Content-Type告知客戶端實體主體採用的媒體類型,媒體類型與Accept欄位相同。

Expries

Expries欄位用於告知客戶端資源的過期時間。如果是代理伺服器接收到帶有Expires欄位的響應時,會將資源緩存起來。當請求相同資源且未超過指定時間時,會返回緩存的資源。當超過指定時間後,代理伺服器會將請求轉發給源伺服器。如果不希望代理伺服器對資源進行緩存時,可以將Expires欄位設置成與Date欄位的值相同。在瀏覽器方面,當請求的資源過期時,不會立馬向源伺服器發起請求,而是會先發起條件請求(If-Modified-Since與Last-Modifed欄位)。

當Expires欄位遇上Cache-Control欄位的max-age指令時,會優先處理max-age指令。

為Cookie服務的欄位

由於HTTP是無狀態協議,因此需要Cookie結合HTTP來實現用戶的狀態管理。對於Cookie的說明可以看這篇文章。傳送門:前端存儲方案


參考資料

1.《圖解HTTP》

2.MDN web docs

3.維基百科


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以前都是默默地看園子里的文章,猥瑣的點贊,今天也分享一下自己用js實現的一個簡單mvvm框架。 最初只做了自動綁定事件,後面又參考學習了vue,knouckout以及argular實現方式,以及結合自己做WPF的一些經驗,增加了屬性綁定,今天又稍微整理了下,完善了部分功能,把代碼提交到了碼雲:htt ...
  • 先上效果圖吧. 本人菜鳥入門, 請勿噴. 首先樣式: 1 1 body{ 2 2 margin: 0; 3 3 padding: 0; 4 4 width: 100%; 5 5 height: 100%; 6 6 } 7 7 8 8 .headers{ 9 9 width: 100%; 10 10 ...
  • 本文最初發表於 "博客園" ,併在 "GitHub" 上持續更新 前端的系列文章 。歡迎在GitHub上關註我,一起入門和進階前端。 以下是正文。 偽類(偽類選擇器) 偽類 :同一個標簽,根據其 不同的種狀態,有不同的樣式 。這就叫做“偽類”。偽類用冒號來表示。 比如div是屬於box類,這一點很明 ...
  • 很多jQuery代碼都有如下片段: 作用就是等文檔結構載入完成後再去執行function中的代碼,功能類似於window.onload事件。 代碼實例如下: 上面代碼能夠將div元素隱藏。但是如果將代碼修改如下: 運行上面的代碼卻不能夠隱藏div元素。 由於代碼是順序執行的,那麼當代碼執行到$("d ...
  • 在編寫代碼的時候,可能會對代碼加以說明。 當然這個說明不是給瀏覽器看的,而是便於開發者閱讀。 瀏覽器不會顯示註釋的內容,也不會對網頁結構造成影響。 註釋的結構: 註釋是以<!--開始,以-->結束,中間是註釋的內容。 代碼實例: http://www.softwhy.com/article-517- ...
  • JavaScript加法運算符用加號(+)表示。 代碼實例如下: 在處理特殊值時,加法也有一些特殊行為: (1).某個運算數是NaN,那麼結果為NaN。 (2).-Infinity加-Infinity,結果為-Infinity。 (3).Infinity加-Infinity,結果為NaN。 (4). ...
  • 此選擇器能夠匹配緊跟在E元素之後的元素F。 語法結構: 瀏覽器支持: (1).IE瀏覽器支持此選擇符。 (2).edge瀏覽器支持此選擇符。 (3).谷歌瀏覽器支持此選擇符。 (4).火狐瀏覽器支持此選擇符。 (5).opera瀏覽器支持此選擇符。 (6).safria瀏覽器支持此選擇符。 註意:I ...
  • 居中是我們在css中經常遇到的問題,一般有水平居中、垂直居中、垂直水平居中這3種情況,那麼今天首先就來對學習到的水平居中的方法做個總結筆記。 css水平居中 text-align:center 為了看得更清楚,我們舉一個例子,如圖,我們將div2放入div1中,現在,如果我們想讓文字在div2中水平 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...