HTTP头域字段解析

/**************************************************/

 

HTTP头域字段解析

 

HTTP,超文本传输协议,用于传送WWW方式的数据,协议采用了请求/响应模式

客户端向服务器发送一个请求,请求包括请求方法、URI、协议版本、请求修饰符,客户信息及内容

服务器以一个状态行作为响应,包括消息协议的版本,成功或者错误编码、服务器信息、实体元信息、实体内容

 

HTTP头域包括通用头、请求头、响应头、实体头,每个头域由一个域名,冒号和域值三部分组成,域名忽略大小写,域值前可以添加任何数量的空格符,头域可以扩展为多行,每行开始处,使用至少一个空格或制表符

 

1.通用头域

通用头域包含请求和响应消息都支持的头域,包含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

 

-各指令含义如下:

Public指示响应可被任何缓存区缓存。

Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。

no-cache指示请求或响应消息不能缓存

no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。

max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。

min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。

max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息

 

Date头域

----------

表示消息发送的时间

如:Date:Mon,31Dec200104:25:57GMT

 

Pragma头域

----------

用来包含实现特定的指定,最常用的是Pragma:no-cache,在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。

 

2.请求消息

请求消息的第一行格式为:

Method SP Request-URI SP HTTP-Version CRLF

 

Mehod

----------

表示骑墙于Request-URI完成的方法,区分大小,方法有:OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,其中GET和HEAD应该所有通用WEB服务器支持。

GET方法取回由Request-URI标识的信息。

HEAD方法也是取回同样的标识信息,但只是可在响应时,不返回消息体。

POST方法可以请求服务器接收包含在请求中的实体信息,可以用于提交表单,向新闻组、BBS、邮件群组和数据库发送消息。

 

SP

----------

表示空格

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

 

Request-URI

----------

遵循URI格式,在此字段为星号(*)时,说明请求并不用于某个特定的资源地址,而是用于服务器本身。

 

HTTP-Version

----------

表示支持的HTTP版本,例如为HTTP/1.1。

 

CRLF

----------

表示换行回车符。

 

==============================

请求头域允许客户端向服务器传递关于请求或都关于客户机的附加信息,请求头域可能包含字段: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.对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。

 

请求消息例:

GEThttp://class/download.microtool.de:80/somedata.exe   //请求头域信息

Host:download.microtool.de

