HTTP/2是为了解决HTTP 1.1性能不佳的问题而诞生的。HTTP 1.1在安全性方面存在不足,且性能有待提高。虽然HTTPS通过引入SSL/TLS在安全性上有所提升,但性能并没有得到显著改进。因此,HTTP/2应运而生,旨在提高HTTP的性能。
HTTP/2兼容HTTP 1.1,保留了诸如HTTP Method、Status code、URI以及大部分Header Fields等特性。同时,HTTP/2在“语法”层做了重大改造,完全变更了HTTP报文的传输方式,包括头部压缩、服务器推送、多路复用等特性。
HTTP/2的优势
多路复用:HTTP/2允许在同一个TCP连接上并发处理多个请求和响应,从而避免了HTTP 1.1中的队头阻塞问题。这一特性使得以前需要的一些优化措施(如雪碧图技术、合并JS和CSS等)变得不再必要。
服务器推送:HTTP/2支持服务器推送,即服务器可以在客户端请求某个资源之前,主动将其他可能需要的资源推送给客户端。这减少了等待时间,提高了页面整体的加载速度。
报文头压缩:HTTP/2采用HPack算法对HTTP头进行压缩,减少了传输的数据量。这一特性尤其对于包含大量重复字段的HTTP头非常有效。
二进制传输:HTTP/2使用二进制格式传输数据,这提高了数据的传输效率,并且减少了解析上的复杂性。
HTTP/2的缺点
浏览器兼容性:虽然现代主流浏览器(如Chrome、Safari、Firefox、Opera等)都支持HTTP/2,但仍有部分旧版本浏览器或特定环境下的浏览器不支持。此外,IE11仅在Windows 10上支持HTTP/2。
加密要求:主要浏览器要求HTTP/2必须使用HTTPS,这增加了部署HTTP/2的成本和复杂性。
部署和维护成本:升级到HTTP/2可能需要更改服务器配置、升级相关软件等,这可能会增加部署和维护的成本。
队头阻塞问题:在HTTP/2中,多个请求是跑在一个TCP管道中的。但当出现了丢包时,HTTP/2 的表现反倒不如 HTTP/1了。因为TCP为了保证可靠传输,有个特别的“丢包重传”机制,丢失的包必须要等待重新传输确认,HTTP/2出现丢包时,整个TCP都要开始等待重传,那么就会阻塞该TCP连接中的所有请求。而对于HTTP/1.1来说,可以开启多个TCP连接,出现这种情况反到只会影响其中一个连接,剩余的 TCP 连接还可以正常传输数据。
HTTP/2存在“队头阻塞”的问题,只不过问题不是在HTTP这一层面,而是在 TCP 这一层。HTTP/2是基于TCP协议来传输数据的,TCP是字节流协议,TCP层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给HTTP应用,那么当“前 1 个字节数据”没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这1个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。
有没有什么解决方案呢?既然是TCP协议自身的问题,那干脆放弃TCP协议,转而使用UDP协议作为传输层协议,这个大胆的决定,HTTP/3协议做了!它在HTTP/2的基础上又实现了质的飞跃,真正“完美”地解决了“队头阻塞”问题。不过HTTP/3目前还处于小范围使用阶段,从2018年提出至今,稳定性和安全性有待时间的检验。