
http协议各个版本的优缺点

http1.1
发布时间:1997 年发布的 http1.1
特点
- 持久化连接:指第一次请求时 tcp 三次握手后,第二次请求不需要再进行 tcp 连接。服务器可设置 keep-alive 超时时间。默认开启
- 管道化:在一个连接上可以同时发送多个请求。但是这里面的问题是先发送一定要保证先接收,服务端要确保客户端接收的先后顺序,这就会导致服务端开发成本增高,所以几乎没人使用。
说明:如果没使用管道化的技术,http1.1 的特点就是一次一份请求。(http2.0 的多路复用可以看作是对 http/1.1 中的管道化的一种改进和补充)
注意:在未使用管道化的时候,一个持久连接(Keep-Alive 连接)可以被用来发送多个请求(上一次请求完成后,进行下一次请求),而不需要每次请求都建立一个新的连接。这是通过在请求头部添加 Connection: keep-alive 字段来实现的。上述中的一次一份指的是:客户端一次只发送一个请求。
缺点
会造成队头阻塞,由于几乎没人使用管道化技术,所有 http1.1 会造成队头阻塞。比如说我有 html、css、js 三个文件,客户端在第一次请求得到了 html 文件,在根据 html 内容获取 css 和 js,发送获取 css 请求后请求丢失(前端这个时候如果设置等待超时时间是 3 秒),那么一定会在这个 css 丢失或完成后才会请求 js,这个时候就可能会造成队头阻塞 3 秒。如果一次连接可以同时发送 3 次请求就不会造成这个问题,接下来我就会引入 http2.0 的多路复用的概念。
解决方案
为了解决队头阻塞产生的一系列问题,http2 之前,很多开发者就使用了:雪花图、域名分片、将 css js html 整合在一个文件等方法。 中心思想就是:1. 减少关联性文件的请求次数。2. 增加连接数。其中域名分片就是为了增加请求连接数,在 chrome 浏览器中同一个域名只能在同一时刻最多存在 6 个持久连接(连接的开启与关闭是浏览器自己控制的),基于此规则开发者会将不同的资源放在不同的子域名下。
http2.0
发布时间: 2015 年发布的 http2.0
特点
- 多路复用:允许一个链接可以同时发送多个请求,解决了队头阻塞的问题。
- 头部压缩:在 http2.0 中,采用了 HPACK 算法压缩。在 http1.1 中,报文体压缩,头部不压缩。http1.1 中头部字段是由 ASCII 字符集组成的,http2.0 头部压缩后是 2 进制编码。
- 服务器推送。
说明:
在 http2.0 传输过程中,将首部和和实体分为了首部帧和数据帧,这些帧可以被同时发送,且可以在同一个连接上交错传输,在每个帧中都会存在一个流标识符和对应的权重,接收方会根据这个标识符重新组装数据,所以这些帧就不用按序到达,解决了应用层队头阻塞的问题
缺点
多路复用只解决了应用层的队头阻塞,并未解决传输层的队头阻塞,因为使用的是 tcp 协议,所以后面引入 http3.0 在传输层解决了队头阻塞的问题。
服务器推送,会导致不对称的 DDoS 攻击。
http3.0
发布时间:2019 年发布的 http3.0
特点
- 不在采用 tcp 协议,而是在传输层中,在 UDP 协议上增加了一个新的 QUIC 的协议
- 流控制:在传输层传输的数据帧都有对应的流标识符,保证传输层的多个帧按顺序排列
- 头部压缩
- 每次传输的时候都会有一个连接 ID,IP 变化后保证了 0-RTT,不用再次沟通重新连接
说明:
- 在传输层解决了队头阻塞的问题。
- QUIC 协议是整合了 TCP 和 TLS 协议
其他说明
TCP 除了 3 次握手固定的开销外,还有一个 TCP 慢启动。在 TCP 慢启动中,一开始只会发送较小的数据段,后续慢慢增加。所以我们在第一次进入一个新的网页会很慢。
- 标题: http协议各个版本的优缺点
- 作者: 兰涛
- 创建于 : 2024-01-23 09:26:45
- 更新于 : 2024-01-26 09:46:15
- 链接: https://lands.work/a4f29881/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。