HTTP/1.1、HTTP/2、HTTP/3 基本概述

参考链接
https://xiaolincoding.com/network/2_http/http_interview.html#http-1-1-相比-http-1-0-提高了什么性能

HTTP/1.1

HTTP/1.1 相比 HTTP/1.0 性能上的改进:

  • 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
  • 支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。

但 HTTP/1.1 还是有性能瓶颈:

  1. 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分;
  2. 发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
  3. 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞;(管道对客户端来说可以发送多次请求)
  4. 没有请求优先级控制;
  5. 请求只能从客户端开始,服务器只能被动响应。

HTTP/2

HTTP/2 相比 HTTP/1.1 性能上的改进:

  1. 头部压缩
  2. 二进制格式
  3. 并发传输(多个 Stream 复用在一条 TCP 连接,解决队头阻塞问题)
  4. 服务器主动推送资源
    (客户端和服务器双方都可以建立 Stream, Stream ID 也是有区别的,客户端建立的 Stream 必须是奇数号,而服务器建立的 Stream 必须是偶数号。)
    比如,客户端在访问 HTML 时,服务器可以直接主动推送 CSS 文件,减少了消息传递的次数。
    > 详细解释

https://xiaolincoding.com/network/2_http/http_interview.html#http-2-做了什么优化

HTTP/2 有什么不足?

  • HTTP/2 通过 Stream 的并发能力,解决了 HTTP/1 队头阻塞的问题,但是 HTTP/2 还是存在"队头阻塞"的问题,只不过问题不是在 HTTP 这一层面,而是在 TCP 这一层。
    HTTP/2 是基于 TCP 协议来传输数据的,TCP 是字节流协议,TCP 层必须保证收到的字节数据是完整且连续的,这样内核才会将缓冲区里的数据返回给 HTTP 应用,那么当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里,只有等到这 1 个字节数据到达时,HTTP/2 应用层才能从内核中拿到数据,这就是 HTTP/2 队头阻塞问题。

HTTP/3

HTTP/1.1 和 HTTP/2 都有队头阻塞的问题:

  • HTTP/1.1 中的管道( pipeline)虽然解决了请求的队头阻塞,但是没有解决响应的队头阻塞,因为服务端需要按顺序响应收到的请求,如果服务端处理某个请求消耗的时间比较长,那么只能等响应完这个请求后, 才能处理下一个请求,这属于 HTTP 层队头阻塞。
  • HTTP/2 虽然通过多个请求复用一个 TCP 连接解决了 HTTP 的队头阻塞 ,但是一旦发生丢包,就会阻塞住所有的 HTTP 请求,这属于 TCP 层队头阻塞。
    HTTP/2 队头阻塞的问题是因为 TCP,所以 HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!

详细解释
https://xiaolincoding.com/network/2_http/http_interview.html#http-3-做了哪些优化

UDP 是不可靠传输的,但基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。

QUIC 有以下 3 个特点。

  1. 无队头阻塞

    QUIC 连接上的多个 Stream 之间并没有依赖,都是独立的,某个流发生丢包了,只会影响该流,其他流不受影响。

  2. 更快的连接建立

    对于 HTTP/1 和 HTTP/2 协议,TCP 和 TLS 是分层的,分别属于内核实现的传输层、openssl 库实现的表示层,因此它们难以合并在一起,需要分批次来握手,先 TCP 握手,再 TLS 握手

    HTTP/3 在传输数据前虽然需要 QUIC 协议握手,但是这个握手过程只需要 1 RTT,握手的目的是为确认双方的「连接 ID」和TLS密钥等,连接迁移就是基于连接 ID 实现的。(也可以说,其实这1RTT更多就是属于TLS1.3的握手连接)

  1. 连接迁移
相关推荐
“αβ”3 小时前
MySQL表的操作
linux·网络·数据库·c++·网络协议·mysql·https
十五年专注C++开发3 小时前
Asio2: 一个基于 Boost.Asio 封装的高性能网络编程库
网络·c++·boost·asio·asio2
牛奶咖啡134 小时前
解决配置虚拟网络后同网段的设备网络不通问题
网络·桥接模式·主机模式·配置虚拟网络后同网段设备不通·排查解决同网段同网关网络不通·重置windows主机网络·nas模式
车载测试工程师5 小时前
CAPL学习-ETH功能函数-通用函数
网络·学习·tcp/ip·capl·canoe
ICT技术最前线5 小时前
sdwan组网软件如何帮助企业提升网络效率?
网络·sdwan·宽带组网
老蒋新思维6 小时前
创客匠人洞察:AI 时代 IP 变现的认知重构,从流量焦虑到价值深耕的破局之道
网络·人工智能·tcp/ip·重构·知识付费·创始人ip·创客匠人
Cher ~7 小时前
【协议】ICMP
网络·网络协议
丁丁丁梦涛8 小时前
EMQX配置 ssl 和 wss
网络·网络协议·ssl·emqx·wss
大熊背8 小时前
ISP基本框架及软硬件算法实现介绍目录
网络·接口隔离原则
繁华似锦respect9 小时前
C++ unordered_map 底层实现与详细使用指南
linux·开发语言·c++·网络协议·设计模式·哈希算法·散列表