图解HTTP--笔记3

与 HTTP 协作的 Web 服务器

一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率。

用单台虚拟主机实现多个域名 :HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。比如,提供 Web 托管服务(Web Hosting Service)的供应商,可以用一台服务器为多位客户服务,也可以以每位客户持有的域名运行各自不同的网站。这是因为利用了虚拟主机(Virtual Host,又称虚拟服务器)的功能。即使物理层面只有一台服务器,但只要使用虚拟主机的功能,则可以假想已具有多台服务器。 

图解HTTP--笔记3_第1张图片

客户端使用 HTTP 协议访问服务器时,会经常采用类似 www.hackr.jp这样的主机名和域名。在互联网上,域名通过 DNS 服务映射到 IP 地址(域名解析)之后访问目标网站。可见,当请求发送到服务器时,已经是以 IP 地址形式访问了。所以,如果一台服务器内托管了 www.tricorder.jp 和 www.hackr.jp 这两个域名,当收到请求时就需要弄清楚究竟要访问哪个域名。在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI。

图解HTTP--笔记3_第2张图片

通信数据转发程序 :代理、网关、隧道

HTTP 通信时,除客户端和服务器以外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道。它们可以配合服务器工作。这些应用程序和服务器可以将请求转发给通信线路上的下一站服务器,并且能接收从那台服务器发送的响应再转发给客户端。

代理 :代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。

网关 :网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。

隧道 :隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。

图解HTTP--笔记3_第3张图片
代理

代理 :在 HTTP 通信过程中,可级联多台代理服务器。请求和响应的转发会经过数台类似锁链一样连接起来的代理服务器。转发时,需要附加Via 首部字段以标记出经过的主机信息。使用代理服务器的理由有:利用缓存技术(稍后讲解)减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的,等等。代理有多种使用方法,按两种基准分类。一种是是否使用缓存,另一种是是否会修改报文。

缓存代理 :代理转发响应时,缓存代理会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。

透明代理 :转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理。反之,对报文内容进行加工的代理被称为非透明代理。

网关 :网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提供非 HTTP 协议服务。利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。比如,网关可以连接数据库,使用SQL语句查询数据。另外,在 Web 购物网站上进行信用卡结算时,网关可以和信用卡结算系统联动。

隧道 :隧道可按要求建立起一条与其他服务器的通信线路,届时使用 SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。隧道本身不会去解析 HTTP 请求。也就是说,请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。

图解HTTP--笔记3_第4张图片
图解HTTP--笔记3_第5张图片
利用网关可以由 HTTP 请求转化为其他协议通信
图解HTTP--笔记3_第6张图片

保存资源的缓存

缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。缓存服务器是代理服务器的一种,并归类在缓存代理类型中。换句话说,当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。缓存服务器的优势在于利用缓存可避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求了。

缓存的有效期限 :即便缓存服务器内有缓存,也不能保证每次都会返回对同资源的请求。因为这关系到被缓存资源的有效性问题。当遇上源服务器上的资源更新时,如果还是使用不变的缓存,那就会演变成返回更新前的“旧”资源了。即使存在缓存,也会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器将会再次从源服务器上获取“新”资源。

客户端的缓存 :缓存不仅可以存在于缓存服务器内,还可以存在客户端浏览器中。以Internet Explorer 程序为例,把客户端缓存称为临时网络文件 。浏览器缓存如果有效,就不必再向服务器请求相同的资源了,可以直接从本地磁盘内读取。另外,和缓存服务器相同的一点是,当判定缓存过期后,会向源服务器确认资源的有效性。若判断浏览器缓存失效,浏览器会再次请求新资源。

图解HTTP--笔记3_第7张图片
保存资源的缓存
图解HTTP--笔记3_第8张图片
缓存的有效期限
图解HTTP--笔记3_第9张图片
客户端的缓存

在 HTTP 出现之前的协议

在 HTTP 普及之前,也就是从互联网的诞生期至今,曾出现过各式各样的协议。在 HTTP 规范确立之际,制定者们参考了那些协议的功能。也有某些协议现在已经彻底退出了人们的视线。接下来,我们会简单介绍一下这些协议。

FTP :传输文件时使用的协议。该协议历史久远,可追溯到 1973 年前后,比 TCP/IP 协议族的出现还要早。虽然它在 1995 年被 HTTP 的流量超越,但时至今日,仍被广泛沿用。

NNTP :用于 NetNews 电子会议室内传送消息的协议。在 1986 年前后出现,属于比较古老的一类协议。现在,利用 Web 交换信息已成主流,所以该协议已经不怎么使用了。

Archie :搜索 anonymous FTP 公开的文件信息的协议。1990 年前后出现,现在已经不常使用。

WAIS :以关键词检索多个数据库使用的协议。1991 年前后出现。由于现在已经被 HTTP 协议替代,也已经不怎么使用了。

Gopher :查找与互联网连接的计算机内信息的协议。1991 年前后出现,由于现在已经被 HTTP 协议替代,也已经不怎么使用了。

图解HTTP--笔记3_第10张图片
通用首部字段
图解HTTP--笔记3_第11张图片
请求首部字段
图解HTTP--笔记3_第12张图片
响应首部字段
图解HTTP--笔记3_第13张图片
实体首部字段

HTTP/1.1 通用首部字段

通用首部字段是指,请求报文和响应报文双方都会使用的首部。

Cache-Control :通过指定首部字段 Cache-Control 的指令,就能操作缓存的工作机制。指令的参数是可选的,多个指令之间通过“,”分隔。首部字段 CacheControl的指令可用于请求及响应时。

public 指令 :当指定使用 public 指令时,则明确表明其他用户也可利用缓存。

private 指令 :当指定 private 指令后,响应只以特定的用户作为对象,这与 public指令的行为相反。缓存服务器会对该特定用户提供资源缓存的服务,对于其他用户发送过来的请求,代理服务器则不会返回缓存。

no-cache 指令 :客户端发送的请求中如果包含 no-cache 指令,则表示客户端将不会接收缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。如果服务器返回的响应中包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。由服务器返回的响应中,若报文首部字段 Cache-Control 中对 no-cache字段名具体指定参数值,那么客户端在接收到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数。

no-store 指令 :当使用 no-store 指令 1 时,暗示请求(和对应的响应)或响应中包含机密信息。1 从字面意思上很容易把 no-cache 误解成为不缓存,但事实上 no-cache 代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源,也许称为 do-notserve-from-cache-without-revalidation更合适。no-store 才是真正地不进行缓存,请读者注意区别理解。——译者注因此,该指令规定缓存不能在本地存储请求或响应的任一部分。

s-maxage 指令 :s-maxage 指令的功能和 max-age 指令的相同,它们的不同点是 smaxage指令只适用于供多位用户使用的公共缓存服务器 2。也就是说,对于向同一用户重复返回响应的服务器来说,这个指令没有任何作用。另外,当使用 s-maxage 指令后,则直接忽略对 Expires 首部字段及max-age 指令的处理。

max-age 指令 :当客户端发送的请求中包含 max-age 指令时,如果判定缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收缓存的资源。另外,当指定 max-age 值为 0,那么缓存服务器通常需要将请求转发给源服务器。当服务器返回的响应中包含 max-age 指令时,缓存服务器将不对资源的有效性再作确认,而 max-age 数值代表资源保存为缓存的最长时间。应用 HTTP/1.1 版本的缓存服务器遇到同时存在 Expires 首部字段的情况时,会优先处理 max-age 指令,而忽略掉 Expires 首部字段。而HTTP/1.0 版本的缓存服务器的情况却相反,max-age 指令会被忽略掉。

min-fresh 指令 :min-fresh 指令要求缓存服务器返回至少还未过指定时间的缓存资源。比如,当指定 min-fresh 为 60 秒后,过了 60 秒的资源都无法作为响应返回了。

max-stale 指令 :使用 max-stale 可指示缓存资源,即使过期也照常接收。如果指令未指定参数值,那么无论经过多久,客户端都会接收响应;如果指令中指定了具体数值,那么即使过期,只要仍处于 max-stale指定的时间内,仍旧会被客户端接收。

