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應用程式之間傳送的資料塊,這些資料塊以文字形式存在,以描述了報文的內容及含義的元資...