三、HTTP 消息

我们知道HTTP是基于客户端-服务区架构模型,并且是通过可靠的TCP/IP连接操作交换信息的无状态请求/响应的协议。一个HTTP“客户端”是一个程序,他可以是浏览器或者其他客户端,它主要用于建立和服务端的连接,然后发送信息。那一个Http“服务器”同样也是一个程序,通常是一个web服务器,比如Apache Web Server 或者 Internet Infoformation Services(IIS)等等,它接受连接然后处理HTTP请求并发送HTTP响应信息。

HTTP使用统一资源标识符(URI)来标识给定的资源并建立连接。 建立连接后,HTTP信息的格式与Internet邮件[RFC5322]和多用途Internet邮件扩展(MIME)[RFC2045]所使用的格式相同。 这些消息包括从客户端到服务器的请求以及从服务器到客户端的响应,它们将具有以下格式:

 HTTP-message   = <Request> | <Response> ; HTTP/1.1 messages

HTTP请求和HTTP响应使用RFC 822的通用消息格式传输所需的数据。 该通用消息格式由以下四个项目组成。

  • 一个起始行
  • 零个或多个标题字段后跟CRLF(回车)
  • 空行 (即在CRLF之前没有任何行)指示标题字段的结尾
  • 消息体(可以没有)

消息起始行

起始行遵循以下的语法:

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消息头有四种类型:

  • General-header: 这些标题字段对请求和响应消息都具有一般适用性。

  • Request-header: 这些头域仅适用于请求消息。

  • Response-header: 这些头域仅适用于响应消息。

  • Entity-header: 这些标题字段定义关于实体的元信息,如果没有正文,则定义关于请求标识的资源。

所有上述头域都遵循相同的通用格式,每个头域字段由一个名称,后跟冒号(:)和字段值组成,如下所示:

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消息是可选的,但是如果它是可用的,则它用于携带与请求或响应相关联的实体。 如果实体主体相关联,则通常Content-Type和Content-Length头部行指定与之关联的主体的性质。

消息体是携带实际的HTTP请求数据(包括表单数据和上传的)消息体以及来自服务器的HTTP响应数据(包括文件,图像等)。 下面显示的是消息体的简单内容:

<html>
   <body>
   
      <h1>Hello, World!</h1>
   
   </body>
</html>