only-if-cached 指令 :使用 only-if-cached 指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会要求其返回。换言之,该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码 504 Gateway Timeout。

must-revalidate 指令 :使用 must-revalidate 指令,代理会向源服务器再次验证即将返回的响应缓存目前是否仍然有效。若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条 504(Gateway Timeout)状态码。另外,使用 must-revalidate 指令会忽略请求的 max-stale 指令(即使已经在首部使用了 max-stale,也不会再有效果)。

proxy-revalidate 指令 :proxy-revalidate 指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。

no-transform 指令 :使用 no-transform 指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作。

图解HTTP--笔记3_第14张图片
缓存请求指令
图解HTTP--笔记3_第15张图片
缓存响应指令
图解HTTP--笔记3_第16张图片
no-cache 指令
图解HTTP--笔记3_第17张图片
max-age 指令

Connection :Connection 首部字段具备如下两个作用。① 控制不再转发给代理的首部字段      ②管理持久连接 。

Date :首部字段 Date 表明创建 HTTP 报文的日期和时间。HTTP/1.1 协议使用在 RFC1123 中规定的日期时间的格式,之前的 HTTP 协议版本中使用在 RFC850 中定义的格式,除此之外,还有一种格式。它与 C 标准库内的 asctime() 函数的输出格式一致。

Pragma :Pragma 是 HTTP/1.1 之前版本的历史遗留字段,仅作为与 HTTP/1.0的向后兼容而定义。

Trailer :首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段。该首部字段可应用在 HTTP/1.1 版本分块传输编码时。

Transfer-Encoding :首部字段 Transfer-Encoding 规定了传输报文主体时采用的编码方式。

Upgrade :首部字段 Upgrade 用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。上图用例中,首部字段 Upgrade 指定的值为 TLS/1.0。请注意此处两个字段首部字段的对应关系,Connection 的值被指定为 Upgrade。Upgrade 首部字段产生作用的 Upgrade 对象仅限于客户端和邻接服务器之间。因此,使用首部字段 Upgrade 时,还需要额外指定Connection:Upgrade。对于附有首部字段 Upgrade 的请求,服务器可用 101 SwitchingProtocols 状态码作为响应返回。

Via :使用首部字段 Via 是为了追踪客户端与服务器之间的请求和响应报文的传输路径。报文经过代理或网关时,会先在首部字段 Via 中附加该服务器的信息,然后再进行转发。这个做法和 traceroute 及电子邮件的 Received首部的工作机制很类似。首部字段 Via 不仅用于追踪报文的转发,还可避免请求回环的发生。所以必须在经过代理时附加该首部字段内容。上图用例中,在经过代理服务器 A 时,Via 首部附加了“1.0gw.hackr.jp (Squid/3.1)”这样的字符串值。行头的 1.0 是指接收请求的服务器上应用的 HTTP 协议版本。接下来经过代理服务器 B 时亦是如此,在 Via 首部附加服务器信息,也可增加 1 个新的 Via 首部写入服务器信息。Via 首部是为了追踪传输路径,所以经常会和 TRACE 方法一起使用。比如,代理服务器接收到由 TRACE 方法发送过来的请求(其中Max-Forwards: 0)时,代理服务器就不能再转发该请求了。这种情况下,代理服务器会将自身的信息附加到 Via 首部后,返回该请求的响应。 

Warning :HTTP/1.1 的 Warning 首部是从 HTTP/1.0 的响应首部(Retry-After)演变过来的。该首部通常会告知用户一些与缓存相关的问题的警告。

图解HTTP--笔记3_第18张图片
首部字段 Trailer 会事先说明在报文主体后记录了哪些首部字段    
图解HTTP--笔记3_第19张图片
首部字段 Transfer-Encoding 规定了传输报文主体时采用的编码方式  
图解HTTP--笔记3_第20张图片
图解HTTP--笔记3_第21张图片
首部字段 Via
图解HTTP--笔记3_第22张图片
Warning 首部

你可能感兴趣的:(图解HTTP--笔记3)