HTTP協定之HTTP消息(HTTP Message)
by:授客 QQ:1033553122
1. 消息類型(Message Type)
HTTP messages包含從用戶端到伺服器的請求和伺服器到用戶端的響應
HTTP-message = Request | Response;
Request和Response都采用通用消息格式來傳輸實體
兩種類型都包含一起始行(start-line),0或更多個header域, 一暗示header域結束的空行,可能還有一個消息主體
generic-message = start-line
message-header
空行
[ message-body ]
1)起始行(start-line)
start-line= Request-Line | Status-Line
2)消息頭(Message Headers)
HTTP頭(HTTP header), 包含通用頭(general-header),請求頭(request-header), 響應頭(response-header)和實體頭(entity-header)
消息頭書寫形式
message-header = field-name : [ field-value ]
header域名(field-name)大小寫敏感
通用頭域(General Header Fields)
通用頭域為請求和響應消息都可使用,傳輸實體不能使用的頭域
general-header = Cache-Control
| Connection
| Date
| Pragma
| Trailer
| Transfer-Encoding
| Upgrade
| Via
| Warning
不被識别的頭域被視為實體頭域
3)消息主體(Message Body)
消息主體(如果有的話)用于運送與請求或響應相關的實體主體(entity-body)
格式
message-body = entity-body
|
也就是說,僅在通過傳輸編碼對進行編碼後的實體主體才與消息主體不同,否則消息主體和實體主體是相同的。
4)消息長度(Message Length)
消息長度指的是消息主體的長度;
2.
請求(Request)
1)格式
Request = Request-Line
general-header | request-header | entity-header
空行
[ message-body ]
如圖,通路http://ishouke.sohu.blog.com網址,發送的請求

