主頁 >  其他 > 一文帶你看清HTTP所有概念(轉)

一文帶你看清HTTP所有概念(轉)

2020-09-20 21:44:59 其他

一文帶你看清HTTP所有概念

 

上一篇文章我們大致講解了一下 HTTP 的基本特征和使用,大家反響很不錯,那么本篇文章我們就來深究一下 HTTP 的特性,我們接著上篇文章沒有說完的 HTTP 標頭繼續來介紹(此篇文章會介紹所有標頭的概念,但沒有深入底層)

HTTP 標頭

先來回顧一下 HTTP1.1 標頭都有哪幾種

HTTP 1.1 的標頭主要分為四種,通用標頭物體標頭請求標頭回應標頭,現在我們來對這幾種標頭進行介紹

通用標頭

HTTP 通用標頭之所以這樣命名,是因為與其他三個類別不同,它們不是限定于特定種類的訊息或者訊息組件(請求,回應或訊息物體)的,HTTP 通用標頭主要用于傳達有關訊息本身的資訊,而不是它所攜帶的內容,它們提供一般資訊并控制如何處理和處理訊息,

盡管通用標頭不會限定于是請求還是回應報文,但是某些通用標頭大部分或全部用于一種特定型別的請求中,也就是說,如果某個通用標頭出現在請求報文中,那么大部分通用標頭都會顯示在該請求報文中,回應報文也是一樣的,

先列出來一個清單,講明我們都需要介紹哪些通用標頭

  • Cache-Control
  • Connection
  • Date
  • Pragma
  • Trailer
  • Transfer-Encoding
  • Upgrade
  • Via
  • Warning

Cache-Control

快取(Cache)是計算機領域里的一個重要概念,是優化系統性能的利器,不僅計算機中的 CPU 為了提高指令執行效率從而選擇使用暫存器作為輔助,計算機網路同樣存在快取,下面我們就來介紹一下計算機網路中的快取,

Cache-Control 是通用標頭的指令,它能夠管理如何對 HTTP 的請求或者回應使用快取,

因為計算機網路中是可以有第三者出現的,也就是快取服務器,這個指令通過影響請求/回應中的快取服務器從而達到控制快取的目的;不僅有快取服務器,還有瀏覽器內部快取也會影響鏈路的快取,

這個標頭中可以出現許多單獨的指令,其詳細資訊可以在 RFC 2616 中找到,即使這是常規標頭,某些指令也只能出現在請求或回應中,下表提供了一個 Cache-Control 選項的總結并告訴你如何去使用

請注意,在 Cache-Control 標頭中只能出現一個指令,但是在訊息中可以出現多個這樣的標頭,

上面這個表格其實會有四種分類

  • 可快取性: 它們分別是 no-cacheno-storeprivate 和 public
  • 快取有效性時間: 它們分別是 max-ages-maxagemax-stalemin-fresh
  • 重新驗證并重新加載: 它們分別是 must-revalidate 和 proxy-revalidate
  • 其他: 它們分別是 only-if-cached 和 no-transform

分別對表格中的內容進行一下詳細介紹

no-cache

no-cache 很容易和 no-store 混淆,一般都會把 no-cache 認為是不快取,其實不是這樣,

使用 no-cache 指令的目的是為了防止從快取中回傳過期的資源,例如下圖所示

Cache-Control: no-cache

舉個例子你就明白了,No-Cache 就相當于是吃著碗里的,占著鍋里的,如果鍋里還有新的肉片,就先吃鍋里的,如果鍋里沒有新的,再吃自己的,這里鍋里的就相當于是源服務器產生的,碗里的就相當于是快取的,

no-store

no-store 才是真正意義上的不快取,每次服務器接受到客戶端的請求后,都會回傳最新的資源給客戶端,

Cache-Control: no-store

max-age

max-age 可以用在請求或者回應中,當客戶端發送帶有 max-age 的指令時,快取服務器會判斷自己快取時間的數值和 max-age 的大小,如果比 max-age 小,那么快取有效,可以繼續給客戶端回傳快取的資料,如果比 max-age 大,那么快取服務器將不能回傳給客戶端快取的資料,

Cache-Control: max-age=60

如果 max-age = 0,那么快取服務器將會直接把請求轉發到服務器

Cache-Control: max-age=0

注意:這個 max-age 的值是相對于請求時間的

must-revalidate

表示一旦資源過期,快取就必須在原始服務器上沒有成功驗證的情況下才使用其過期的資料,

Cache-Control: must-revalidate

no-store 、no_cache 、 must-revalidate 和 max-age 可以一起看,下面是一個這四個標頭的流程圖

public

