HTTP协议格式分析

HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,浏览器与Web服务器之间所遵循的协议就是HTTP,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。

HTTP协议消息包括Client向Server的请求消息和Server向Client的响应消息。协议消息由起始行,头域和可选的消息体组成。HTTP/1.1是Internet现行的标准协议,这里都以HTTP/1.1为基础介绍。

请求消息的第一行为下面的格式:
Method Request-URI HTTP-Version\r\n

Method表示对于Request-URI完成的方法,这个字段是大小写敏感的,包括OPTIONS、GET、HEAD、POST、PUT、Delete、TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的。GET方法取回由Request-URI标识的信息。HEAD方法也是取回由Request-URI标识的信息,只是可以在响应时,不返回消息体。POST方法可以请求服务器接收包含在请求中的实体信息,可以用于提交表单。

Request-URI遵循URI格式,在此字段为星号(*)时,说明请求并不用于某个特定的资源地址,而是用于服务器本身。
HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。

响应消息的第一行为下面的格式:
HTTP-Version Status-Code Reason-Phrase\r\n

HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。
Status-Code是一个三个数字的结果代码,主要用于机器自动识别。
Status-Code可能取5个不同的值:
1xx:信息响应类,表示接收到请求并且继续处理
  100  继续
  101  交换协议
2xx:处理成功响应类,表示动作被成功接收、理解和接受
  200  OK
  201  已创建
  202  接收
  203  非认证信息
  204  无内容
  205  重置内容
  206  部分内容
3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
  300  多路选择
  301  永久转移
  302  暂时转移
  303  参见其它
  304  未修改(Not Modified)
  305  使用代理
4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
  400  错误请求(Bad Request)
  401  未认证
  402  需要付费
  403  禁止(Forbidden)
  404  未找到(Not Found)
  405  方法不允许
  406  不接受
  407  需要代理认证
  408  请求超时
  409  冲突
  410  失败
  411  需要长度
  412  条件失败
  413  请求实体太大
  414  请求URI太长
  415  不支持媒体类型
5xx:服务端错误,服务器不能正确执行一个正确的请求
  500  服务器内部错误
  501  未实现(Not Implemented)
  502  网关失败
  504  网关超时
  505     HTTP版本不支持


Reason-Phrase给Status-Code提供一个简单的文本描述。Reason-Phrase主要用于帮助用户理解。


1. HTTP的头域包括通用头域,请求头域,响应头域和实体头域四个部分。
    通用头域是指请求和响应消息都支持的头域。

包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via等方法。

    Cache-Control头域

指定请求和响应遵循的缓存机制。缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。

    Date头域表示消息发送的时间
时间的描述格式由rfc822定义。Date描述的时间表示世界标准时,如Date:Mon,31Dec200104:25:57GMT。

    Pragma头域用来包含实现特定的指令。

常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。


2. 请求头域

请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段Accept、Accept-Charset、Accept-Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If-Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。


3. Host头域
Host头域指定请求资源的Intenet主机和端口号(默认端口可以省略),必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

4. Referer头域

Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。

5. Range头域

Range头域可以请求实体的一个或者多个子范围。
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999

但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206 PartialContent)返回而不是以200(OK)。

6. User-Agent头域
User-Agent头域的内容包含发出请求的用户信息,一般是客户机的浏览器类型。

典型的请求消息如下:
GET http://www.wantsoft.com/ \r\n
Host:www.wantsoft.com
Accept:*/*
Pragma:no-cache
Cache-Control:no-cache
Referer:www.wantsoft.com
User-Agent:Mozilla/4.04[en](Win95;I;Nav)
Range:bytes=554554-

响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和进一步的信息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。

典型的响应消息:

HTTP/1.0200OK
Date:Mon,31Dec200104:25:57GMT
Server:Apache/1.3.14(Unix)
Content-type:text/html
Last-modified:Tue,17Apr200106:46:28GMT
Etag:"a030f020ac7c01:1e9f"
Content-length:39725426
Content-range:bytes554554-40279979/40279980

7. Location响应头域
Location响应头用于重定向接收者到一个新URI地址。

8. Server响应头域
Server响应头域包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。

9. Content-Type实体头域
用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型为数据设定称为“MIME-TYPE”的内容类型。MIME,即多任务因特网邮件扩充(Multipurpose Internet Mail Extension),一些常见的内容类型如下:
text/html:HTML文档。
text/plain:纯文本文件。
image/jpeg:jpeg图像文件。
image/GIF:gif图像文件。
image/TIFF:TIFF格式的图形文件。
application/rtf:多信息文本格式文档。
application/zip:PKZIP或WinZIP压缩文件。
video/mpeg:mpeg视频文件。
video/quicktime:QuickTime视频文件。

10. Content-Range实体头用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:

Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth
例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content-Length表示实际传送的字节数。

11. Last-modified实体头
指定服务器上保存内容的最后修订时间。

作者: 静止的流水   发布时间: 2010-09-20