超文本传输协议-HTTP/1.1(修订版)---译者:孙超进---email:sunchaojin@163.com说明本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善。请参考“互联网官方协议标准”(STD1)来了解本协议的标准化状态。本协议不限流传发布。版权声明Copyright(C)TheInternetSociety(1999).AllRightsReserved.摘要超文本传输协议(HTTP)是一种为分布式,协作式的,超媒体信息系统。它是一种通用的,无状态(stateless)的协议,除了应用于超文本传输外,它也可以应用于诸如名称服务器和分布对象管理系统之类的系统,这可以通过扩展它的请求方法,错误代码和消息头[47]来实现。HTTP的一个特性就是是数据表现形式是可以定义的和可协商性的,这就允许系统能独立于于数据传输被构建。HTTP在1990年全球信息刚刚起步的时候就得到了应用。本说明书详细阐述了HTTP/1.1协议,是RFC2068的修订版[33]。目录(略)1引论1.1目的超文本传输协议(HTTP)是一种为分布式的,协作的,超媒体信息系统,它是面向应用层的协议。在1990年就得到了应用。HTTP的第一个版本叫做HTTP/0.9,是一种为互联网原始数据传输服务的简单协议。由RFC1945[6]定义的HTTP/1.0进一步完善了这个协议。它允许消息以类MIME消息的格式传送,它包括传输数据的元信息和对请求/响应语义的修饰。但是,HTTP/1.0没有充分考虑到分层代理,缓存的,以及持久连接和虚拟主机的需求的影响。并且随着不完善的HTTP/1.0应用程序的激增,这就迫切需要一个新的版本,以便能使两个通信程序能够确定彼此的真实能力。此规范定义的协议叫做“HTTP/1.1”,.这个协议与HTTP/1.0相比,此规范更为严格,以确保各个协议的特征得到可靠实现。实际的信息系统除了简单的获取信息之外,还要求更多的功能,包括查找(search),终端更新(front-endupdate)和注解(annotation)。HTTP为请求提供可扩充方法集和消息头集[47]。HTTP是建立在统一资源标识符(URI)[3]的约束上的,作为一个地址(URL)[4]或名称(URN)[20],以指定被一个方法使用的资源。消息以一种类似于互联网邮件[9]消息格式来传输的,互联网消息格式定义于多目的互联网邮件扩展(MIME)[7]里。HTTP也是用于用户代理(useragents)和其它互联网系统的代理/网关之间通信的通信协议,这些互联网系统可能由SMTP[16],NNTP[13],FTP[18],Gopher[2]和WAIS[10]协议支持。通过这种方式,HTTP允许不同的应用程序对资源进行基本的超媒体访问。1.2要求本文的关键词“必须”(MUST),,“不能”(MUSTNOT),“需要”(REQUIRED),“应该”(SHALL),“不应该”(SHALLNOT),“应该”(SHOULD),“不应该”(SHOULDNOT),“建议的”(RECOMMENDED),“可能”(MAY),和“可选的”(OPTIONAL)将由RFC2119[34]解释。一个应用程序如果不能满足协议提供的一个或多个MUST或REQUIRED等级的要求,是不符合要求的。一个应用程序如果满足所有必须(MUST)或需要的(REQUIRED)等级以及所有应该(SHOULD)等级的要求,则被称为非条件遵循(unconditionallycompliant)的;若满足所有必须(MUST)等级的要求但不能满足所有应该(SHOULD)等级的要求则被称为条件遵循的(conditionallycompliant)。1.3术语本说明用到了若干术语,以表示HTTP通信中各参与者和对象扮演的不同角色。连接(connection)为通信而在两个程序间建立的传输层虚拟电路。消息(message)HTTP通信中的基本单元。它由一个结构化的八比特字节序列组成,与第4章定义的句法相匹配,并通过连接得到传送。请求(request)一种HTTP请求消息,参看第5章的定义。响应(response)一种HTTP响应消息,参看第6章的定义。资源(resource)一种网络数据对象或服务,可以用第3.2节定义的URI指定。资源可以以多种表现方式(例如多种语言,数据格式,大小和分辨率)或者根据其它方面而而不同的表现形式。实体(entity)实体是请求或响应的有效承载信息。一个实体包含元信息和内容,元信息以实体头域(entity-headerfield)形式表示,内容以消息主体(entity-body)形式表示。在第7章详述。表现形式(representation)一个响应包含的实体是由内容协商(contentnegotiation)决定的。如第12章所述。有可能存在一个特定的响应状态码对应多个表现形式。内容协商(contentnegotiation)当服务一个请求时选择资源的一种适当的表示形式的机制(mechanism),如第12节所述。任何响应里实体的表现形式都是可协商的(包括错误响应)。变量(variant)在某个时刻,一个资源对应的表现形式(representation)可以有一个或多个(译注:一个URI请求一个资源,但返回的是此资源对应的表现形式,这根据内容协商决定)。每个表现形式(representation)被称作一个变量。‘变量’这个术语的使用并不意味着资源(resource)是由内容协商决定的.。客户端(client)为发送请求建立连接的程序.。用户代理(useragent)初始化请求的客户端程序。常见的如浏览器,编辑器,蜘蛛(可网络穿越的机器人),或其他的终端用户工具.服务器(Server)服务器是这样一个应用程序,它同意请求端的连接,并发送响应(response)。任何给定的程序都有可能既做客户端又做服务器;我们使用这些术语是为了说明特定连接中应用程序所担当的角色,而不是指通常意义上应用程序的能力。同样,任何服务器都可以基于每个请求的性质扮演源服务器,代理,网关,或者隧道等角色之一。源服务器(Originserver)存在资源或者资源在其上被创建的服务器(server)被成为源服务器(originserver)。代理(Proxy)代理是一个中间程序,它既可以担当客户端的角色也可以担当服务器的角色。代理代表客户端向服务器发送请求。客户端的请求经过代理,会在代理内部得到服务或者经过一定的转换转至其他服务器。一个代理必须能同时实现本规范中对客户端和服务器所作的要求。透明代理(transparentproxy)需要代理认证和代理识别,而不修改请求或响应。非透明代理(non-transparentproxy)需修改请求或响应,以便为用户代理(useragent)提供附加服务,附加服务包括组注释服务,媒体类型转换,协议简化,或者匿名过滤等。除非透明行为或非透明行为经被显式地声明,否则,HTTP代理既是透明代理也是非透明代理。网关(gateway)网关其实是一个服务器,扮演着代表其它服务器为客户端提供服务的中间者。与代理(proxy)不同,网关接收请求,仿佛它就是请求资源的源服务器。请求的客户端可能觉察不到它正在同网关通信。隧道(tunnel)隧道也是一个中间程序,它一个在两个连接之间充当盲目中继(blindrelay)的中间程序。一旦隧道处于活动状态,它不能被认为是这次HTTP通信的参与者,虽然HTTP请求可能已经把它初始化了。当两端的中继连接都关闭的时候,隧道不再存在。缓存(cache)缓存是程序响应消息的本地存储。缓存是一个子系统,控制消息的存储、获取和删除。缓存里存放可缓存的响应(cacheableresponse)为的是减少对将来同样请求的响应时间和网络带宽消耗。任一客户端或服务器都可能含有缓存,但缓存不能存在于一个充当隧道(tunnel)的服务器里。可缓存的(cacheable)我们说响应(response)是可缓存的,如果这个响应可以被缓存(cache)保存其副本,为的是能响应后续请求。确定HTTP响应的缓存能力(cacheability)在13节中有介绍。即使一个资源(resourse)是可缓存的,也可能存在缓存是否能利用此缓存副本为某个特定请求的约束。第一手的(first-hand)如果一个响应直接从源服务器或经过若干代理(proxy),并且没有不必要的延时,最后到达客户端,那么这个响应就是第一手的(first-hand)。如果响应通过源服务器(originserver)验证是有效性(validity)的,那么这个响应也同样是第一手的。显式过期时间(explicitexpirationtime)是源服务器认为实体(entity)在没有被进一步验证(validation)的情况下,缓存(cache)不应该利用其去响应后续请求的时间(译注:也就是说,当响应的显式过期时间达到后,缓存必须要对其缓存的副本进行重验证,否则就不能去利用此副本去响应后续请求)。启发式过期时间(heuristicexpirationtime)当没有显式过期时间(explicitexpirationtime)可利用时,由缓存指定过期时间.年龄(age)一个响应的年龄是从被源服务器发送或被源服务器成功验证到现在的时间。保鲜寿命(freshnesslifetime)一个响应产生到过期之间的时间。保鲜(Fresh)如果一个响应的年龄还没有超过保鲜寿命(freshnesslifetime),那么它就是保鲜的.。陈旧(Stale)一个响应的年龄已经超过了它的保鲜寿命(freshnesslifetime),那么就是陈旧的.语义透明(semanticallytransparent)缓存(cache)可能会以一种语意透明(semanticallytransparent)的方式工作。这时,对于一个特定的响应,使用缓存既不会对请求客户端产生影响也不会对源服务器产生影响,缓存的使用只是为了提高性能。当缓存(cache)具有语意透明时,客户端从缓存接收的响应跟直接从源服务器接收的响应完全一致(除了使用hop-by-hop头域)。验证器(Validator)验证器其实是协议元素(例如:实体标签(entitytag)或最后修改时间(last-modifiedtime)等),这些协议元素被用于识别缓存里保存的副本(即缓存项)是否等价于源服务器的实体的副本。上游/下游(upstream/downstream)上游和下游描述了消息的流动:所有消息都是从上游流到下游。内向/外向(inbound/outbound)内向和外向指的是消息的请求和响应路径:“内向”即“移向源服务器”,“外向”即“移向用户代理(useragent)”。1.4总体操作HTTP协议是一种请求/响应型的协议。客户端给服务器发送请求的格式是一个请求方法(requestmethod),URI,协议版本号,然后紧接着一个包含请求修饰符(modifiers),客户端信息,和可能的消息主体的类MIME(MIME-like)消息。服务器对请求端发送响应的格式是以一个状态行(statusline),其后跟随一个包含服务器信息、实体元信息和可能的实体主体内容的类MIME(MIME-like)的消息。其中状态行(statusline)包含消息的协议版本号和一个成功或错误码。HTTP和MIME之间的关系如附录19.4节所阐述。大部分的HTTP通信是由用户代理(useragent)发起的,由应用于一个源服务器资源的请求构成。最简单的情形,这可以通过用户代理(UA)和源服务器(O)之间的单一连接(v)来实现。请求链(Requestchain)------------------------------------------------用户代理(UA)----------------单一连接(v)--------------源服务器(O)--------