public 屬性只出現在客戶端回應中,表示回應可以被任何快取所快取,在計算機網路中,分為兩種快取,共享快取和私有快取,如下所示

Cache-Control: public

private

當指定 private 指令后,回應只以特定的用戶作為物件,這與 public 的用法相反,快取服務器只對特定的客戶端進行快取,其他客戶端發送過來的請求,快取服務器則不會回傳快取,

Cache-Control: private

s-maxage

s-maxage 指令的功能和 max-age 指令的功能相同,不同點之處在于 s-maxage 不能用于私有快取,只能用于多用戶使用的公共服務器,對于同一用戶的重復請求和回應來說,這個指令沒有任何作用,

Cache-Control: s-maxage=60

min-fresh

min-fresh只能出現在請求中,min-fresh 要求快取服務器回傳 min-fresh 時間內的快取資料,例如 Cache-Control:min-fresh=60,這就要求快取服務器發送60秒內的資料,

Cache-Control: min-fresh=60

max-stable

max-stable 只能出現在請求中,表示客戶端會接受快取資料,即使過期也照常接收,

Cache-Control: max-stable=60

only-if-cached

這個標頭只能出現在請求中,使用 only-if-cached 指令表示客戶端僅在快取服務器本地快取目標資源的情況下才會要求其回傳,

Cache-Control: only-if-cached

proxy-revalidate

proxy-revalidate 指令要求所有的快取服務器在接收到客戶端帶有該指令的請求回傳回應之前,必須再次驗證快取的有效性,

Cache-Control: proxy-revalidate

no-transform

使用 no-transform 指令規定無論是在請求還是回應中,快取都不能改變物體主體的媒體型別,

Cache-Control: no-transform

Connection

HTTP 協議使用 TCP 來管理連接方式,主要有兩種連接方式,持久性連接 和 非持久性連接

持久性連接

持久性連接指的是一次會話完成后,TCP 連接并未關閉,第二次再次發送請求后,就不再需要建立 TCP 連接,而是可以直接進行請求和回應,它的一般表示形式如下

Connection: keep-alive

從 HTTP 1.1 開始,默認使用持久性連接

keep-alive 也是一個通用標頭,一般 Connection 都會和 keep-alive 一起使用,keep-alive 有兩個引數,一個是 timeout;另一個是 max,它們的主要表現形式如下

Connection: Keep-Alive
Keep-Alive: timeout=5, max=1000
  • timeout: 指的是空閑連接必須打開的最短時間,也就是說這次請求的連接時間不能少于5秒,

  • max: 指的是在連接關閉之前服務器所能夠收到的最大請求數,

非持久性連接

非持久性連接表示一次會話請求/回應后關閉連接的方式,HTTP 1.1 之前使用的連接都是非持久連接,也就是

Connection: close

Date

Date 是一個通用標頭,它可以出現在請求標頭和回應標頭中,它的基本表示如下

Date: Wed, 21 Oct 2015 07:28:00 GMT 

表示的是格林威治標準時間,這個時間要比北京時間慢八個小時

Pragma

Pragma是 http 1.1 之前版本的歷史遺留欄位,僅作為與 http 的向后兼容而定義,它的一般形式如下

Pragma: no-cache

只用于客戶端發送的請求中,客戶端會要求所有的中間服務器不回傳快取的資源,

如果所有的中間服務器都以實作 HTTP /1.1為標準,那么直接使用 Cache-Control: no-cache 即可,如果不是的話,就要包含兩個欄位,如下

Cache-Control: no-cache
Pragma: no-cache

Trailer

首部欄位 Trailer 會事先說明在報文主體后記錄了哪些首部欄位,該首部欄位可應用在 HTTP/1.1 版本分塊傳輸編碼時,一般用法如下

Transfer-Encoding: chunked
Trailer: Expires

以上用例中,指定首部欄位 Trailer 的值為 Expires,在報文主體之后(分塊長度 0 之后)出現了首部欄位 Expires,

Transfer-Encoding

Transfer-Encoding 屬于內容協商的范疇,下面會具體介紹一下內容協商,現在先做個預告:Transfer-Encoding 規定了傳輸報文所采用的編碼方式

注意:HTTP 1.1 的傳輸編碼方式僅對分塊傳輸有效,但是 HTTP 2.0 就不再支持分塊傳輸,而提供了自己更有效的資料傳輸機制,

Transfer-Encoding: chunked

Transfer-Encoding 也屬于 Hop-by-hop(逐跳) 首部 ,下面來回顧一下,HTTP 報文標頭除了可以根據屬性所在的位置分為 通用標頭請求標頭回應標頭 和 物體標頭;還可以按照是否被快取分為 端到端首部(End-to-End) 和 逐跳首部(Top-to-Top)

