HTTP/1.1规范允许一台HTTP服务器搭建多个web站点。
即使物理层面只有一台服务器,但只要使用虚拟主机的功能,就可以假想已经具有多台服务器。
在互联网上,域名通过DNS服务映射到IP地址之后才访问目标网站,所以说,当请求发送到服务器,就已经是以IP地址的方式来访问了。
而如果一台服务器托管了多个域名,所以在域名映射成IP地址后,我们并不能知晓目标到底要访问哪个域名,所以,我们必须在Host首部内完整指定主机名或者域名的URI。
在HTTP通信时,除了客户端与服务器以外,还有一些进行通讯数据转发的应用程序,例如
:代理、网关和隧道。
代理:
代理是一种具有转发功能的应用程序,那么为什么要有代理这一步呢?不是多次一举吗?
使用代理服务器的理由有:
- 利用缓存技术减少网络带宽的流量
- 组织内部对特定网站的控制
- 以获取访问日志为主要目的
持有资源实体的服务器被称为源服务器。
在HTTP通信过程中,可级联多台代理服务器,但是要注意,转发时,需要附加Via首部字段以标记经过的主机信息。
代理的方式有很多,按照两种基准分类。
一种是是否缓存
另一种是是否会修改报文
缓存代理:
代理转发响应时,缓存代理会预先将资源的副本(缓存)保存到代理服务器上,当代理服务器再次接收对同样资源的请求的时候,就可以直接调用缓存。
透明代理:
转发请求或者响应时,不对报文做任何加工的代理类型被称为透明代理。反之,则被称为非透明代理。
网关:
网关是转发其他服务器通信数据的服务器,接收从客户端发过来的请求时,会直接对请求进行处理,有时候客户端不会察觉到它的目标是一个网关。
那么网关为什么要存在呢?
- 网关能使通信线路上的服务器提供非HTTP协议服务
- 利用网关能提高通信的安全性
- 网关可以在客户端与网关之间的通信线路上加密以确保连接的安全
- 网关具备一定的联动功能,例如网关可以连接数据库,使用SQL语句查询数据
隧道:
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
隧道可以按照要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。
那么隧道为什么要存在呢?
隧道可以确保客户端能与服务器进行安全的通信。
隧道本身不会去解析HTTP请求,隧道中请求会保持原样转发给下一步服务器。隧道会在通信双方断开连接时结束。
缓存:
缓存是指代理服务器或客户端本地磁盘内保存的资源副本,利用缓存可以减少对源服务器的访问,这样就可以节省通信流量和通信时间。
缓存服务器是代理服务器的一种,而且属于缓存代理类型。
缓存的有效期限:
若在缓存服务器中存在缓存,缓存服务器会根据客户端的需求、缓存的有效期等因素。按照规则向源服务器确认资源的有效性。若判断缓存失效,缓存服务器将会再次从源服务器获取资源。
客户端的缓存:
缓存不仅可以存在缓存服务器内,还可以存在客户端浏览器中,在客户端的缓存称为临时网络文件。
浏览器缓存如果有效,就不必再向服务器请求相同的资源了,可以直接从本地磁盘中读取。
浏览器缓存也会根据要求向源服务器确认资源的有效性,若失效则再次请求资源。
参考书籍:《图解HTTP》上野宣 著 于均良 译