HTTP報文是什么樣子的?


一、報文結構

HTTP請求報文和響應報文結構基本相同,都是由以下三個部分組成:

1. 起始行:描述請求或者響應頭的基本信息

2. 頭部字段集合:使用key-value形式描述報文

3. 消息正文:實際傳輸的數據,這里不一定是純文本格式,還能是圖片、音頻、視頻等格式,在前面的文章中有學過。消息正文又稱為“實體”,但與“header”對應,很多時候就直接稱為“body”。

規定:HTTP協議必須要有heaher,可以沒有body,而且再header和正文之間要用一個空行隔開。

所以,一個完整的HTTP報文是這樣的:

起始行和頭部字段集合對應人的頭,空格對應人的脖子,消息正文對應人的身體。

            

 

 

 以上篇文章訪問服務器抓到的包看一下報文頭部信息:

 

 

 在其中我們標出了起始行和頭部字段集合,但是並沒有消息正文部分,因此我們就發現這個HTTP報文是一個大頭兒子,身子小頭部大,在很多時候header頭不宜過大,會影響閱讀。

現在我們對HTTP報文三個部分分別進行詳細學習。

1. 起始行,也被稱為請求行,它的作用是描述了客戶端要如何操作服務端資源,它由三個部分組成:

(1)請求方法:表示對資源的操作,例如Get、Post等,上面起始行中用的方法是GET

(2)請求目標:表示要訪問的URI,標識了請求方法要操作的資源,上面起始行中請求的目標是/,表示網站根目錄下的默認文件

(3)版本號:表示報文使用的HTTP版本, 上面起始行中用的版本號是HTTP/1.1

2. 狀態行,現在來介紹起始行的孿生兄弟——狀態行,表示服務器響應的狀態

 

 

(1)版本號:表示報文使用的HTTP版本

(2)狀態碼:一個三位數,表示服務器的響應結果,這里返回了304,表示瀏覽器要訪問的資源通過緩存查詢到了,因此從緩存中返回

(3)原因:作為狀態嗎的補充,更詳細的解釋數字。這里是Not Modified,表示“沒有修改”

3. 頭部字段

請求頭或者響應頭加上頭部信息字段和空格就組成了請求或者響應頭部字段。

頭部字段使用注意事項:

(1)字段名不區分大小寫,例如“Host”也可以寫成“host”,但首字母大寫的可讀性更好;
(2)字段名里不允許出現空格,可以使用連字符“-”,但不能使用下划線“_”。例如,“test-name”是合法的字段名,而“test name”“test_name”是不正確的字段名;
(3)字段名后面必須緊接着“:”,不能有空格,而“:”后的字段值前可以有多個空格;
(4)字段的順序是沒有意義的,可以任意排列不影響語義;

我們這里來簡單測試一下頭部信息正確或者錯誤會返回什么信息,可以在實驗環境里用 Telnet 連接 OpenResty 服務器試一下,手動發送 HTTP 請求頭,試驗各種正確和錯誤的情況。

首先將web服務器打開,www下的start點擊后list開啟服務器,接着win+r打開命令行窗口,輸入telnet,進入初始化頁面:

 

 

 然后輸入指令:open www.chrono.com 80連接上了服務器。

這里要注意,輸入指令后出現正在連接的提示,其實這時就已經默認連接上瀏覽器了,這時我們使用快捷鍵ctrl+],再點擊enter鍵,進入編輯頁面:

 

 

 

 

 

 接下來輸入如下信息:

GET /09-1 HTTP/1.1
Host:   www.chrono.com
 
 
GET /09-1 HTTP/1.1
Host : www.chrono.com

首先模擬第一個HTTP請求,輸入后點擊兩次enter鍵,得到相應結果,如下所示:

 

 訪問成功,說明主機地址前加入空格對HTTP請求沒有影響。

然后再來試一下第二種再host后面加入請求:

 

 訪問失敗,說明host后面不能加任何空格。驗證了上面的說法。

二、課后習題

1. 如果拼 HTTP 報文的時候,在頭字段后多加了一個 CRLF,導致出現了一個空行,會發生什么?

答:空行后面的內容被當成了報文主體
講頭字段時說“:”后的空格可以有多個,那為什么絕大多數情況下都只使用一個空格呢?

答:這時約定俗成的默認用法,按照rfc標准,空格可以是零個或多個,但一個空格已經成了約定俗成的習慣。

至此,結束。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM