通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
1、通用头域
通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。
Cache-Control头域
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置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头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。
Pragma头域
Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同。
2、请求消息
请求消息的第一行为下面的格式:
Method SP Request-URI SP HTTP-Version CRLF
Method表示对于Request-URI完成的方法,这个字段是大小写敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的。GET方法取回由Request-URI标识的信息。HEAD方法也是取回由Request-URI标识的信息,只是可以在响应时,不返回消息体。POST方法可以请求服务器接收包含在请求中的实体信息,可以用于提交表单,向新闻组、BBS、邮件群组和数据库发送消息。
SP表示空格。
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的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
Referer头域
Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。
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)。
User-Agent头域
User-Agent头域的内容包含发出请求的用户信息。
3、响应消息
响应消息的第一行为下面的格式:
HTTP-Version SP Status-Code SP Reason-Phrase CRLF
HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。
Status-Code是一个三个数字的结果代码。
Reason-Phrase给Status-Code提供一个简单的文本描述。Status-Code主要用于机器自动识别,Reason-Phrase主要用于帮助用户理解。Status-Code的第一个数字定义响应的类别,后两个数字没有分类的作用。第一个数字可能取5个不同的值:
1xx:信息响应类,表示接收到请求并且继续处理
2xx:处理成功响应类,表示动作被成功接收、理解和接受
3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
5xx:服务端错误,服务器不能正确执行一个正确的请求
响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含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
上例第一行表示HTTP服务端响应一个GET方法。棕色的部分表示响应头域的信息,绿色的部分表示通用头部分,红色的部分表示实体头域的信息。
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实体头
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实体头指定服务器上保存内容的最后修订时间。
5、 HTTP 头参考(microsoft)
HTTP 请求和 HTTP 响应都使用头发送有关 HTTP 消息的信息。头由一系列行组成,每行都包含名称,然后依次是冒号、空格、值。字段可按任何顺序排列。某些头字段既能用于请求头也能用于响应头,而另一些头字段只能用于其中之一。
许多请求头字段都允许客户端在值部分指定多个可接受的选项,有时甚至可以对这些选项的首选项进行排名。多个项以逗号分隔。例如,客户端可以发送包含 “Content-Encoding: gzip, compress,”的请求头,表示可以接受各种压缩类型。如果服务器的响应正文使用 gzip 编码,其响应头中将包含“Content-Encoding: gzip”。
有些字段可以在单个头中出现多次。例如,头可以有多个“Warning”字段。
下表列出了 HTTP 1.1 头字段。注意:有些头字段是 MIME 字段。MIME 字段在 Internet Engineering Task Force (IETF) 文档 RFC 2045 中进行了定义,但也可用于 HTTP 1.1 协议。有关 MIME 和 HTTP 1.1 规范的详细信息,请参阅 IEIF 页。
通用头字段
可用于请求消息和响应消息。
名称 示例值
Cache-Control "max-age=10"
Connection "close"
Date "Tue, 11 Jul 2000 18:23:51 GMT"
Pragma "no-cache"
Trailer "Date"
Transfer-Encoding "chunked"
Upgrade "SHTTP/1.3"
Via "HTTP/1.1 Proxy1, HTTP/1.1 Proxy2"
Warning "112 Disconnected Operation"
请求头字段
请求头字段仅用于请求消息。
名称 示例值
Accept "text/html, image/*"
Accept-Charset "iso8859-5"
Accept-Encoding "gzip, compress"
Accept-Language "en, fr"
Authorization [credentials]
Content-Encoding "gzip"
Expect "100-continue"
From "user@microsoft.com"
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-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"
>>>>>>>HTTP头字段的具体含义<<<<<<<<<<<<<<<
通用头字段:
Cache-Control | 用于指定缓存指令,缓存指令是单向的且是独立的 | ||||||||
Date | 表示消息产生的日期和时间 | ||||||||
Connection | 允许发送指定连接的选项 | ||||||||
Trailer | 指出给出的头部域集合在以chunked transfer-coding 编码的消息的尾巴中存在 | ||||||||
Pragma | 用来包含实现特定的指令 | ||||||||
Transfer-Encoding | 指出为了安全在发送方和接收方间传输,已经应用什么类型的转换(若有的话)到消息主体上 | ||||||||
Upgrad | 允许客户端指定它所支持的其它通迅协议,且愿意使用之,若服务器发现切换协议是适当的 | ||||||||
Via | 列出从客户端到 OCS 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。 | ||||||||
Warning | 用于挟带关于消息的状态和转换的额外信息,它可能不会在消息中反映。 |
请求头字段:
Accept | 请求报头域用于指定客户端接受哪些类型的信息 | |||||||||
Accept-Charset | 请求报头域用于指定客户端接受的字符集。 | |||||||||
Accept-Encoding | 请求报头域类似于Accept,但是它是用于指定可接受的内容编码。 | |||||||||
Accept-Language | 请求报头域类似于Accept,但是它是用于指定一种自然语言 | |||||||||
Authorization | 请求报头域主要用于证明客户端有权查看某个资源。 | |||||||||
Expect | 用于指出客户端要求的特殊服务器行为 | |||||||||
From | 请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。 | |||||||||
Host | 用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,(发送请求时,该报头域是必需的) | |||||||||
If- Match | 如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。 | |||||||||
If-Modified-Since | 只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。 | |||||||||
If-None-Match | 如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。 | |||||||||
If-Range | 浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。 | |||||||||
If-Unmodified-Since | 如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。 | |||||||||
Max-Forwards | 提供某种机制,TRACE和OPTIONS方法用来限制可以转发该请求给下个入界服务器的代理或网关的数量 | |||||||||
Proxy-Authorization | 浏览器响应代理服务器的身份验证请求,提供自己的身份信息。 | |||||||||
Range | 浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。 | |||||||||
Referer | 允许客户端指定请求uri的源资源地址, | |||||||||
TE | 指出愿意在响应中接受任何扩展transfer-coding,且是否愿意接受chunked transfer-coding中的尾巴域。 | |||||||||
User-Agent | 请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。 | |||||||||
Content-Length | 表示请求消息正文的长度。 | |||||||||
Cookie | 设置cookie,这是最重要的请求头信息之一 | |||||||||
UA-Pixels | 由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小 | |||||||||
UA-Color | 由某些版本的IE浏览器所发送的非标准的请求头,表示颜色深度 | |||||||||
UA-OS | 由某些版本的IE浏览器所发送的非标准的请求头,表示操作系统 | |||||||||
UA-CPU | 由某些版本的IE浏览器所发送的非标准的请求头,表示CPU类型 | |||||||||
响应头字段:
Accept-Ranges | WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求 | ||||||||
Age | 当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。 | ||||||||
Etag | 提供所请求变量的实体标签的当前值 | ||||||||
Location | Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。 | ||||||||
Proxy-Authenticate | 代理服务器响应浏览器,要求其提供代理身份验证信息。 | ||||||||
Retry- After | 用于指出希望该服务对请求客户端可以维持有效多长,或者要求用户代理在重定向请求前应等待的最小时间。 | ||||||||
Server | Server响应报头域包含了服务器用来处理请求的软件信息。 | ||||||||
Vary | WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)。 | ||||||||
WWW-Authenticate | 必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization 报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。 |
实体头字段:
Allow | 服务器支持哪些请求方法 | ||||||||
Content-Encoding | 被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,用于记录文档的压缩方法 | ||||||||
Content-Language | 描述了资源所用的自然语言 | ||||||||
Content-Length | 用于指明实体正文的长度,以字节方式存储的十进制数字来表示。 | ||||||||
Content-Location | 用于提供消息封装的实体的资源位置,当实体从独立于所请求资源的URI 的位置可访问时 | ||||||||
Content-MD5 | 是提供对entity-body 的端到端消息完整性检查(MIC) | ||||||||
Content-Range | 与部分entity-body一起发送,以指定该部分主体应该应用到全部entity-body的哪个地方 | ||||||||
Content-Type | 用语指明发送给接收者的实体正文的媒体类型 | ||||||||
Expires | 给出响应过期的日期和时间。 | ||||||||
Last-Modified | 用于指示资源的最后修改日期和时间。 | ||||||||
extension-header | 机制允许定义额外的entity-header 域而不改变协议,但不能假设接收方认识这些域。 |