参考链接

HTTP/0.9 是 HTTP 协议的第一个版本, 只允许客户端发送 GET 这一种请求,而且不支持请求头。

没有报文头, 只支持纯文本

后面有个 context-type

由于没有协议头,所以 HTTP/0.9 只能支持一种内容——纯文本。服务器只能回应 HTML 格式的字符串,不能回应别的格式。

服务器发送后会关闭 TCP

http 后面加了报文头, Connection: keep-alive

服务器发送完毕后,就会关闭 TCP 连接。

无状态, 每个访问独立

这个应该被认为是优点, 保留到了今天.

HTTP/0.9 具有典型的无状态性,每个访问都独立处理,处理完成后就会断开连接。

不返回错误码

http1 新增了 response 报文

如果请求的页面不存在,也不会返回任何错误码。

HTTP/1 的改进

HTTP/1 是 HTTP 1.0 和 HTTP 1.1 的统称,分别指 HTTP 协议的版本是 1.0 和 1.1。
HTTP/1 就是如今的 HTTP. 做了如下改进:

HTTP/0.9 HTTP/1.0
只允许 Get 请求
在 GET 的基础上,增加了 HEAD 和 POST 请求方法
没有报文头, 只支持纯文本
可以发送更多格式的内容,如图像、视频、二进制文件,不仅仅局限于文本了
服务器发送后会关闭 TCP 在请求(request)中增加 了“Connection: keep-alive”Header 头后就能支持长连接.
无状态, 每个访问独立 保留
不返回错误码 新增了响应状态码(status code)、多字符集支持、权限(authorization)、缓存(cache)、内容编码(content encoding)等功能
从整体设计上优化:
改变了 HTTP 请求和回应的格式。除了数据部分,每次通信都必须包括头信息(HTTP Header),用来描述一些元数据,即增加了请求头信息

HTTP/1.1 的性能优化

HTTP/1.1 的改进主要在体现在性能优化上.

对长连接的性能优化

HTTP/0.9 HTTP/1.0 HTTP/1.1
服务器发送完毕后,就会关闭 TCP 连接。 HTTP 1.0 默认不支持长连接,这样就增加了 TCP 连接次数,造成开销浪费。 在 HTTP 1.1 中默认开启 “Connection: keep-alive”,一定程度上弥补了 HTTP 1.0 每次请求都要创建连接的缺点。
HTTP 1.0 所保持的 TCP 每次只能处理一个请求,虽然能一次性接收多个请求,但是还是得按顺序一次处理一个请求,这样在后续请求等待前序请求完成时,很容易造成阻塞。 HTTP 1.1 支持长连接和请求的流水线处理,在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟。
不支持断点续传。

短连接和长连接

  • HTTP/1.1 创建一个 TCP, 能处理多个 HTTP 请求, 避免了反复创建 TCP 连接带来的开销.
  • tcp建立连接, 需要 “**3次握手建立链接和断开连接的4次挥手“以及每次建立连接带来的RTT延迟**时间.

image.png

缓存支持

所有 HTTP 1.1 请求里的响应头都包含了“Date:”标头,因此每个 Response 都为缓存添加了时间戳。

请求头引入了 range 头域

它允许只请求资源的某个部分,即返回状态码是 206(Partial Content),这样就方便了开发者自由的选择,以便于充分的利用带宽和连接。

采用分块传输编码

对于一些很耗时的动态操作,服务器需要等到所有操作完成后才能发送数据,显然这样的效率不高。更好的处理方法是,产生一块数据,就发送一块,采用流模式来取代缓存模式。

新增了多个请求方法和错误状态码

包括 PUT、PATCH、HEAD、OPTIONS、DELETE。另外,客户端请求的头信息中新增了 Host 字段,用来指定服务器的域名。同时新增了 24 个错误状态码。

HTTP/1.1 的缺点


HTTP/1.1 还是可能会发送阻塞**
由于各个请求到达服务器的速度不同,如果先发的请求先到达可能会发生阻塞,剩下所有的请求都会被阻塞在那次请求应答之后,这样就降低了带宽。

HTTPS 提升安全性

HTTPS 单独讲.

HTTP/2 进一步优化性能

HTTP/2 是基于 SPDY 协议。

多路复用

HTTP/2 使用多路复用技术,使用一个 TCP 连接并发处理多个请求,不但节约了开销而且可处理请求的数量也比 HTTP 1.1 大了很多.

二进制传输数据

HTTP/2 采用二进制格式传输数据,而非 HTTP 1.x 的文本格式,二进制协议解析起来更高效.

头部压缩

HTTP 1.1 不支持 Header 数据压缩,HTTP/2 使用 HPACK 算法对 Header 的数据进行压缩,使得数据传输更快.

服务器推送

当对支持 HTTP/2 的服务器请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到服务器,这种方式适用于加载静态资源,节约带宽.