Appearance
http 发展史
http0.9--1991年
http0.9 是最早的http版本,它由 Tim Berners-Lee 在 1991 年设计并实现,是万维网(World Wide Web)的基础协议之一
特点:
- 只支持get请求方法
- 只返回html文件的正文信息,没有header信息,不能传输多媒体文件或动态内容,只能传输静态超文本
- 无状态的,没有状态码和错误处理
- 数据返回后立即关闭tcp连接,没有持久连接,不能缓存数据,不能处理大文件传输
http1.0 -- 1996年
特点:
- 在 http0.9 的基础上,新增了 POST(用于提交数据),HEAD(获取文档元数据,不返回文档主体) 请求方法
- 增加了请求状态码,用来标识服务端对客户端的请求处理结果
- 增加了 http 头部信息,用于描述请求和响应的元数据。例如利用 content-type 来传输除 html 外的其他内容类型,如图片、音频、视频等
- 通过 connection:keep-alive 来控制连接是否持久连接,如果为 close,则表示关闭连接,如果为 keep-alive,则表示保持连接打开状态,默认为 close
尽管 http1.0 已经新增了很多特性,但是它依然存在一些问题,比如:
- 不支持虚拟主机,即一个服务器上不能同时运行多个网站,如果要运行多个网站,则需要使用多个服务器。
- 缓存机制不完善,引入了简单的缓存机制(expires, last-modified)
- 队头阻塞,资源加载是串行的,一个请求响应结束后才能继续下一个请求,无法通过并行处理多个请求
http1.1 -- 1997年
特点:
- 引入管道化,允许用户在一个tcp连接中发送多个请求,且无需等待每个请求返回才能发送下一个请求。
- 支持传输编码机制,引入transfer-encoding,允许服务器在响应体长度不确定的情况下,对响应内容进行动态分块传输或压缩传输。
- 完善缓存机制,引入更多缓存字段和灵活的缓存策略(catch-control,Etag,If-None-Match)
存在的问题
- 尽管已经引入管道话,可以并行处理请求,但是所有请求必须按顺序返回,即第一个请求延迟会影响后面的请求
http2.0 -- 2015年
特点:
- 头部压缩,减少请求头大小,提高效率
- 二进制分帧,将http1.1文本格式改为二进制格式传输数据,提高传输效率
- 引入多路复用,允许在一个tcp连接中同时发送多个请求,且无需等待每个请求返回才能发送下一个请求
- 服务器推送,服务器可以主动向客户端推送数据,减少客户端请求次数
存在的问题
- 队头阻塞,TCP 队头阻塞造成的影响会更大,因为 HTTP/2 的多路复用技术使得多个请求其实是基于同一个 TCP 连接的,那如果某一个请求造成了 TCP 队头阻塞,那么多个请求都会受到影响。