除了下面八種屬于逐跳首部外,其余都屬于端到端首部

Connection、Keep-Alive、Proxy-Authenticate、Proxy-Authorization、Trailer、TE、Transfer-Encoding、Upgrade

下面回到討論中來,Transfer-Encoding 用于兩個節點之間傳輸訊息,而不是資源本身,在多個節點傳輸訊息的程序中,每一段訊息的傳輸都可以使用不同的 Transfer-Encoding,如圖所示

Transfer-Encoding 支持檔案壓縮,如果你想要以檔案壓縮后的形式發送的話,Transfer-Encoding 所有可選型別如下

  • chunked: 資料按照一系列塊發送,在這種情況下,將省略 Content-Length 標頭,并在每個塊的開頭,需要以十六進制填充當前塊的長度,后跟 '\r\n',然后是塊本身,然后是另一個'\r\n',當將大量資料發送到客戶端并且在請求已被完全處理之前,可能無法知道回應的總大小時,分塊編碼很有用, 例如,在生成由資料庫查詢產生的大型 HTML 表時或在傳輸大型影像時, 分塊的回應看起來像這樣
HTTP/1.1 200 OK 
Content-Type: text/plain 
Transfer-Encoding: chunked

7\r\n
Mozilla\r\n 
9\r\n
Developer\r\n
7\r\n
Network\r\n
0\r\n 
\r\n

終止塊通常是0,緊隨Transfer-Encoding 后面的是 Trailer 標頭, Trailer 可能為空,

  • compress: 使用 Lempel-Ziv-Welch(LZW) 演算法的格式,值名稱取自 UNIX 壓縮程式,該程式實作了該演算法,現在幾乎沒有瀏覽器使用這種內容編碼了,因為這個專利在 2003 年就停掉了,
  • deflate:使用 zlib(在 RFC 1950 定義) 結構和 deflate 壓縮演算法
  • gzip: 使用Lempel-Ziv編碼(LZ77)和32位CRC的格式,這最初是 UNIX gzip 程式的格式,HTTP / 1.1標準還建議出于兼容性目的,支持此內容編碼的服務器應將 x-gzip 識別為別名,
  • identity: 使用身份功能(即無壓碩訓修改),

也可以列出多個值,以逗號分隔,類似一個集合串列

Transfer-Encoding: gzip, chunked

Upgrade

首部欄位 Upgrade 用于檢測 HTTP 協議及其他協議是否可使用更高的版本進行通信,其引數值可以用來指定一個完全不同的通信協議,

上圖用例中,首部欄位 Upgrade 指定的值為 TLS/1.0,請注意此處兩個欄位首部欄位的對應關系,Connection 的值被指定為 Upgrade,
Upgrade 首部欄位產生作用的物件僅限于客戶端和臨近服務器之間,因此,使用首部欄位 Upgrade 時,還需要額外指定 Connection: Upgrade
對于附有首部欄位 Upgrade 的請求,服務器可用 101 Switching Protocols 狀態碼作為回應回傳,

Via

使用 Via 是為了跟蹤客戶端和服務器之間的請求/回應路徑,避免請求回圈以及能夠識別請求/回應鏈中發送者協議的功能,Via 欄位由代理服務器添加,不論是正向代理還是反向代理,并且可以出現在請求標頭和回應標頭中,它用于跟蹤訊息轉發,例如下圖所示

Via 后面的的 1.1, 1.0 表示接收服務器上的 HTTP 版本,Via 首部是為了跟蹤路徑,經常和 TRACE 方法一起使用,

Warning

注意:Warning 欄位即將被棄用

