logo  

跟我一起读RFC

跟我一起读RFC
作者: 陈安廉

摘要:软件开发进阶系列


1.4 总体要求


2020-12-01 14:00:07


HTTP 协议是一种请求/响应型的协议。 客户端给服务器发送请求的格式是一个请求方法(request method),URI,协议版本号,然后紧接着一个包含请求修饰符(modifiers),客户端信息,和可能的消息主体的类 MIME(MIME-like)消息。服务器对请求端发送响应的格式是以一个状态行(status line),其后跟随一个包含服务器信息、实体元信息和可能的实体主体内容的类 MIME(MIME-like)的消息。其中状态行(status line)包含消息的协议版本号和一个成功或错误码。HTTP 和 MIME 之间的关系如附录 19.4 节所阐述。

大部分的 HTTP 通信是由用户代理(user agent)发起的,由应用于一个源服务器资源的请求构成。最简单的情形,这可以通过用户代理(UA)和源服务器(O)之间的单一连接(v)来实现。

          request chain ------------------------>
       UA -------------------v------------------- O
          <----------------------- response chain

有可能在请求/响应链中出现一个或多个中间者(intermediares),这是比较复杂的情形。常见的中间者(intermediares)有三种:代理(proxy),网关(gateway)和隧道(tunnel)。代理(proxy)是一种转发代理(a forwarding agent),它接收绝对 URI(absoulute url,相对于相对 url)请求,重写全部或部分消息,然后把格式化后的请求发送到 URI 指定的服务器上。网关是一种接收代理(receiving agent),它充当一个在服务器之上的层(layer),必要时它会把请求翻译成为下层服务器的协议。隧道不改变消息而充当两个连接之间的中继点;它用于通信需要穿过中间者(如防火墙)甚至当中间者不能理解消息内容的时候。


          request chain -------------------------------------->
       UA -----v----- A -----v----- B -----v----- C -----v----- O
          <------------------------------------- response chain

上图显示了用户代理(user agent)和源服务器之间的三个中间者(A,B 和 C)。整条链的请求或响应将会通过四个被隔离开的连接。这个不同点很重要,因为某些 HTTP 通信选项有可能只能采用最近的非隧道邻接点的连接,有可能只采用链的端点(end-point),或者也有可能只 采用于链上所有连接。图表尽管是线性的,每个参与者可能忙于多个并发的通信。例如,B 可以接收来自不是 A 的许多客户端的请求,并且/或者可以把请求转发到不是 C 的服务器,与此同时 C 正在处理 A 的请求。

通信中任何非隧道成员都可能会采用一个内部缓存(internal cache)来处理请求。如果沿着链 的成员有请求已缓存的响应,请求/响应链就会大大缩短。下图阐明了一个最终请求响应链,假 定 B 拥有一个来自于 O(通过 C)的以前请求响应的缓存副本,并且此请求的响应并未被 UA或 A 缓存。


         request chain ---------->
       UA -----v----- A -----v----- B - - - - - - C - - - - - - O
          <--------- response chain


并不是所有的响应都能有效地缓存,一些请求可能含有修饰符(modifiers),这些修饰符对缓存动作有特殊的要求。HTTP 对缓存行为(behavior)和可缓存响应(cacheable responses)的定义在第 13 章定义。

实际上,目前万维网上有多种被实践和部署的缓存和代理的体系结构和配置。这些系统包括节省带宽的缓存代理(proxy cache)层次(hierarchies)系统,可以广播(broadcast)或多播 (multicast)缓存数据的系统,通过 CD-ROM 发布缓存数据子集的机构,等等。HTTP 系统(http system)会被应用于宽带连接的企业局域网中的协作,并且可以被用于 PDAs 进行低耗 无线断续连接访问。HTTP1.1 的宗旨是为了支持各种各样的已经部署的配置,同时引进一种协议结构,让它满足可以建立高可靠性的 web 应用程序,即使不能达到这种要求,也至少可以可靠的定位故障。

HTTP 通信通常发生在 TCP/IP 连接上。默认端口是 TCP 80,不过其它端口也可以使用。但并不排除 HTTP 协议会在其它协议之上被实现。HTTP 仅仅期望的是一个可靠的传输(译注:HTTP一般建立在传输层协议之上);所以任何提供这种保证的协议都可以被使用;协议传输数据单元(transport data unit)与 HTTP/1.1 请求和响应的消息结构之间的映象已经超出了本规范的范围。

大部分 HTTP/1.0 的实现都是对每个请求/响应交换(exchange)产生一个新的连接。而HTTP/1.1 中,一个连接可以用于一个或更多请求/响应交换,虽然连接可能会因为各种原因中断(见第 8.1 节)。