介绍
HTTP协议是如今互联网与服务端技术的基石,HTTP协议的演变也从侧面反映了互联网技术的快速发展。
历史

1、 HTTP 0.9
HTTP 0.9 是 HTTP协议 的第一个版本,已过时。
它的组成极其简单,只允许客户端发送 GET 一种请求,且不支持请求头。由于没有协议头,造成了HTTP 0.9 只支持一种内容,即纯文本。不过网页仍然支持用 HTML 语言格式化,同时无法插入图片资源。
HTTP 0.9 具有典型的无状态性,每个事务独立进行处理,事务结束后就销毁这个连接。由此可见,HTTP协议的无状态特点在其 第一个版本0.9 中已经成型。一次 HTTP 0.9 的传输首先要建立一个由客户端到 Web服务器 的 TCP 连接,有客户端发起一个请求,然后由 Web服务器 返回页面内容,然后销毁连接关闭。如果请求的页面不存在,也不会返回任何错误码。
2、HTTP 1.0
HTTP 1.0 是 HTTP协议 的第二个版本。至今仍被广泛采用。
是首个在通讯中指定版本号的HTTP协议版本。
相对于 HTTP 0.9 增加了如下主要特性:
- 请求头 与 响应头
- 响应对象以一个响应状态行开始
- 响应对象不只限于超文本
- 支持GET、HEAD、POST方法。
- 支持长连接(但默认还是使用短连接)
3、HTTP 1.1
HTTP 1.1 是 HTTP协议 的第三个版本。是目前使用最广泛的版本。
HTTP 1.1 引入了许多关键性能优化:keep-alive连接、chunked编码传输、字节范围请求、请求流水线。
-
Persistent Connection(keep-alive连接)
允许
HTTP协议在事务处理结束后将 TCP连接 保持在打开的状态,以便未来的HTTP请求重用现在的连接,直到客户端或服务端决定将其关闭为止。在
HTTP 1.0中使用长连接需要添加请求头Connection: keep-alive,而在 HTTP 1.1 中所有的连接默认都是长连接,除非特殊声明不支持(HTTP请求头加上Connection: close)

-
chunked编码传输
该编码将实体分块传送并逐块标明长度,直到长度为0块表示传输结束, 这在实体长度未知时特别有用(比如由数据库动态产生的数据)
-
字节范围请求
HTTP 1.1支持只传送内容的一部分。比方说,当客户端已经有请求内容的一部分内容了,为了节省带宽,可以只向服务器请求一部分。该功能通过在 请求头中加入
range字段来实现,它允许只请求资源的某个部分。而在响应头中的Content-Range字段返回的则是这部分内容的偏移量和长度。如果服务器成功返回了内容的部分内容,则响应码为206(Partial Content)
-
Pipelining(请求流水线)

另外,HTTP 1.1 还新增了如下特性:
-
请求头 和 响应头 都应支持 Host 字段
在
HTTP 1.0中认为每台服务器都绑定一个唯一的 IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。因此,Host头的引入就很有必要了。 -
新增了一批 Request Method
HTTP 1.1增加了 OPTIONS、PUT、DELETE、TRACE、CONNECT方法。 -
缓存处理
HTTP 1.1在HTTP 1.0的基础上加入了一些cache的新特性,如引入了ETag(实体标签)、Cache-Control。
4、HTTP 2.0
HTTP 2.0 是下一代 HTTP协议,目前应用还非常少。
HTTP 2.0 最大的特点:不会改动 HTTP协议 的语义、HTTP方法、状态码、URI 及 首部字段等等这些核心概念一如往常,却能突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。而之所以叫 2.0,是在于新增的 二进制分帧层。
-
多路复用(二进制分帧)
将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码,其中
HTTP 1.x的首部消息会被封装到Header帧,而Request body则封装到Data帧里面。
HTTP 2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。相应地,每个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。
-
头部压缩
HTTP 1.x中header有大量信息,且每次都重复发送,HTTP 2.0用encoder减少传输header大小,通讯双方各cashe一份header fileds表。
-
随时复位
HTTP1.1一个缺点是当HTTP信息有一定长度大小数据传输时,你不能方便地随时停止它,中断TCP连接的代价是昂贵的。使用HTTP2的RST_STREAM将能方便停止一个信息传输,启动新的信息,在不中断连接的情况下提高带宽利用效率。
-
服务器推流:Server Push
客户端请求一个资源X,服务器端判断也许客户端还需要资源Z,在无需事先询问客户端情况下将资源Z推送到客户端,客户端接受到后,可以缓存起来以备后用。
-
优先权和依赖
每个流都有自己的优先级别,会表明哪个流是最重要的,客户端会指定哪个流是最重要的,有一些依赖参数,这样一个流可以依赖另外一个流。优先级别可以在运行时动态改变,当用户滚动页面时,可以告诉浏览器哪个图像是最重要的,你也可以在一组流中进行优先筛选,能够突然抓住重点流。
\