前面說到,HTTP事務是由HTTP報文的格式化數據塊進行通信的,本文就詳細介紹一下HTTP報文的組成和結構。
HTTP報文是由一行一行的簡單字符串組成的。由於HTTP報文都是純文本,所以你可以很方便的對其進行讀寫。
下圖顯示一個簡單的HTTP事務的報文:
從客戶端發往服務器的報文叫請求報文(request message),服務器收到請求報文后,作為響應發往客戶端的報文稱為響應報文(response message),請求報文和響應報文的格式都是一樣的,HTTP報文格式主要包含三個部分:
起始行:
請求報文的起始行說明這個HTTP請求的需求【如上圖中的:GET /index_page.html HTTP/1.0 說明:要向服務器通過GET方法獲取 /index_page.html 資源,HTTP協議版本為HTTP/1.0】
響應報文的起始行 說明服務器的響應情況【如上圖中的:HTTP/1.0 200 OK,說明服務器的響應情況為 200 OK】
首部字段:
在HTTP的報文起始行后面往往會有多個首部字段(非必須),這些字段都以 Key:value的格式發出,首部以一個空行結束(空行后面就是主體,也可能沒有主體)
如上圖中的請求報文中的首部字段有:
Accept:text/html,application/xhtml+xml,application/xml;
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Cookie:balabala....
Host:www.myweb.com
響應報文中的首部字段有:
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Thu, 29 Mar 2018 08:20:03 GMT
Server:openresty
Transfer-Encoding:chunked
主體:
報文主體就是報文的主要數據部分,它可以是任意數據類型的數據。比如請求主體中包含了要發給服務器的數據,響應主體中裝載了要返回給客戶端的數據。
起始行和首部都是文本化且具有特定結構的,主體則可包含所有二進制數據和文本。
下面介紹一個HTTP報文實例:
這個是Google Chrome 開發者模式下的HTTP請求抓包數據,下面解釋這個報文:
HTTP報文便於閱讀,但不好的地方在於解析起來不太方便。
HTTP /1.1 首部字段說明:
HTTP首部字段有很多,這里列舉說明一下HTTP/1.1 的首部字段:
通用首部字段
請求首部字段:
響應首部字段 :
實體首部字段:
在非HTTP/1.1中使用到的首部字段還有 Cookie、 Set-Cookie 和 Content-Disposition 等在其他 RFC 中定義的首部字段的使用頻率也很高。
這些非正式的首部字段統一歸納在 RFC4229 HTTP Header Field Registrations 中。
參考:
《HTTP權威指南》