HTTP(一)版本

180 阅读4分钟

本文介绍 HTTP(Hyper Text Transfer Protocol,超文本传输协议)的版本发展历程及各版本新增特性。


HTTP/0.9

HTTP/0.9是第一个版本的HTTP协议,只允许客户端发送GET请求,且不支持请求头,由于没有协议头,所以 HTTP/0.9 只支持纯文本。 HTTP/0.9典型的无状态,每个事务独立进行处理,事务结束就释放连接。一次传输首先要建立一个由客户端到Web服务器的TCP连接,由客户端发起一个请求,然后由Web服务器返回页面内容,然后连接关闭,如果请求的页面不存在也不会返回任何错误码。

HTTP/1.0

HTTP/1.0是HTTP协议的第二个版本,相对于HTTP/0.9增加了以下主要特性:

  • 请求与响应支持头域
  • 响应对象以一个响应状态行开始
  • 响应对象不只限于超文本
  • 开始支持客户端通过POST方法向Web服务器提交数据,支持GETHEADPOST方法
  • 支持长连接(默认还是使用短连接),缓存机制以及身份认证

HTTP/1.1

HTTP/1.1是HTTP协议的第三个版本,是目前使用最广泛的协议版本,相对于HTTP/1.0增加了以下主要特性:

  • 默认为长连接 HTTP/1.1支持长连接(PersistentConnection)和请求的流水线(Pipeline)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP/1.1中默认开启Connection: keep-alive,弥补了HTTP/1.0每次请求都要创建连接的缺点。
  • 提供了范围请求功能(宽带优化) HTTP/1.0中存在一些浪费带宽的现象,如客户端只需要某对象的一部分,而服务器却将整个对象送过来,并且不支持断点续传功能,HTTP/1.1在请求头引入了range头域,允许只请求资源的某部分,即返回码是206(Partial Content),这样就方便开发者自由选择以便充分利用带宽和连接,这是支持断点续传的基础。
  • 提供了虚拟主机的功能(HOST域) HTTP/1.0中认为每台服务器都绑定一个唯一的IP地址,因此请求消息中URL没有传递主机名(hostname),但随着虚拟主机技术的发展,在一台物理机上可以存在多个虚拟主机(Multi-homed Web Servers),并且这些虚拟主机共享一个IP地址。HTTP/1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误:400 Bad Request
  • 多了一些缓存处理字段 HTTP/1.1HTTP/1.0基础上加入了一些cache新特性,引入了实体标签,一般被称为 e-tags,新增更为强大的Cache-Control头。
  • 错误通知的管理 在HTTP/1.1中新增了24个错误状态响应码,如
    • 409(Conflict):请求的资源与资源当前状态发生冲突
    • 410(Gone):服务器上的某个资源被永久性删除

HTTP/2.0

HTTP/2.0是HTTP协议的第四个版本,相对于HTTP/1.1增加了以下主要特性:

  • 二进制分帧 HTTP/2.0的所有帧都采用二进制编码
    • 帧:客户端与服务器通过交换帧来通信,帧是通信的最小单位。
    • 消息:逻辑上的HTTP消息,比如请求、响应,由一个或多个帧组成。
    • 流:连接中的一个虚拟信道,可以承载双向的消息,每个流都有一个唯一的整数标识符(1、2...N)。
  • 多路复用 允许同时通过单一的HTTP/2.0连接发起多重请求-响应消息。有了新的分帧机制后,HTTP/2.0不再依赖多个TCP连接去处理更多并发的请求。每个数据流都可以拆分成很多互不依赖的帧,而这些帧可以交错(乱序发送),还可以分优先级。最后再在另一端根据每个帧首部的流标识符把它们重新组合起来。HTTP/2.0连接是持久化的,而且客户端与服务器之间也只需要一个连接(每个域名一个连接)。
  • 头部压缩 HTTP/1.1首部带有大量信息,而且每次都要重复发送。HTTP/2.0要求通信双方各自缓存一份首部字段表以避免重复传输。
  • 请求优先级 浏览器可以在发现资源时立即分派请求,指定每个流的优先级,让服务器决定最优的响应次序。这样请求就不必排队了,既节省了时间,也最大限度地利用了每个链接。
  • 服务端推送 服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求、建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。