本文介绍http1.0/1.1/2.0/3.0的演化过程和各自的特性及优缺点
1. HTTP/1.0
优点:
- 简单易实现:HTTP/1.0设计非常简单,容易实现并广泛应用于早期的互联网。
- 请求/响应模式:通过简单的请求/响应模式,能够高效地传输HTML文档和其他资源。
缺点:
- 每个请求一个连接:HTTP/1.0中,每个请求都需要建立一个新的TCP连接,这导致了大量的连接开销(如TCP握手)。
- 带宽利用率低:每次请求都需要一个独立的连接,并且连接往往在响应后立即关闭,无法有效利用带宽。
- 无状态:HTTP/1.0是无状态协议,服务器无法识别是否是同一个客户端发起的连续请求,难以实现会话管理。
问题: HTTP/1.0的问题主要集中在连接管理和带宽利用率上。随着网络应用的复杂性增加,HTTP/1.0显得不足。
总结:http1.0适用于早期互联网,设计简单。缺点:1.短链接,导致大量连接开销(tcp连接过程和资源申请释放)2.无状态,每个请求一个连接,无法识别同一个客户端的多个连续请求,无法实现会话管理如购物车
2. HTTP/1.1
优点:
- 持久连接:引入了持久连接(Keep-Alive),允许多个请求和响应通过同一个TCP连接传输,减少了连接建立和关闭的开销。
- 管道化:HTTP/1.1支持请求管道化(Pipelining),即可以在收到前一个响应之前发送下一个请求,从而提高传输效率。
- 缓存控制:增加了更细粒度的缓存控制头部字段(如
Cache-Control
),以更好地利用客户端和代理服务器的缓存。 - 带宽优化:支持分块传输编码(Chunked Transfer Encoding),允许在传输过程中动态生成内容,减少了传输延迟。
- 虚拟主机:通过
Host
头部字段支持同一IP地址托管多个域名(虚拟主机),提升了服务器资源利用率。
缺点:
- 头部阻塞:服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;虽然引入了管道化,但由于存在“队头阻塞”(Head-of-Line Blocking)问题,导致性能提升有限,特别是在高延迟网络中。
- 复杂性增加:引入的多个新特性使得实现和调试变得更加复杂。
- 头部冗长:请求/响应头部未经压缩直接发送,首部信息过长会造成延迟
- 单向请求:请求只能由客户端开始,服务端被动响应
问题解决: HTTP/1.1解决了HTTP/1.0中每次请求都需要建立新连接的问题,显著提升了带宽利用率和传输效率。然而,队头阻塞问题仍然未能有效解决。
总结:1.http1.1改进了http1.0的短链接问题,支持长连接;2.支持pipline连续发送请求,性能优于一请求一响应模式;3.虽然支持pipline但服务器的响应是按顺序的,如果服务器响应慢,会造成‘队头阻塞’问题;4.仅支持压缩body,不能压缩头部,会造成网络延迟 5.单向请求,只能由客户端发起请求,服务器被动响应,不能灵活处理业务
3. HTTP/2.0
优点:
- 二进制协议:HTTP/2.0改用二进制格式传输数据,而不是HTTP/1.x的文本格式,发送和解析都直接使用二进制,提高了解析效率和传输可靠性。
- 多路复用:使用streamID,允许同一连接上并行发送多个请求和响应,彻底解决了队头阻塞问题,显著提升了传输性能。一个tcp连接可以包含多个stream,每个stream可以包含多个message(包含头部和包体),每个message包含多个frame,即http2最小单位;对于不同的http请求,根据streamID来区分,因此支持并行发送,服务端可以根据ID来进行消息的组装和回复
- 头部压缩:通过HPACK算法对HTTP头部进行压缩,减少了带宽占用,尤其是在多次请求相似资源时。HPACK算法:客户端和服务端同时维护一张头部信息表,所有头部字段存入表,生成唯一索引号,当发送相同的头部时,只发送索引号
- 服务器推送:允许服务器在客户端请求之前主动推送资源,减少了客户端等待时间,提升了页面加载速度。
缺点:
- 实现复杂性:HTTP/2.0的实现更加复杂,对服务器和客户端的要求更高。
- 不兼容旧设备:由于引入了新特性,部分旧设备或不支持HTTP/2.0,或需要降级到HTTP/1.1。
问题解决: HTTP/2.0主要解决了HTTP/1.1中的队头阻塞问题,并通过多路复用和头部压缩等技术显著提高了传输效率和用户体验。
推荐学习 https://xxetb.xetslk.com/s/p5Ibb