Accept:*/*

Pragma:no-cache

Cache-Control:no-cache

Referer:http://class/download.microtool.de/ //通用头域

User-Agent:Mozilla/4.04[en](Win95;I;Nav)

Range:bytes=554554-

其中第一行表示HTTP客户端(可能是浏览器、下载程序)通过GET方法获得指定URL下的文件.

===============================

 

HOST头域

-----------

host头域指定请求资源的Intenet主机和端口,必须是表示为请求URL的原始服务器或网关的位置

 

Referer头域

-----------

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

 

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)

 

User-Agent头域

-----------

User-Agent头域的内容包含发出请求诉用户信息

 

3.响应消息

响应消息第一行格式为:

HTTP-Version SP Status-Code SP Reason-Phrase CRLF

 

HTTP-Version

-----------

表示支持HTTP版本,如HTTP/1.1

 

SP表示空格

 

Status-Code

-----------

是一个三个数字的结果代码。

Status-Code的第一个数字定义响应的类别,后两个数字没有分类的作用。第一个数字可能取5个不同的值:

1xx:信息响应类,表示接收到请求并且继续处理

2xx:处理成功响应类,表示动作被成功接收、理解和接受

3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理

4xx:客户端错误,客户请求包含语法错误或者是不能正确执行

5xx:服务端错误,服务器不能正确执行一个正确的请求

 

Reason-Phrase

-----------

提供一个简单的文本描述,用于帮助用户理解

 

 

===============================

响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息

和Request-URI进一步的信息。包含:Age、 Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW- Authenticate。

 

响应消息实例:

HTTP/1.0 200 OK

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

 

Location响应头

-----------

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

 

Server响应头

-----------

Server响应头包含处理请求的原始服务器的软件信息.

===============================

 

4.实体信息

请求消息和响应都可以包含实体信息,实体信息一般由实体头域和实体组成。

实体头域包含关于实体的原信息,包括:Allow、Content-Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header.

extension-header允许客户端定义新的实体头,但是这些域可能无法未接受方识别

实体可以是一个经过编码的字节流,它的编码方式由Content-Encoding或Content-Type定义,它的长度由Content-Length或Content-Range定义

 

Content-Type实体头

-----------

用于接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型Content-Range实体头

 

Content-Range实体头

-----------

用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。

在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。

格式:

Content-Range:bytes-unit SP first-byte-pos - last-byte-pos/entity-legth

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

 

Last-modified实体头

-----------

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

 

 

===============================

请求头字段 

请求头字段仅用于请求消息。

 

名称             示例值 

Accept           "text/html, image/*"  //浏览器可接受MIME类型

Accept-Charset   "iso8859-5" //浏览器可接受的字符集

Accept-Encoding  "gzip, compress" //浏览器解码的数据编码方式,如gzip

Accept-Language "en, fr" //浏览器语言种类

Authorization     [credentials] //授权信息

Content-Encoding "gzip"

Expect           "100-continue" 

From            "[email protected]

Host            "www.microsoft.com" 

If-Match         "entity_tag001" 

If-Modified-Since "Tue, 11 Jul 2000 18:23:51 GMT" 

If-None-Match    "entity_tag001" 

If-Range         "entity_tag001" or "Tue, 11 Jul 2000 18:23:51 GMT" 

If-Unmodified-Since "Tue, 11 Jul 2000 18:23:51 GMT" 

Max-Forwards    "3" 

Proxy-Authorization [credentials] 

Range       "bytes=100-599" 

Referer      "http://www.microsoft.com/resources.asp" 

TE          "trailers" 

User-Agent   "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)"

 

>>请求头字段的具体含义

Accept:浏览器可接受的MIME类型。 

Accept-Charset:浏览器可接受的字符集。 

Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。

Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。 

Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。 

Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点, Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。

Content-Length:表示请求消息正文的长度。 

Cookie:设置cookie,这是最重要的请求头信息之一

From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。 

Host:初始URL中的主机和端口。 

If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。 

Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。 

Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。 

User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型

 

 

响应头字段 

响应头字段仅用于响应消息。

 

名称          示例值 

Accept-Ranges  "none" 

Age            "2147483648(2^31)" 

ETag           "b38b9-17dd-367c5dcd" 

Last-Modified    "Tue, 11 Jul 2000 18:23:51 GMT" 

Location        "http://localhost/redirecttarget.asp" 

Proxy-Authenticate [challenge] 

Retry-After      "Tue, 11 Jul 2000 18:23:51 GMT" or "60" 

Server         "Microsoft-IIS/5.0" 

Vary            "Date" 

WWW-Authenticate [challenge] 

 

 

 

实体头字段 

实体头字段可以用于请求消息或响应消息。实体头字段中包含消息实体正文的有关信息,如使用的编码格式。

 

名称            示例值 

Allow              "GET, HEAD" 

Content-Encoding   "gzip" 

Content-Language  "en" 

Content-Length     "8445" 

Content-Location   "http://localhost/page.asp" 

Content-MD5       [md5-digest] 

Content-Range     "bytes 2543-4532/7898" 

Content-Type      "text/html" 

Expires           "Tue, 11 Jul 2000 18:23:51 GMT" 

Last-Modified      "Tue, 11 Jul 2000 18:23:51 GMT" 

 

>>实体头字段的具体含义

Allow 服务器支持哪些请求方法(如GET、POST等)。

Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。

Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。

Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。

Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。 

Expires 应该在什么时候认为文档已经过期,从而不再缓存它? 

Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。

Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。 

Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。 

注意这种功能通常是通过设置HTML页面HEAD区的<META. HTTP-EQUIV="Refresh" C>实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置 Refresh头更加方便。 

注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面 ”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META. HTTP-EQUIV="Refresh" ...>。 

注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。

 

===============================

你可能感兴趣的:(网络协议)