目錄
一、概述:
對HTTP報文的處理就是對首部字段的處理,理解了頭部字段就是理解了HTTP。
二、介紹一些常用字段:
- Host:請求字段,給出了接收請求的服務器的主機名和端口號;
- User-Agent:請求字段,將發起請求的應用程序名稱告知服務器;
- Date:通用字段,通常出現在響應報文裏;
- Server:響應字段,服務器應用程序的名稱和版本;
- Content-Length:報文裏body的長度;
三、傳輸實體的一些屬性:
1、傳輸的數據類型:
MIME type:被傳輸的基本媒體類型;
相關字段:Accept, Content-Type;
常用類型:
text (純文本類型):
- text/html:html類型
- text/plain:純文本類型
- text/css:樣式表
image (圖像文件):
- image/gif: gif格式的圖像
- image/jpeg:jpeg格式的圖像
- image/png:png格式的圖像
application(數據格式不固定,可能是文本也可能是二進制,必須由上層應用程序來解釋):
- application/json:json格式的數據
- application/javascript:js文件
- application/pdf:pdf格式的文件
- application/octet-stream:不透明的二進制數據
注意:Content-Type 說明的是原始實體的媒體類型,即未被編碼之前的實體主體類型。
2、實體的語言類型和編碼:
相關字段:Accept-Language,Content-Language
語言類型(人類使用的自然語言):
- en : 英語
- en-US : 美式英語
- en-GB : 英式英語
- zh-CN : 常用漢語
編碼(字符編碼,用於處理文字):
- Unicode
- UTF-8
3、編碼類型:
爲了節約帶寬,常會將大型數據進行壓縮傳輸。
相關字段:Content-Encoding,Accept-Encoding
常用壓縮格式:
- gzip: GUN zip 壓縮格式
- deflate: zlib(deflate)
- br:專爲HTTP優化的新壓縮算法
四、文件類型和壓縮編碼字段:
兩個Accept 和 Content 字段
Accept:客戶端表示要接受的數據相關的屬性;
Content: 服務端表示傳輸給客戶端的數據類型;
1、Accept:
標記的是客戶端可理解的MIME type,可以用","做分隔符,
例如:
Accept: text/html,application/xml,image/webp,image/png
表示可以接受:HTML、xml的文件,還有webp和png的圖片。
2、Content-Type:
服務器在響應頭裏告知客戶端數據的真實類型。
例如:
Content-Type:text/html
Content-Type:image/png
3、Accept-Encoding:
標記客戶端支持的壓縮格式,格式同Accept字段。
4、Content-Encoding:
服務端告知客戶端實體數據實際的壓縮編碼類型。
注意:在客戶端POST請求中,Accept都爲Content字段
五、語言類型和編碼字段:
兩個Accept,一個Content,一個charset=”xxx“
1、Accept-Language:
客戶端可理解的自然語言。
例如:
Accept-Language: zh-CN,zh-en
2、Content-Language:
服務端告知客戶端實體數據的實際語言。
例如:
Content-Language:zh-CN
3、Accept-Charset:
客戶端接收的編碼類型
例如:
Accept-Charset:gbk,utf-8
4、charset="xxx":
注意:響應字段必須爲:Content-Type中用charset=”xxx“表示。
例如:
Content-Type : text/html;charset=utf-
六、q表示的優先級:
HTTP中,可在Accept,Accept-Encoding,Accept-Language 等請求字段加一個 q (質量)參數說明編碼的優先級。
- q 從0.0 到 1.0
- 0.0:表示客戶端不想接受所說明的編碼
- 1.0:表示客戶端最想接受的編碼類型。
例如:
Accept:text/html,application/xml;q=0.9,*/*;q=0.8
七、Vary協商字段:
響應報文,記錄服務器在內容時參考的請求字段:
例如:
Vary:Accept-Encoding,User-Agent,Accept
表示服務器依據了Accept-Encoding,User-Agent和Accept這三個字段,然後決定了發回的響應報文。
八、HTTP傳輸大文件的方法和相關字段:
1、壓縮:
見前文。
2、分塊傳輸:
將大文件拆開分解成多個小塊
相關字段:Transfer-Encoding
告知接收方爲了可靠地傳輸報文,已經對其進行了編碼。
例如:
Transfer-Encoding:chunked
表示報文中地body是分塊逐步發送。
注意:Transfer-Encoding 和 Content-Length 是互斥地(不能同時出現)。
3、範圍請求:
表示可以獲取一個文件中的某一些分段的數據。
相關字段:
Range:客戶端字段,屬性:bytes=x-y
(x-y表示數據的範圍)
Accept-Ranges:bytes
對於服務器來說,範圍請求的功能不是必須的,所以服務器需要在響應報文中包含此字段告知客戶端。
當服務器接收到Rnge字段後,它的動作是:
- 檢查是否越界;
- 若範圍正確,就根據Range中的屬性計算偏移段,返回狀態碼:”206 Partial Content“
- 服務器裏添加一個響應頭字段:Content-Range(告知片段的實際偏移量和資源的總量),格式:bytes x-y/length
- 通過TCP將數據發送給客戶端
4、多段數據傳輸:
在一次傳輸中,可以傳輸多段分段的數據。
相關字段:
請求:
Range字段,用逗號分隔;
例如:
Range: bytes=0-9, 20-29
響應:
Content-Type字段
屬性:
multipart/byteranges:表示報文的 body 是由多段字節序列組成的
boundary: 給出段之間的分隔標記
例如:
Content-Type: multipart/byteranges; boundary=00000000001
“- -00000000001”就是多段的分隔符
參考資料:
1.《HTTP權威指南》
2.極客時間專欄-透視HTTP協議