7 HTTP 的報文
目錄
1 報文結(jié)構(gòu)
TCP的報文
- TCP頭部數(shù)據(jù):20字節(jié),發(fā)送方的端口號、接收方的端口號、包序號、標(biāo)志位。
- 實際傳輸?shù)臄?shù)據(jù):通常大小是 1460 字節(jié)
HTTP協(xié)議的報文
起始行+頭部字段集合+消息正文
- 起始行(strat line):描述請求或響應(yīng)的基本信息
- 頭部字段集合(header):使用 key-value 形式更詳細地說明報文,前面這兩部分合稱請求頭或響應(yīng)頭
- 消息正文(entity):實際傳輸?shù)臄?shù)據(jù),二進制數(shù)據(jù),也叫實體或body
報文必須有 header,但是可以沒有body(如 get 請求報文),在 header 之后必須要有一個“空行”,即“CRLF”,十六進制的“0D0A”。
各個web服務(wù)器都不允許過大的請求頭,因為頭部太大會占用太多服務(wù)器資源,影響運行效率。

2 請求行:request line
請求方法+請求目標(biāo)+版本號,空格隔開,CRLF 換行結(jié)束。
- 請求方法:是一個動詞,如 get/post ,表示對資源的操作
- 請求目標(biāo):通常是一個 URI,標(biāo)記了 請求方法要操作的資源
- 版本號:表示報文使用的HTTP協(xié)議版本
3 狀態(tài)行:status line
版本號+狀態(tài)碼+原因
- 版本號:表示報文使用的 HTTP 協(xié)議版本
- 狀態(tài)碼:三位數(shù),如 200 是成功,500 是服務(wù)器錯誤
- 原因:作為數(shù)字狀態(tài)碼補充,是更為詳細的解釋文字,幫助人理解原因
- 以上三部分空格分隔,CRLF 換行結(jié)束
![image]()
4 頭部字段
- 請求行或狀態(tài)行再加上頭部字段集合就構(gòu)成了 HTTP 報文里完整的請求頭 或 響應(yīng)頭。
- 頭部字段 是 key-value 的形式,key和value之間用 “:” 分隔,最后用 CRLF 換行表示字段結(jié)束
- HTTP 頭部支持自定義
![image]()
![image]()
使用頭字段的注意點:
- 字段名 不區(qū)分大小寫
- 字段名 不允許出現(xiàn)空格
- 字段名后面必須緊接著 “:”,不能有空格,而 “:” 后的字段值前可以有多個空格
- 字段的順序是沒有意義的,可以任意排列不影響語義
- 字段原則上不能重復(fù),除非這個字段本身的語義允許
5 常用頭字段
種類很多,基本分為 四大類:
- 通用字段:在請求頭和響應(yīng)頭里都可以出現(xiàn)
- 請求字段:只能出現(xiàn)在請求頭里,補充說明請求信息或額外條件
- 響應(yīng)字段:僅能出現(xiàn)在響應(yīng)頭里,補充說明響應(yīng)報文的信息
- 實體字段:實際上屬于通用字段,但是專門描述 body 的額外信息。
對報文的解析實際上就是對頭字段的處理。
基本的頭信息
1. Host 字段(必須)
- 請求字段,只能出現(xiàn)在請求頭。
- 唯一一個 HTTP/1.1 規(guī)范里要求必須出現(xiàn)的字段,如果沒有就是一個錯誤報文。
- Host 字段告訴請求應(yīng)該由哪個主機來處理,當(dāng)一臺計算機上托管了多個虛擬主機,服務(wù)端就需要用 Host 字段來選擇。
- Host 字段可以區(qū)分IP相同但是域名不同的網(wǎng)站。
2. Uesr-Agent
- 請求字段,只能出現(xiàn)在請求頭。
- 使用一個字符串來描述發(fā)起HTTP請求的客戶端,服務(wù)器可以依據(jù)它來返回最合適此瀏覽器顯示的頁面。
- 實際上每個瀏覽器自稱 “chrome”,“Mozilla” 等,是這個字段越來越長卻毫無意義。
3. Date 字段
- 通用字段,通常出現(xiàn)在響應(yīng)頭里。
- 表示HTTP 報文的創(chuàng)建時間。
- 和其他字段搭配絕對緩存策略。
4. Server 字段
- 響應(yīng)字段,只能出現(xiàn)在響應(yīng)頭里。
- 告訴客戶端當(dāng)前正在提供Web服務(wù)的軟件名稱和版本號。
- 非必須,容易暴露信息給外界被黑客攻擊。
- 一般會給出一個無關(guān)緊要的描述信息。
基本的實體字段
1. Content-length
- 表示報文里body的字段長度,也就是請求頭或響應(yīng)頭空行后數(shù)據(jù)的長度。
- 服務(wù)器看到這個字段就知道后續(xù)有多少數(shù)據(jù),可以直接接受。
- 沒有這個字段,表示 body 是不定長的,需要使用 chunked 方式分段傳輸。



浙公網(wǎng)安備 33010602011771號