http1.0 1.1 2.0 3.0:
http1.0,在发送完一个http响应后,会断开tcpl链接
http1.1,除非进行设定,否则浏览器和服务器会维持一段tcp链接。不支持多路tcp。流水线式工作,要保证顺序正确
http2.0,支持多路tcp。同时,每个流相对独立,所以不需要按照顺序发送或者接收
http3.0。2020年后才开始发布,称为quic的新协议
HTTP协议发展
1、 HTTP历史进程
- HTTP 0.9(1991年)只支持get方法不支持请求头;
- HTTP 1.0(1996年)基本成型,支持请求头、富文本、状态码、缓存、连接无法复用;
- HTTP 1.1(1999年)支持连接复用、分块发送、断点续传;
- HTTP 2.0(2015年)二进制分帧传输、多路复用、头部压缩、服务器推送等;
- HTTP 3.0(2018年)QUIC 于2013年实现、2018年正式更名为HTTP3;
2 、HTTP 1.0和HTTP1.1
- 队头阻塞:下个请求必须在前一个请求返回后才能发出,导致带宽无法被充分利用,后续请求被阻塞(HTTP 1.1 尝试使用流水线(Pipelining)技术,但先天 FIFO(先进先出)机制导致当前请求的执行依赖于上一个请求执行的完成,容易引起队头阻塞,并没有从根本上解决问题)
- 协议开销大:header里携带的内容过大,且不能压缩,增加了传输的成本
- 单向请求:只能单向请求,客户端请求什么,服务器返回什么
HTTP 1.0和HTTP 1.1的区别:
HTTP 1.0 | HTTP 1.1 |
---|---|
仅支持保持短暂的TCP连接(连接无法复用) | 默认支持长连接(请求可复用TCP连接) |
不支持断点续传 | 支持断点续传(通过在 Header 设置参数) |
前一个请求响应到达之后下一个请求才能发送,存在队头阻塞 | 优化了缓存控制策略 |
/ | 管道化,可以一次发送多个请求,但是响应仍是顺序返回,仍然无法解决队头阻塞的问题 |
/ | 新增错误状态码通知 |
/ | 请求消息和响应消息都支持Host头域 |
3、 HTTP2
解决 HTTP1 的一些问题,但是解决不了底层 TCP 协议层面上的队头阻塞问题。
- 二进制传输:二进制格式传输数据解析起来比文本更高效;
- 多路复用:重新定义底层 http 语义映射,允许同一个连接上使用请求和响应双向数据流。同一域名只需占用一个 TCP 连接,通过数据流(Stream)以帧为基本协议单位,避免了因频繁创建连接产生的延迟,减少了内存消耗,提升了使用性能,并行请求,且慢的请求或先发送的请求不会阻塞其他请求的返回;
- Header压缩:减少请求中的冗余数据,降低开销;
- 服务端可以主动推送:提前给客户端推送必要的资源,这样就可以相对减少一点延迟时间
- 流优先级:数据传输优先级可控,使网站可以实现更灵活和强大的页面控制;
- 可重置:能在不中断 TCP 连接的情况下停止数据的发送;
缺点:HTTP 2中,多个请求在一个TCP管道中的,出现了丢包时,HTTP 2的表现反倒不如HTTP 1.1了。因为 TCP 为了保证可靠传输,有个特别的“丢包重传”机制,丢失的包必须要等待重新传输确认,HTTP 2出现丢包时,整个 TCP 都要开始等待重传,那么就会阻塞该TCP连接中的所有请求。而对于 HTTP 1.1 来说,可以开启多个 TCP 连接,出现这种情况反到只会影响其中一个连接,剩余的 TCP 连接还可以正常传输数据。
4 HTTP3——QUIC
HTTP 是建立在 TCP 协议之上,所有 HTTP 协议的瓶颈及其优化技巧都是基于 TCP 协议本身的特性,HTTP2 虽然实现了多路复用,底层 TCP 协议层面上的问题并没有解决(HTTP 2.0 同一域名下只需要使用一个 TCP 连接。但是如果这个连接出现了丢包,会导致整个 TCP 都要开始等待重传,后面的所有数据都被阻塞了),而 HTTP3 的 QUIC 就是为解决 HTTP2 的 TCP 问题而生。
参考视频:
https://www.bilibili.com/video/BV1rV4y1p7DF/
同时可以网上搜索一下相关资料或者看一下b站和youtube相关视频进行深入了解