2)請求行(Request-Line)
Request-Line =
Method Request-URI HTTP-Version
說明:
1) Method
Method = OPTION | GET | HEAD|
POST | PUT | DELETE | TRACE |CONNECT
OPTION--請求一些選項的資訊
GET--請求由Request-URI所辨別的資訊
HEADE--請求讀取由URL所辨別的資訊的首部
POST--給伺服器添加資訊(例如,注釋)
PUT--在指明的URI下存儲一個文檔
DELETE--删除指明的URL所标志的資源
TRACE--用來進行回環測試的請求封包
CONNECT--用于代理伺服器
(方法的說明待補充)
3)Request-URI
統一資源辨別符(Uniform Resource
Identifier),辨別了方法所請求的資源。
Request-URI = "*" | absoluteURI |
abs_path | authority
*:代表不是請求特定資源,而是請求伺服器本身,僅當method不是應用于資源時才可用.例如
OPTIONS * HTTP/1.1
absoluteURI:當向代理伺服器發起請求時,必須使用絕對URI(absoluteURI)。代理伺服器轉發請求或通過有效緩存讀取并傳回響應。注意,代理伺服器可能會把請求轉發給另一個代理伺服器或直接轉發給由絕對URI指定的伺服器。
為了避免循環請求,代理必須能識别所有伺服器名字,包擴任意别名,本地變量和ip位址
請求行(Request-Line)的另一個例子:
GET http://www.w3.org/pub/WWW/TheProject.html
HTTP/1.1
abs_path:絕對路徑
authority:僅用于CONNECT方法
Request-URI最常見的形式為用于辨別一個在原始伺服器或網關上的資源.在這種情況下,Request-URI必須使用絕對URI,并且URI的網絡位址必須包含在HOST header域中被發送
例如,用戶端想直接從原始伺服器接收上述資源TheProject.html,将建立一個通往主機“www.w3.org”的80端口的TCP連接配接,并發送以下請求行
GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org
行後接請求的剩餘部分。
注意:絕對路徑不能為空,如果URI中啥都沒給,必須以“/”(伺服器根目錄)的形式給出。
代理伺服器在轉發請求時,不能重寫從Request-URI中接收的絕對路徑“abs_path”
4)請求頭域(Request Header
Fields)
Request Header Fields允許用戶端傳遞額外關于請求和用戶端自身的資訊給伺服器
request-header = Accept
| Accept-Charset
| Accept-Encoding
| Accept-Language
| Authorization
| Expect
| From
|
Host
| If-Match
| If-Modified-Since
| If-None-Match
| If-Range
| If-Unmodified-Since
| Max-Forwards
| Proxy-Authorization
| Range
| Referer
| TE
| User-Agent
3.
響應(Response)
Response= Status-Line
general-header |
response-header |
entity-header
[ message-body ]
如圖,通路http://ishouke.sohu.blog.com網址,發送請求後接收到的響應
2)狀态行(Status-Line)
Status-Line = HTTP-Version
Status-Code Reason-Phrase
1)Status-Code和Reason-Phrase
Status-Code:3個數字的整數
Reason-Phrase:對Status-Code簡短的文本描述
Status-Code的第一個數字定義了響應的類型:
1xx:
通知資訊的 -
請求收到,繼續處理
2xx:
成功-
操作被成功,了解和接受
3xx:
重定向 -
為了完成請求采取進一步的操作
4xx:
用戶端錯誤-
請求包含無法實作或者包含文法錯誤
5xx:
伺服器錯誤 -
伺服器無法完成合法的請求
Status-Code
=
"100" ;
Continue
| "101" ;
Switching Protocols
| "200" ;
OK
| "201" ;
Created
| "202" ;
Accepted
| "203" ;
Non-Authoritative Information
| "204" ;
No Content
| "205" ;
Reset Content
| "206" ;
Partial Content
| "300" ;
Multiple Choices
| "301" ;
Moved Permanently
| "302" ;
Found
| "303" ;
See Other
| "304" ;
Not Modified
| "305" ;
Use Proxy
| "307" ;
Temporary Redirect
| "400" ;
Bad Request
| "401" ;
Unauthorized
| "402" ;
Payment Required
| "403" ;
Forbidden
| "404" ;
Not Found
| "405" ;
Method Not Allowed
| "406" ;
Not Acceptable
| "407" ;
Proxy Authentication Required
| "408" ;
Request Time-out
| "409" ;
Conflict
| "410" ;
Gone
| "411" ;
Length Required
| "412" ;
Precondition Failed
| "413" ;
Request Entity Too Large
| "414" ;
Request-URI Too Large
| "415" ;
Unsupported Media Type
| "416" ;
Requested range not satisfiable
| "417" ;
Expectation Failed
| "500" ;
Internal Server Error
| "501" ;
Not Implemented
| "502" ;
Bad Gateway
| "503" ;
Service Unavailable
| "504" ;
Gateway Time-out
| "505" ;
HTTP Version not supported
| extension-code
extension-code = 3DIGIT
Reason-Phrase = *
3)響應頭域(Response Header
Fields)
response-header
fields允許伺服器傳遞不能放在狀态行(Status-Line)的關于響應的額外資訊.這些頭域給出了關于伺服器和更多關于進一步獲得由Request-URI辨別的資源
response-header =
Accept-Ranges
| Age
| ETag
| Location
| Proxy-Authenticate
| Retry-After
| Server
| Vary
| WWW-Authenticate
無法識别的header域可以視為entity-header域
4.
實體(Entity)
Request和Response消息如果沒有被請求方法或請求狀态碼限制,可傳送一個實體
實體有實體頭域(entity-header
fields)和實體主體(entity-body),雖然有些response僅包含實體頭域entity-header
1)實體頭域(Entity Header
實體頭域定義了關于實體主體的維護資訊,或者是關于請求辨別的資源,如果沒有主體的話.一些維護資訊是可選的,一些是必須的.
entity-header = Allow
| Content-Encoding
| Content-Language
| Content-Length
| Content-Location
| Content-MD5
|
Content-Range
| Content-Type
| Expires
| Last-Modified
2)實體主體(Entity Body)