查閱 Warning (https://github.com/httpwg/http-core/issues/139) and Warning: header & stale-while-revalidate (https://github.com/whatwg/fetch/issues/913) 獲取更多細節

Warning 通用 HTTP 標頭通常會告知用戶一些與快取相關的問題的警告

HTTP/1.1 中定義了 7 種警告,它們分別如下

請求標頭

請求標頭用于客戶端發送 HTTP 請求到服務器中所使用的欄位,下面我們一起來看一下 HTTP 請求標頭都包含哪些欄位,分別是什么意思,下面會介紹

  • Accept
  • Accept-Charset
  • Accept-Encoding
  • Accept-Language
  • Authorization
  • Expect
  • From
  • Host
  • If-Match
  • If-Modified-Since
  • If-None-Match
  • If-Range
  • If-Unmodified-Since
  • Max-Forwards
  • Proxy-Authorization
  • RangeReferer
  • TE
  • User-Agent

下面分別來介紹一下

Accept

HTTP 請求標頭會告知客戶端能夠接收的 MIME 型別是什么

那么什么是 MIME 型別呢?在回答這個問題前你應該先了解一下什么是 MIME

MIME: MIME (Multipurpose Internet Mail Extensions) 是描述訊息內容型別的因特網標準,MIME 訊息能包含文本、影像、音頻、視頻以及其他應用程式專用的資料,

也就是說,MIME 型別其實就是一系列訊息內容型別的集合,那么 MIME 型別都有哪些呢?

文本檔案: text/html、text/plain、text/css、application/xhtml+xml、application/xml

圖片檔案: image/jpeg、image/gif、image/png

視頻檔案: video/mpeg、video/quicktime

應用程式二進制檔案: application/octet-stream、application/zip

比如,如果瀏覽器不支持 PNG 圖片的顯示,那 Accept 就不指定image/png,而指定可處理的 image/gif 和 image/jpeg 等圖片型別,

一般 MIME 型別也會和 q 這個屬性一起使用,q 是什么?q 表示的是權重,來看一個例子

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

這是什么意思呢?若想要給顯示的媒體型別增加優先級,則使用 q= 來額外表示權重值,沒有顯示權重的時候默認值是1.0 ,我給你列個表格你就明白了

qMIME
1.0 text/html
1.0 application/xhtml+xml
0.9 application/xml
0.8 * / *

也就是說,這是一個放置順序,權重高的在前,低的在后,application/xml;q=0.9 是不可分割的整體,

Accept-Charset

Accept-Charset 表示客戶端能夠接受的字符編碼,Accept-Charset 也是屬于內容協商的一部分,它和

Accept 一樣,也可以用 q 來表示字符集,用逗號進行分割,例如

Accept-Charset: iso-8859-1
Accept-Charset: utf-8, iso-8859-1;q=0.5
Accept-Charset: utf-8, iso-8859-1;q=0.5, *;q=0.1

事實上,很多以 Accept-* 開頭的標頭,都是屬于內容協商的范疇,關于內容協商我們下面會說,

Accept-Encoding

表示 HTTP 標頭會標明客戶端希望服務端回傳的內容編碼,這通常是一種壓縮演算法,Accept-Encoding 也是屬于內容協商 的一部分,使用并通過客戶端選擇 Content-Encoding 內容進行回傳,

即使客戶端和服務器都能夠支持相同的壓縮演算法,服務器也可能選擇不壓縮并回傳,這種情況可能是由于這兩種情況造成的:

  • 要發送的資料已經被壓縮了一次,第二次壓縮并不會導致發送的資料更小
  • 服務器過載,無法承受壓縮帶來的性能開銷,通常,如果服務器使用 CPU 超過 80% ,Microsoft 則建議不要使用壓縮

下面是 Accept-Encoding 的使用方式

Accept-Encoding: gzip
Accept-Encoding: compress
Accept-Encoding: deflate
Accept-Encoding: br
Accept-Encoding: identity
Accept-Encoding: *
Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5

上面的幾種表述方式就已經把 Accept-Encoding 的屬性列全了

  • gzip: 由檔案壓縮程式 gzip 生成的編碼格式,使用 Lempel-Ziv編碼(LZ77)和32位CRC的壓縮格式,感興趣的同學可以讀一下 (https://en.wikipedia.org/wiki/LZ77_and_LZ78#LZ77)

  • compress: 使用Lempel-Ziv-Welch(LZW)演算法的壓縮格式,有興趣的同學可以讀 (https://en.wikipedia.org/wiki/LZW)

  • deflate: 使用 zlib 結構和 deflate 壓縮演算法的壓縮格式,參考 (https://en.wikipedia.org/wiki/Zlib) 和 (https://en.wikipedia.org/wiki/DEFLATE)

  • br: 使用 Brotli 演算法的壓縮格式,參考 (https://en.wikipedia.org/wiki/Brotli)

  • 不執行壓碩訓不會變化的默認編碼格式

  • * : 匹配標頭中未列出的任何內容編碼,如果沒有列出 Accept-Encoding ,這就是默認值,并不意味著支

    持任何演算法,只是表示沒有偏好

  • ;q= 采用權重 q 值來表示相對優先級,這點與首部欄位 Accept 相同,

Accept-Language

Accept-Language 請求表示客戶端需要服務端回傳的語言型別,Accept-Language 也屬于內容協商的范疇,服務端通過 Content-Language 進行回應,和 Accept 首部欄位一樣,按權重值 q來表示相對優先級,例如

Accept-Language: de
Accept-Language: de-CH
Accept-Language: en-US,en;q=0.5

Authorization

HTTP Authorization 請求頭用于向服務器認證用戶代理的憑據,通常用在服務器以401未經授權狀態和WWW-Authenticate標頭回應之后,啥意思呢?你不明白的話我畫張圖給你看

請求標頭 Authorization 是用來告知服務器,用戶的認證資訊,服務器在只有收到認證后才會回傳給客戶端 200 OK 的回應,如果沒有認證資訊,則會回傳 401 并告知客戶端需要認證資訊,詳細關于 Authorization 的資訊,后面也會詳細解釋

Expect

Expect HTTP 請求標頭指示服務器需要滿足的期望才能正確處理請求,如果服務器沒有辦法完成客服端所期望完成的事情并且服務端存在錯誤的話,會回傳 417 Expectation Failed ,HTTP 1.1 只規定了100-continue ,

  • 如果服務器能正常完成客戶端所期望的事情,會回傳 100
  • 如果不能滿足期望或回傳任何其他4xx 的狀態碼,會回傳 417

例如

PUT /somewhere/fun HTTP/1.1
Host: origin.example.com
Content-Type: video/h264
Content-Length: 1234567890987
Expect: 100-continue

From

From 請求頭用來告知服務器使用用戶代理的電子郵件地址,通常情況下,其使用目的就是為了顯示搜索引擎等用戶代理的負責人的電子郵件聯系方式,我們在使用代理的情況下,應盡可能包含 From 首部欄位,例如

From: [email protected]

你不應該將 From 用在訪問控制或者身份驗證中

Host

Host 請求頭指明了服務器的域名(對于虛擬主機來說),以及(可選的)服務器監聽的TCP埠號,如果沒有給定埠號,會自動使用被請求服務的默認埠(比如請求一個 HTTP 的 URL 會自動使用80作為埠),

Host: developer.mozilla.org

Host 首部欄位在 HTTP/1.1 規范內是唯一一個必須被包含在請求內的首部欄位,

If-Match

If-Match 后面可以跟一大堆屬性,形式像 If-Match 這種的請求頭稱為條件請求,服務器接收到條件請求后,需要判定條件請求是否滿足,只有條件請求為真,才會執行條件請求

類似的還有 If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since

對于 GET 和 POST 方法,服務器僅在與列出的 ETag(回應標頭) 之一匹配時才回傳請求的資源,這里又多了一個新詞 ETag,我們稍后再說 ETag 的用法,對于像是 PUT 和其他非安全的方法,在這種情況下,它僅僅將上傳資源,

下面是兩種常見的案例

  • 對于 GET 和 POST 方法,會結合使用 Range 標頭,它可以確保新發送請求的范圍與上一個請求的資源相同,如果不匹配的話,會回傳 416 回應,
  • 對于其他方法,特別是 PUT 方法,If-Match 可以防止丟失更新,服務器會比對 If-Match 的欄位值和資源的 ETag 值,僅當兩者一致時,才會執行請求,反之,則回傳狀態碼 412 Precondition Failed 的回應,例如
If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
If-Match: *

If-Modified-Since

If-Modified-Since 是 HTTP 條件請求的一部分,只有在給定日期之后,服務端修改了請求所需要的資源,才會回傳 200 OK 的回應,如果在給定日期之后,服務端沒有修改內容,回應會回傳 304 并且不帶任何回應體,If-Modified-Since 只能使用 GET 和 HEAD 請求,

If-Modified-Since 與 If-None-Match 結合使用時,它將被忽略,除非服務器不支持 If-None-Match,一般表示如下

If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT 

注意:這是格林威治標準時間, HTTP 日期始終以格林尼治標準時間表示,而不是本地時間,

If-None-Match

條件請求,它與 If-Match 的作用相反,僅當 If-None-Match 的欄位值與 ETag 值不一致時,可處理該請求,對于GET 和 HEAD ,僅當服務器沒有與給定資源匹配的 ETag 時,服務器將回傳 200 作為回應,對于其他方法,僅當最終現有資源的 ETag 與列出的任何值都不匹配時,才會處理請求,

當 GET 和 POST 發送的 If-None-Match與 ETag 匹配時,服務器會回傳 304

If-None-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
If-None-Match: W/"67ab43", "54ed21", "7892dd"
If-None-Match: *

有同學可能會好奇 W/ 是什么意思,這其實是 ETag 的弱匹配,關于 ETag 我們會在回應標頭中詳細講述,

If-Range

If-Range 也是條件請求,如果滿足條件(If-Range 的值和 ETag 值或者更新的日期時間一致),則會發出范圍請求,否則將會回傳全部資源,它的一般表示如下

If-Range: Wed, 21 Oct 2015 07:28:00 GMT 

If-Unmodified-Since

If-Unmodified-Since HTTP 請求標頭也是一個條件請求,服務器只有在給定日期之后沒有對其進行修改時,服務器才回傳請求資源,如果在指定日期時間后發生了更新,則以狀態碼 412 Precondition Failed 作為回應回傳,

If-Unmodified-Since: Wed, 21 Oct 2015 07:28:00 GMT 

Max-Forwards

MDN 把這個標頭置灰了,所以下面內容取自《圖解 HTTP》

Max-Forwards 一般用于 TRACE 和 OPTION 方法,發送包含 Max-Forwards 的首部欄位時,每經過一個服務器,Max-Forwards 的值就會 -1,直到 Max-Forwards 為0時回傳,Max-Forwards 是一個十進制的整數值,

Max-Forwards: 10

可以靈活使用首部欄位 Max-Forwards,針對以上問題產生的原因展開調查,由于當 Max-Forwards 欄位值為 0 時,服務器就會立即回傳回應,由此我們至少可以對以那臺服務器為終點的傳輸路徑的通信狀況有所把握,

Proxy-Authorization

Proxy-Authorization 是屬于請求與認證的范疇,我們在上面提到一個認證的 HTTP 標頭是 Authorization,不同于 Authorization 發生在客戶端 - 服務器之間;Proxy-Authorization 發生在代理服務器和客戶端之間,它表示接收到從代理服務器發來的認證時,客戶端會發送包含首部欄位 Proxy-Authorization 的請求,以告知服務器認證所需要的資訊,

Proxy-Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l

Range

Range HTTP 請求標頭指示服務器應回傳檔案指定部分的資源,可以一次請求一個 Range 來回傳多個部分,服務器會將這些資源回傳各個檔案中,如果服務器成功回傳,那么將回傳 206 回應;如果 Range 范圍無效,服務器回傳416 Range Not Satisfiable錯誤;服務器還可以忽略 Range 標頭,并且回傳 200 作為回應,

Range: bytes=200-1000, 2000-6576, 19000-

Referer

HTTP Referer 屬性是請求標頭的一部分,當瀏覽器向 web 服務器發送請求的時候,一般會帶上 Referer,告訴服務器該網頁是從哪個頁面鏈接過來的,服務器因此可以獲得一些資訊用于處理,

Referer: https://developer.mozilla.org/testpage.html

TE

首部欄位 TE 會告知服務器客戶端能夠處理回應的傳輸編碼方式及相對優先級,它和首部欄位 Accept-Encoding 的功能很相像,但是用于傳輸編碼,

TE: gzip, deflate;q=0.5

首部欄位 TE 除指定傳輸編碼之外,還可以指定伴隨 trailer 欄位的分塊傳輸編碼的方式,應用后者時,只需把 trailers 賦值給該欄位值,

TE: trailers, deflate;q=0.5

User-Agent

首部欄位 User-Agent 會將創建請求的瀏覽器和用戶代理名稱等資訊傳達給服務器,

Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0

回應標頭

剛剛我們的著重點一直放在客戶端請求,現在我們把關注點轉換一下放在服務器上,回應首部欄位是由服務器發送給客戶端回應中所包含的欄位,用于補充相應資訊等,這部分標頭也是非常多,我們先一起來看一下

  • Accept-Ranges
  • Age
  • ETag
  • Location
  • Proxy-Authenticate
  • Retry-After
  • Server
  • Vary
  • www-Authenticate

Accept-Ranges

Accept-Ranges HTTP 回應標頭,這個標頭有兩個值

  • 當服務器能夠處理客戶端發送過來的請求時,使用bytes 來指定
  • 當服務器不能處理客戶端發來的請求時,使用 none 來指定
Accept-Ranges: bytes
Accept-Ranges: none

Age

Age HTTP 回應標頭告訴客戶端源服務器在多久之前創建了回應,它的單位為,Age 標頭通常接近于0,如果是0則可能是從源服務器獲取的,如果不是表示可能是由代理服務器創建,那么 Age 的值表示的是快取后的回應再次發起認證到認證完成的時間值,代理創建回應時必須加上首部欄位 Age,一般表示如下

Age: 24

ETag

ETag 對于條件請求來說真是太重要了,因為條件請求就是根據 ETag 的值進行匹配的,下面我們就來詳細了解一下,

ETag 回應頭是特定版本的標識,它能夠使快取變得更高效并能夠節省帶寬,因為如果快取內容未發生變更,Web 服務器則不需要重新發送完整的回應,除此之外,ETag 能夠防止資源同時更新互相覆寫,

如果給定 URL 上的資源發生變更,必須生成一個新的 ETag 值,通過比較它們可以確定資源的兩個表示形式是否相同,

ETag 值有兩種,一種是強 ETag,一種是弱 ETag;

  • 強 ETag 值,無論物體發生多么細微的變化都會改變其值,一般的表示如下
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
  • 弱 ETag 值,弱 ETag 值只用于提示資源是否相同,只有資源發生了根本改變,產生差異時才會改變 ETag 值,這時,會在欄位值最開始處附加 W/,
ETag: W/"0815"

Location

Location 回應標頭表示 URL 需要重定向頁面,它僅僅與 3xx(重定向) 或 201(已創建) 狀態回應一起使用,下面是一個頁面重定向的程序

使用首部欄位 Location 可以將回應接受方引導至某個與請求 URI 位置不同的資源,

Location 和 content-Location 是不一樣的:Location 表示目標的重定向(或新創建資源的 URL),然而 Content-Location 表示發生內容協商時用于訪問資源的直接 URL,而無須進一步協商,Location 是與回應相關聯的標頭,而 Content-Location 與回傳的物體相關聯,

Location: /index.html

Proxy-Authenticate

HTTP 回應標頭 Proxy-Authenticate 會定義認證方法,應該使用身份驗證方法來訪問代理服務器后面的資源即客戶端,

它與 HTTP 客戶端和服務端之間的訪問認證行為相似,不同之處在于 Proxy-Authenticate 的認證雙方是客戶端與代理之間,它的一般表示形式如下

Proxy-Authenticate: Basic
Proxy-Authenticate: Basic realm="Access to the internal site"

Retry-After

HTTP 回應標頭 Retry-After 告知客戶端需要在多久之后重新發送請求,使用此標頭主要有如下三種情況

  • 當發送 503(服務不可用)回應時,這表示該服務預計無法使用多長時間,
  • 當發送 429(太多請求)回應時,這表示發出新請求之前要等待多長時間,
  • 當發送重定向的回應像是 301(永久移動),這表示在發出重定向請求之前要求用戶客戶端等待的最短時間,

欄位值可以指定為具體的日期時間,也可以是創建回應后所持續的秒數,例如

Retry-After: Wed, 21 Oct 2015 07:28:00 GMT
Retry-After: 120

Server

服務器標頭包含有關原始服務器用來處理請求的軟體的資訊,

應該避免使用過于冗長和詳細的 Server 值,因為它們可能會泄露內部實施細節,這可能會使攻擊者容易地發現并利用已知的安全漏洞,例如下面這種寫法

Server: Apache/2.4.1 (Unix)

Vary

Vary HTTP 回應標頭確定如何匹配請求標頭,以決定是否可以使用快取的回應,而不是從原始服務器請求一個新的回應,

Vary: User-Agent

www-Authenticate

HTTP WWW-Authenticate 回應標頭定義了應用于獲得對資源的訪問權限的身份驗證方法,WWW-Authenticate標頭與401未經授權的回應一起發送,它的一般表示形式如下

WWW-Authenticate: Basic
WWW-Authenticate: Basic realm="Access to the staging site", charset="UTF-8"

Access-Control-Allow-Origin

一個回傳的 HTTP 標頭可能會具有 Access-Control-Allow-Origin ,Access-Control-Allow-Origin 指定一個來源,它告訴瀏覽器允許該來源進行資源訪問, 否則-對于沒有憑據的請求 *通配符,告訴瀏覽器允許任何源訪問資源,例如,要允許源 https://mozilla.org 的代碼訪問資源,可以指定:

Access-Control-Allow-Origin: https://mozilla.org
Vary: Origin

如果服務器指定單個來源而不是 *通配符的話 ,則服務器還應在 Vary 回應標頭中包含 Origin ,以向客戶端指示 服務器回應將根據原始請求標頭的值而有所不同,

物體標頭

物體標頭用于HTTP請求和回應中,例如 Content-Length,Content-Language,Content-Encoding 的標頭是物體標頭,物體標頭不局限于請求標頭或者回應標頭,下面例子中,Content-Length 是一個物體標頭,但是卻出現在了請求報文中

POST /myform.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Content-Length: 128

下面就來說一下物體標頭都包含哪些

  • Allow
  • Content-Encoding
  • Content-Language
  • Content-Length
  • Content-Location
  • Content-MD5
  • Content-Range
  • Content-Type
  • Expires
  • Last-Modified

下面來分開說一下

Allow

HTTP 物體標頭 Allow 列出了資源支持的方法集合,如果服務器回應405 Method Not Allowed狀態碼以指示可以使用哪些請求方法,則必須發送此標頭,例如

Allow: GET, POST, HEAD

這段代碼表示服務器允許支持 GET 、POST 和 HEAD 方法,當服務器接收到不支持的 HTTP 方法時,會以狀態碼 405 Method Not Allowed 作為回應回傳,

Content-Encoding

我們上面講過 Accept-Encoding 是客戶端希望服務端回傳的內容編碼,但是實際上服務端回傳給客戶端的內容編碼實際上是通過 Content-Encoding 回傳的,內容編碼是指在不丟失物體資訊的前提下所進行的壓縮,主要也是四種,和 Accept-Encoding 相同,它們是 gzip、compress、deflate、identity,下面是一組請求/回應內容壓縮編碼

Accept-Encoding: gzip, deflate
Content-Encoding: gzip

Content-Language

首部欄位 Content-Language 會告知客戶端,服務器使用的自然語言是什么,它與 Accept-Language 相對,下面是一組請求/回應使用的語言型別

Content-Language: de-DE, en-CA

Content-Length

Content-Length 的物體標頭指服務器發送給客戶端的實際主體大小,以位元組為單位,

Content-Length: 3000

如上,服務器回傳給客戶端的主體大小是 3000 位元組,

Content-Location

Content-Location 可不是對應 Accept-Location,因為沒有這個標頭哈哈哈哈,實際上 Content-Location 對應的是 Location

Location 和 Content-Location 是不一樣的,Location 表示重定向的 URL,而 Content-Location 表示用于訪問資源的直接 URL,以后無需進行進一步的內容協商,Location 是與回應關聯的標頭,而 Content-Location 是與回傳的資料相關聯的標頭,如果你不好理解,看一下下面的表格

Request headerResponse header
Accept: application/json, text/json Content-Location: /documents/foo.json
Accept: application/xml, text/xml Content-Location: /documents/foo.xml
Accept: text/plain, text/* Content-Location: /documents/foo.txt

Content-MD5

客戶端會對接收的報文主體執行相同的 MD5 演算法,然后與首部欄位 Content-MD5 的欄位進行比較,

Content-MD5: e10adc3949ba59abbe56e057f20f883e

首部欄位 Content-MD5 是一串由 MD5 演算法生成的值,其目的在于檢查報文主體在傳輸程序中是否保持完整,有無被修改的情況,以及確認傳輸到達,

Content-Range

HTTP 的 Content-Range 回應標頭是針對范圍請求而設定的,回傳回應時使用首部欄位 Content-Range,能夠告知客戶端回應物體的哪部分是符合客戶端請求的,欄位以位元組為單位,它的一般表示如下

Content-Range: bytes 200-1000/67589 

上段代碼表示從所有 67589 個位元組中回傳 200-1000 個位元組的內容

Content-Type

HTTP 回應標頭 Content-Type 說明了物體內物件的媒體型別,和首部欄位 Accept 一樣使用,表示服務器能夠回應的媒體型別,

Expires

HTTP Expires 物體標頭包含 日期/時間,在該日期/時間之后,回應被認為過期;在回應時間之內被認為有效,特殊的值比如0表示過去的日期,表示資源已過期,

Expires: Wed, 21 Oct 2015 07:28:00 GMT

源服務器會將資源失效的日期或時間發送給客戶端,快取服務器在接受到 Expires 的回應后,會判斷是否把快取回傳給客戶端,

源服務器不希望快取服務器對資源快取時,最好在 Expires 欄位內寫入與首部欄位 Date 相同的時間值,但是,當首部欄位 Cache-Control 有指定 max-age 指令時,比起首部欄位 Expires,會優先處理 max-age 指令,

Last-Modified

物體欄位 Last-Modified 指明資源的最后修改時間,它用作驗證器來確定接識訓存盤的資源是否相同,它的作用不如 ETag 那么準確,它可以作為一種后備機制,包含 If-Modified-Since 或 If-Unmodified-Since 標頭的條件請求將使用此欄位,它的一般表示如下

Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT

總結

本篇文章主要介紹了 HTTP 四種標頭的基本概念,但是并沒有涵蓋全部,畢竟 HTTP 標頭內容確實太多了,以上介紹的基本都是平常作業中常用的一些概念,下一篇文章預告 HTTP 的黑科技

文章參考:

https://developer.mozilla.org/en-US/docs/Web/HTTP

http://www.tcpipguide.com/free/t_HTTPGeneralHeaders.htm

http://www.tcpipguide.com/free/t_HTTPCachingFeaturesandIssues.htm

https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching#Cache_validation

《圖解 HTTP》

https://www.w3.org/Protocols/rfc2616/rfc2616.html

https://blog.csdn.net/qq_29405933/article/details/84315254

https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/91922.html

標籤:其他

上一篇:Appium連接模擬器

下一篇:Windows修改賬戶名稱和任務管理器中服務對應的用戶名稱

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more