# 第二章 简单的 HTTP 协议

# 基本概念

HTTP 协议用于客户端和服务器端之间的通信

HTTP 通过请求和响应的交换达成通信

HTTP 是一种不保存状态,即无状态协议。HTTP 协议自身不对请求和响应间的通信状态进行保存,为了实现保存状态功能,后来引入了 Cookie 技术

HTTP 协议使用 URI 定位互联网上的资源,如果不是访问特定资源而是对服务器本身发起请求,可以用一个*来代替请求 URI

# 基于 HTTP 的组件系统

HTTP 是一个 client-server 协议:请求通过一个实体被发出,实体也就是用户代理。大多数情况下,这个用户代理都是指浏览器,当然它也可能是任何东西,比如一个爬取网页生成维护搜索引擎索引的机器爬虫。

# 客户端

user-agent 就是任何能够为用户发起行为的工具。这个角色通常都是由浏览器来扮演。一些例外情况,比如是工程师使用的程序,以及 Web 开发人员调试应用程序。

浏览器总是作为发起一个请求的实体,他永远不是服务器(虽然近几年已经出现一些机制能够模拟由服务器发起的请求消息了)。

# 服务端

在上述通信过程的另一端,是由 Web Server 来服务并提供客户端所请求的文档。Server 只是虚拟意义上代表一个机器:它可以是共享负载(负载均衡)的一组服务器组成的计算机集群,也可以是一种复杂的软件。

Server 不一定是一台机器,但一个机器上可以装载的众多 Servers。

# 代理

在浏览器和服务器之间,有许多计算机和其他设备转发了 HTTP 消息。由于 Web 栈层次结构的原因,它们大多都出现在传输层、网络层和物理层上,对于 HTTP 应用层而言就是透明的,虽然它们可能会对应用层性能有重要影响。还有一部分是表现在应用层上的,被称为代理(Proxies)。

代理主要有如下几种作用:

  • 缓存(可以是公开的也可以是私有的,像浏览器的缓存)
  • 过滤(像反病毒扫描,家长控制...)
  • 负载均衡(让多个服务器服务不同的请求)
  • 认证(对不同资源进行权限管理)
  • 日志记录(允许存储历史信息)
  • 流量加密 (客户端和代理之间进行加密通讯,绕过运营商检测等)

# 缓存

缓存是指代理服务器或客户端本地磁盘内保存的资源副本,利用缓存可减少对源服务器的访问。

代理服务器会根据客户端的要求,缓存的有效期限等因素,去对源服务器确认资源的有效性。若判断缓存失效,则向源服务器重新请求资源,当然也会保存资源为新的缓存。

同样,客户端浏览器本身也由缓存,通常把客户端的缓存成为临时网络文件,它的工作机制和代理服务器是一样的

# 其他概念

虚拟主机:在相同的 IP 地址下,虚拟主机可以寄存多个不同主机名和域名的 Web 网站。

代理:代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理由多种使用方法,按两种基准分类,一种时是否使用缓存,另一种时是否会修改报文。

网关:网关的工作机制和代理十分相似,而网关能时通信线路上的服务器提供非 HTTP 协议服务。利用网关能提高通信的安全性,因为,网关可以在客户端与网关之间的通信线路上进行加密以确保连接的安全。

隧道:隧道可按要求建立起一条与其他服务器的通信线路,届时使用 SSL 等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。隧道技术是 VPN 技术的基础。

# 持久连接

HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开 TCP 连接。随着 HTTP 的普及,文档中包含大量媒体资源的情况多了起来,每个资源的请求都会造成无谓的 TCP 连接建立和断开,这增大了通信量的开销。

为了解决这个问题,HTTP1.1 提出了持久连接 HTTP Persistent Connections 也成为 HTTP keep-alive,持久连接的特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接。

管线化技术,从前发送请求后需等待并接收到响应,才能发送下一个请求,管线化技术出现后,不用等待亦可直接发送下一个请求。对应目前 JavaScript 中的同步任务和异步任务。

同步

异步

# HTTP 能控制什么

以下是可以被 HTTP 控制的常见特性。

  • 缓存
  • 开放同源限制
  • 认证 HTTPBasic 认证 和 Cookie 会话认证及管理
  • 代理和隧道
  • 会话

使用 HTTP Cookies 允许你用一个服务端的状态发起请求,这就创建了会话。虽然基本的 HTTP 是无状态协议。这很有用,不仅是因为这能应用到像购物车这样的电商业务上,更是因为这使得任何网站都能轻松为用户定制展示内容了。

TIP

简而言之,使用Cookie来分辨用户。