4.3.2 HTTP报文

4.3.2 HTTP报文

HTTP协议包含了对HTTP报文格式的定义。HTTP报文有两种:从客户向服务器发送的请求报文和从服务器到客户的响应报文。请求报文是客户端依据HTTP协议规定格式发送的请求消息,该消息描述了客户端想要获取的资源或包含了向服务器提供的信息。响应报文是在服务器读取、解释了请求报文后,采取相应的动作处理请求从而产生的响应消息。它指示了请求是否成功,若成功则会包含请求的资源。图4-4给出了请求报文和响应报文的例子。

图4-4 HTTP报文示例

下面将分别对HTTP请求报文和响应报文进行介绍。

1.请求报文

请求报文包含3个部分:请求行、首部行和实体主体。报文结构如图4-5(a)所示。

图4-5 HTTP请求报文和响应报文结构

(1)请求行

请求行有3个字段:方法字段、URL字段和版本字段,中间用空格隔开。方法字段定义了请求类型,也就是对所请求的对象进行的操作,这些方法实际是一些命令,命令包括GET、POST、HEAD、PUT和DELETE等,其含义如表4-1所示。

表4-1 常见方法及说明

续表

注:GET方法也可以向服务器提供信息,与POST方法不同之处在于存放提交信息的位置。使用GET方法提交信息时,信息以查询数据的形式追加在URL中问号后面;而使用POST方法,信息则存放于实体主体中。

URL字段定义了文档的位置,版本字段指定了HTTP协议的版本,当前为1.1。

在图4-4的请求报文中,浏览器请求对象/usr/bin/image,而浏览器实现的是HTTP1.1版本。

(2)首部行

首部行用来说明浏览器、服务器或报文主体的一些信息。首部行由多行组成,每行的形式为“首部字段:(空格)值”,并以“回车”和“换行”结束。常见的首部字段及说明如表4-2所示。整个首部行结束时,还有一行空行将首部行和后面的实体主体分开。

表4-2 请求报文常见首部字段及说明

在图4-4中,Host:www.abc.com定义了目标所在主机的域名;Connection:close要求服务器在发送完被请求的对象后就关闭连接;User-agent指示了浏览器的类型是Mozilla/4.0,即Netscape浏览器;Accept-language:cn表示用户想得到该对象的中文版本。

(3)实体主体

实体主体(entity body)在使用GET方法时为空。当方法字段为POST时,实体主体中应包括用户在表单字段中输入的值,例如HTTP客户常常在用户提交表单时使用POST方法。

2.响应报文

每一个请求报文发出后,都能收到一个响应报文。响应报文包含3个部分:状态行、首部行和实体主体。报文结构如图4-5(b)所示。

(1)响应报文

响应报文的第一行是状态行。状态行有3个字段:版本字段、状态码字段和短语字段,中间以空格间隔。版本字段定义了HTTP协议版本,当前为1.1。状态码以3位数字的形式定义了请求的状态。1XX表示提示信息,2XX表示请求成功,3XX表示重定向到新的URL,4XX指示客户端的错误,5XX指示服务器端的错误。短语是解释状态码的文本信息,如200 OK表示请求成功,信息包含在返回的响应报文中;301 Move permanently表示请求的对象已转移,新的URL在响应报文的Location:首部行中指定;404 Not Found表示被请求的文档不在服务器上。

在图4-4中,状态行指示服务器使用的协议是HTTP/1.1,并且一切正常(即服务器已经找到并正在发送所请求的对象)。

(2)首部行

首部行包含多行,每个首部行由首部字段:(空格)值组成。典型的首部行如表4-3所示。

表4-3 响应报文常见首部字段及说明

在图4-4中,服务器用Connection:close首部行告诉客户在报文发送完后关闭了该TCP连接;Date:首部行指示服务器产生并发送该响应报文的时间;Server:首部行表明该报文是由一个Apache Web服务器产生的;Last-modified:首部行指示了对象创建或者最后修改的日期和时间;Content-length:首部行表明被发送对象为6 821字节;Content-type:首部行指示了实体主体中的对象是HTML文本。

(3)实体主体

实体主体部分是报文的主体,包含了所请求的对象本身。