http學習 http報文的格式

2022-09-20 17:18:06 字數 2979 閱讀 4091

http的核心部分是http傳輸的報文內容

http協議是乙個「純文字」的協議,所以頭資料都是 ascii 碼的文字。

ascii 碼, 乙個位元組表示乙個字母,所以 http 報文會比較大;而那些二進位制協議,可以利用乙個位元組的 8 個位元表示更多資訊,這些資訊通常是協議規定,所以需要對應程式進行解析。相比較而言,可以很容易地用肉眼閱讀,不用借助程式解析也能夠看懂。4

http 協議的請求報文和響應報文的結構基本相同,由三大部分組成:

這其中前兩部分起始行和頭部字段經常又合稱為「請求頭」或「響應頭」,訊息正文又稱為「實體」,但與「header」對應,很多時候就直接稱為「body」。

http 協議規定報文必須有 header,但可以沒有 body,而且在 header 之後必須要有乙個「空行」,也就是「crlf」,十六進製制的「0d0a」。

所以,乙個完整的 http 報文就像是下圖的這個樣子,注意在 header 和 body 之間有乙個「空行」。

請求行(request line),它簡要地描述了客戶端想要如何操作伺服器端的資源。

請求行由三部分構成:

這三個部分通常使用空格(space)來分隔,最後要用 crlf 換行表示結束。

例如:

get / http/1.1
在這個請求行裡,「get」是請求方法,「/」是請求目標,「http/1.1」是版本號,把這三部分連起來,意思就是「伺服器你好,我想獲取**根目錄下的預設檔案,我用的協議版本號是 1.1,請不要用 1.0 或者 2.0 回覆我。」

「狀態行」(status line),意思是伺服器響應的狀態。

狀態行由三部分構成:

版本號:表示報文使用的 http 協議版本;

狀態碼:乙個三位數,用**的形式表示處理的結果,比如 200 是成功,500 是伺服器錯誤;

原因:作為數字狀態碼補充,是更詳細的解釋文字,幫助人理解原因。

例如

http/1.1 200 ok
意思就是:「瀏覽器你好,我已經處理完了你的請求,這個報文使用的協議版本號是 1.1,狀態碼是 200,一切 ok。」

請求行或狀態行再加上頭部字段集合就構成了 http 報文裡完整的請求頭或響應頭,如圖: 

請求頭和響應頭的結構是基本一樣的,唯一的區別是起始行,所以把請求頭和響應頭里的字段放在一起介紹。

頭部欄位是 key-value 的形式,key 和 value 之間用「:」分隔,最後用 crlf 換行表示字段結束。

比如在「host: 127.0.0.1」這一行裡 key 就是「host」,value 就是「127.0.0.1」。

http 頭欄位非常靈活,不僅可以使用標準裡的 host、connection 等已有頭,也可以任意新增自定義頭,這就給 http 協議帶來了無限的擴充套件可能。

不過使用頭欄位需要注意下面幾點:

常用頭欄位

http 協議規定了非常多的頭部字段,實現各種各樣的功能,但基本上可以分為四大類:

對 http 報文的解析和處理實際上主要就是對頭欄位的處理,理解了頭字段也就理解了 http 報文。

屬於請求字段,只能出現在請求頭里,它同時也是唯一乙個 http/1.1 規範裡要求必須出現的字段,也就是說,如果請求頭里沒有 host,那這就是乙個錯誤的報文。

host 字段告訴伺服器這個請求應該由哪個主機來處理,當一台計算機上託管了多個虛擬主機的時候,伺服器端就需要用 host 欄位來選擇,有點像是乙個簡單的「路由重定向」。

請求字段,只出現在請求頭里。它使用乙個字串來描述發起 http 請求的客戶端,伺服器可以依據它來返回最合適此瀏覽器顯示的頁面。

是乙個通用字段,但通常出現在響應頭里,表示 http 報文建立的時間,客戶端可以使用這個時間再搭配其他字段決定快取策略。

響應字段,只能出現在響應頭里。它告訴客戶端當前正在提供 web 服務的軟體名稱和版本號。

它表示報文裡 body 的長度,也就是請求頭或響應頭空行後面資料的長度。伺服器看到這個字段,就知道了後續有多少資料,可以直接接收。如果沒有這個字段,那麼 body 就是不定長的,需要使用 chunked 方式分段傳輸。

http 報文結構就像是「大頭兒子」,由「起始行 + 頭部 + 空行 + 實體」組成,簡單地說就是「header+body」;

http 報文可以沒有 body,但必須要有 header,而且 header 後也必須要有空行,形象地說就是「大頭」必須要帶著「脖子」;

請求頭由「請求行 + 頭部字段」構成,響應頭由「狀態行 + 頭部字段」構成;

請求行有三部分:請求方法,請求目標和版本號;

狀態行也有三部分:版本號,狀態碼和原因字串;

頭部欄位是 key-value 的形式,用「:」分隔,不區分大小寫,順序任意,除了規定的標準頭,也可以任意新增自定義字段,實現功能擴充套件;

http/1.1 裡唯一要求必須提供的頭字段是 host,它必須出現在請求頭里,標記虛擬主機名。

1、如果拼 http 報文的時候,在頭字段後多加了乙個 crlf,導致出現了乙個空行,會發生什麼?

答:在header 下面第乙個空行以後都會被當作body 體

2、講頭字段時說「:」後的空格可以有多個,那為什麼絕大多數情況下都只使用乙個空格呢?

答:頭部多乙個空格就會多乙個傳輸的位元組,去掉無用的資訊,保證傳輸的頭部位元組數盡量小

http報文格式

請求 header param1 header value1 crlf 請求首部 可以使用通用首部,請求首部,實體首部,擴充套件首部 header param2 header value2 crlf header paramn header valuen crlf crlf request cont...

http報文格式

http使用統一資源識別符號 uri 來傳輸資料和建立連線。url 統一資源定位符 是一種特殊種類的uri,包含了用於查詢的資源的足夠的資訊,我們一般常用的就是url,而乙個完整的url包含下面幾部分 1.協議部分 該url的協議部分為http 表示網頁用的是http協議,後面的 為分隔符 2.網域...

HTTP學習筆記 HTTP報文

如果說http是網際網路的信使,那麼http報文就是運送的包裹。所有的http程式都是通過互相傳送報文來完成工作的。本文將介紹http報文的流動方式,報文的組成部分,請求和響應報文之間的區別等。http報文是在http應用程式之間傳送的資料塊,這些資料塊以文字形式存在,以描述了報文的內容及含義的元資...