参考链接
- 从 HTTP/1 到 HTTP/2,以及即将到来的 HTTP/3, https://www.upyun.com/tech/article/465/%E4%BB%8E%20HTTP%2F1%20%E5%88%B0%20HTTP%2F2%EF%BC%8C%E4%BB%A5%E5%8F%8A%E5%8D%B3%E5%B0%86%E5%88%B0%E6%9D%A5%E7%9A%84%20HTTP%2F3.html
http 发展史
最原始的 HTTP/0.9
只允许 Get 请求**支持许多种请求方式
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/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延迟**时间.
缓存支持
所有 HTTP 1.1 请求里的响应头都包含了“Date:”标头,因此每个 Response 都为缓存添加了时间戳。
请求头引入了 range 头域
它允许只请求资源的某个部分,即返回状态码是 206(Partial Content),这样就方便了开发者自由的选择,以便于充分的利用带宽和连接。
采用分块传输编码
对于一些很耗时的动态操作,服务器需要等到所有操作完成后才能发送数据,显然这样的效率不高。更好的处理方法是,产生一块数据,就发送一块,采用流模式来取代缓存模式。
新增了多个请求方法和错误状态码
包括 PUT、PATCH、HEAD、OPTIONS、DELETE。另外,客户端请求的头信息中新增了 Host 字段,用来指定服务器的域名。同时新增了 24 个错误状态码。
HTTP/1.1 的缺点
HTTP/1.1 还是可能会发送阻塞**
由于各个请求到达服务器的速度不同,如果先发的请求先到达可能会发生阻塞,剩下所有的请求都会被阻塞在那次请求应答之后,这样就降低了带宽。
HTTPS 提升安全性
HTTP/2 进一步优化性能
多路复用
HTTP/2 使用多路复用技术,使用一个 TCP 连接并发处理多个请求,不但节约了开销而且可处理请求的数量也比 HTTP 1.1 大了很多.
二进制传输数据
HTTP/2 采用二进制格式传输数据,而非 HTTP 1.x 的文本格式,二进制协议解析起来更高效.
头部压缩
HTTP 1.1 不支持 Header 数据压缩,HTTP/2 使用 HPACK 算法对 Header 的数据进行压缩,使得数据传输更快.
服务器推送
当对支持 HTTP/2 的服务器请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到服务器,这种方式适用于加载静态资源,节约带宽.