文章作者:Tyan
博客:noahsnail.com | CSDN | 簡書
1. HTTP報文
HTTP報文是由一行一行的簡單字符串組成的。HTTP報文都是純文本,不是二進制代碼,所以人們可以很方便地對其進行讀寫。下圖是一個例子:
從Web客戶端發往Web服務器的HTTP報文稱為請求報文(request message)。從服務器發往客戶端的報文稱為響應報文(response message),此外沒有其他類型的HTTP報文。HTTP請求和響應報文的格式很類似。
HTTP 報文包括以下三個部分:
起始行
報文的第一行就是起始行,在請求報文中用來說明要做些什么,在響應報文中說明出現了什么情況。首部字段
起始行后面有零個或多個首部字段。每個首部字段都包含一個名字和一個值,為了便于解析,兩者之間用冒號(:)來分隔。首部以一個空行結束。添加一個首部字段和添加新行一樣簡單。主體
空行之后就是可選的報文主體了,其中包含了所有類型的數據。請求主體中包括 了要發送給 Web 服務器的數據;響應主體中裝載了要返回給客戶端的數據。起始行和首部都是文本形式且都是結構化的,而主體則不同,主體中可以包含任意 的二進制數據(比如圖片、視頻、音軌、軟件程序)。當然,主體中也可以包含 文本。
2. HTTP請求報文
GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: BAIDUID=4082549DEE5E64678FC46642E185D98C:FG=1; BIDUPSID=4082549DEE5E64678FC46642E185D98C; PSTM=1472215668; MCITY=-%3A; BDSFRCVID=pSFsJeCCxG3C4A5iySIze8tzxQmzvLxREDct3J; H_BDCLCKID_SF=tR38LRu8KJjEe-Kk-PnVeUFLQlbZKxJmMgkeWlbMQnTR85CGXUQVWx4_Qb6gXU-L5nT9bDOFfDL2bKKmjTL3K4LOMq5-5b0X-K5L3JD8bnjoHRjvq4bohjPy5G7eBtQm05bxohOIHRoE8M0m2ROkMtutKJjQW-nQ5HbbhCLbWDF5MIDGj50WenLHMfnXetJQ2C7WsJceHJOoDDvx0Uj5y4LdLp7xJMtJ0RT0XxOYMJKWf-c90tc05xAb04oR5b0eWJQ2QJ8BtCtKhD3P; pgv_pvi=7232093184; pgv_si=s9982430208; BDRCVFR[IzI_eUGSZP3]=mbxnW11j9Dfmh7GuZR8mvqV; BD_CK_SAM=1; PSINO=5; BD_HOME=0; H_PS_PSSID=1421_17946_21125_18559_21455_21419_21394_21378_21191_21398; BD_UPN=123253; BD_LAST_QID=17716714193052416912
解釋:
GET / HTTP/1.1,請求起始行
GET,請求方法
/,請求URL,命名了所請求資源,或者URL路徑組件的完整URL。如果直接與服務器進行對話,只要URL的路徑組件是資源的絕對路徑,通常就不會有什么問題——服務器可以假定自己是URL的主機/端口。
HTTP/1.1,請求采用的協議及版本號
Host,請求的服務器
Connection,連接方式
Upgrade-Insecure-Requests,
User-Agent,將發起請求的應用程序名稱告知服務器
Accept,請求首部,是請求報文特有的。它們為服務器提供了一些額外信息,比如客戶端希望接收什么類型的數據。例子中接收html,xhtml,xml等數據。
Accept-Encoding,告訴服務器能夠發送哪些編碼方式
Accept-Language,告訴服務器能夠發送哪些語言
Cookie,Cookie信息,客戶端用它向服務器傳送一個令牌——它并不是真正的安全首部,但確實隱含了安全功能
3. HTTP響應報文
$ curl -I www.baidu.com
HTTP/1.1 200 OK
Server: bfe/1.0.8.18
Date: Thu, 03 Nov 2016 08:30:43 GMT
Content-Type: text/html
Content-Length: 277
Last-Modified: Mon, 13 Jun 2016 02:50:03 GMT
Connection: Keep-Alive
ETag: "575e1f5b-115"
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Pragma: no-cache
Accept-Ranges: bytes
解釋:
HTTP/1.1 200 OK,響應狀態行
HTTP/1.1,訪問采用的協議為HTTP,版本為1.1
200,HTTP狀態碼,表示文檔正確返回
OK,一個描述性的原因短語
Server,服務器應用程序軟件的名稱和版本
Date,服務器產生響應的日期
Content-Type,實體中所承載對象的類型,例子中響應實體的主體是一個html文本。
Content-Length,所傳送實體主體的長度或大小,例子中響應實體的主體包含了277字節的數據
Last-Modified,資源的最后修改日期時間
Connection,連接方式,close或keep-alive
ETag,資源的匹配信息
Cache-Control,控制緩存的行為
Pragma,報文指令
Accept-Ranges,是否接受字節范圍請求