HTTP基於客戶機-伺服器體系結構模型和無狀態請求/響應協議,該協議通過可靠的TCP/IP連接交換消息來運行。
HTTP「客戶端」是爲了發送一個或多個HTTP請求消息而建立到伺服器的連接的程序(Web瀏覽器或任何其他客戶端)。HTTP「伺服器」是一個程序(通常是Apache web伺服器或Internet信息服務IIS等web伺服器),它接受連接,以便通過發送HTTP響應消息來服務HTTP請求。
HTTP使用統一資源標識符(Uniform Resource Identifier,URI)來標識給定的資源並建立連接。建立連接後,將以格式傳遞HTTP消息
HTTP-message = <Request> | <Response> ; HTTP/1.1 messages
HTTP請求和HTTP響應使用RFC 822的通用消息格式來傳輸所需的數據。此通用消息格式由以下四項組成。
- A Start-line
- Zero or more header fields followed by CRLF
- An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
- Optionally a message-body
在下面的部分中,我們將解釋HTTP消息中使用的每個實體。
Message Start-Line
起始行將具有以下通用語法:
start-line = Request-Line | Status-Line
在分別討論HTTP請求和HTTP響應消息時,我們將討論請求行和狀態行。現在,讓我們看看請求和響應情況下的起始行示例:
GET /hello.htm HTTP/1.1 (This is Request-Line sent by the client) HTTP/1.1 200 OK (This is Status-Line sent by the server)
Header Fields
HTTP頭欄位提供有關請求或響應或消息正文中發送的對象的必需信息。有四種類型的HTTP消息頭:
常規頭:這些頭欄位對請求和響應消息都具有通用性。
請求頭:這些頭欄位僅適用於請求消息。
響應頭:這些頭欄位僅適用於響應消息。
實體頭:這些頭欄位定義實體體的元信息,如果沒有實體,則定義請求標識的資源的元信息。
上面提到的所有標題都遵循相同的通用格式,每個標題欄位由名稱、冒號(:)和欄位值組成,如下所示:
message-header = field-name ":" [ field-value ]
以下是各種標題欄位的示例:
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 Host: www.example.com Accept-Language: en, mi Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT ETag: "34aa387-d-1568eb00" Accept-Ranges: bytes Content-Length: 51 Vary: Accept-Encoding Content-Type: text/plain
Message Body
消息體部分對於HTTP消息是可選的,但是如果它是可用的,那麼它用於攜帶與請求或響應相關聯的實體體。如果實體體是關聯的,則通常內容類型和內容長度標題行指定關聯實體的性質。
消息體是承載來自伺服器的實際HTTP請求數據(包括表單數據和上傳數據等)和HTTP響應數據(包括文件、圖像等)的消息體。以下是消息正文的簡單內容:
<html> <body> <h1>Hello, World!</h1> </body> </html>
接下來的兩章將使用上面解釋的概念來準備HTTP請求和HTTP響應。