HTTP版本发展

发展历程

HTTP是什么

  • HTTP 是超文本传输协议,HTTP 不是互联网,也不是编程语言,是一种协议。HTTP 通常跑在 TCP/IP 协议栈之上,依靠 IP 协议实现寻址和路由、TCP 协议实现可靠数据传输、DNS 协议实现域名查找、SSL/TLS 协议实现安全通信。

  • HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语言确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。

  • 所谓 “「文本」”(Text),就表示 HTTP 传输的不是 TCP/UDP 这些底层协议里被切分的杂乱无章的二进制包(datagram),而是完整的、有意义的数据,可以被浏览器、服务器这样的上层应用程序处理。

版本

  1. HTTP/1.0:短链接
    • 浏览器与服务器只保持短暂的连接,连接无法复用。也就是说每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。
    • TCP连接的建立需要三次握手,是很耗费时间的一个过程。所以,HTTP/1.0版本的性能比较差。现在,随便打开一个网页,上面都会有很多图片、视频等资源,HTTP/1.0显然无法满足性能要求。
  2. HTTP/1.1:长链接,管道机制
    • 为了解决HTTP/1.0存在的缺陷,HTTP/1.1于1999年诞生。相比较于HTTP/1.0来说,最主要的改进就是引入了持久连接。所谓的持久连接就是:在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
    • 管道机制,其中一个比较关键的就是服务端必须按照与请求相同的顺序回送HTTP响应。这也就意味着,如果一个响应返回发生了延迟,那么其后续的响应都会被延迟,直到队头的响应送达。这就是所谓的HTTP队头阻塞。
    • image-20231004131936279
  3. HTTP/2.0:报头压缩,二进制分帧,多路复用,全双工
    • 多路复用(multiplexing),多个请求共享一个tcp连接。在二进制分帧层中, HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码,这种单连接多资源的方式,减少了服务端的压力,使得内存占用更少,连接吞吐量更大。而且,TCP连接数的减少使得网络拥塞状况得以改善,同时慢启动时间的减少,使拥塞和丢包恢复速度更快。
    • header压缩,删除或者压缩HTTP头。HTTP/1.1的header带有大量信息,而且每次都要重复发送。HTTP/2 为了减少这部分开销,采用了HPACK 头部压缩算法对Header进行压缩。
    • Stream:HTTP2的请求的TCP的connection一旦建立,后续请求以stream的方式发送。每个stream的基本组成单位是frame(二进制帧)。客户端和服务器可以把 HTTP 消息分解为互不依赖的帧,然后乱序发送,最后再在另一端通过Stream ID把它们重新组合起来。
      • 流优先级:导致变化协议变卡,应该由应用层来定义
      • 流依赖:一个资源必须依赖其他已经到达的资源
    • 服务端推送,HTTP/1.1的header带有大量信息,而且每次都要重复发送。HTTP/2 为了减少这部分开销,采用了HPACK 头部压缩算法对Header进行压缩。
    • 对头阻塞问题:2.0只是解决了HTTP对头阻塞问题,并没有解决TCP对头阻塞问题,导致了不同的连接中TCP数据包之间会导致对头阻塞,并且在2.0中TCP对头阻塞影响会比在1.1中更加大。
    • HTTPS,如果使用的是安全的HTTPS协议,就还需要使用TLS协议进行安全数据传输,这个过程又要消耗一个RTT(TLS不同版本的握手机制不同,这里按照最小的消耗来算)
    • 如何解决:升级TCP协议->协议僵化,放弃TCP
  4. HTTP/3.0:QUIC协议,拥塞控制,连接迁移,协议竞速,0-RTT握手
    • QUIC:基于UDP协议进行扩展
    • 拥塞控制
      • TCP重传包并不是递增的,导致其计算的RTT时间不准确,而QUIC是递增的
      • image-20231004133812543
    • 流量控制
      • image-20231004133609254
    • 连接迁移
      • 通过id进行标识,而HTTP2.0之前通过四元组ip+端口号进行标识,可能负载均衡到不同的ip或进程
      • 在迁移过程中不在通过四元组进行连接,而是通过Connection ID进行识别来快速确立连接。
    • 0-RTT握手
      • 通过握手期间携带Http数据,并且通过扩展字段来保留上次的加密密钥,具有安全性风险
    • 协议竞速
      • image-20231004134056905

扩展知识:多路复用

  • image-20231004134313801
  • epoll:在epoll模式下,内核通过红黑树对文件描述符进行组织,便于我们对于CRUD,当有事件发生时便会出发就绪事件,将有事件的文件描述符拷贝到就绪队列中进行拷贝,降低了拷贝以及遍历导致的资源消耗,并且epoll多路复用兼具了两种不同的模式
  • ET
    • 边缘触发模式下,就绪时间只会在第一次发生时进行事件触发,即便一次没有处理完成也无法再次出发事件,以此在ET模式下,我们必须得使用非阻塞IO,防止任务饿死。
  • LT
    • 在水平触发下,每次都将有就绪事件被触发。
  • 网络编程模型
    • Reactor
      • image-20231004135246853
      • image-20231004135356258
      • image-20231004135306783
      • image-20231004135432313
    • Proactor
      • 前面提到的 Reactor 是非阻塞同步网络模式,而 Proactor 是异步网络模式。
      • image-20231004135532178
      • Proactor Initiator 负责创建 Proactor 和 Handler 对象,并将 Proactor 和 Handler 都通过 Asynchronous Operation Processor 注册到内核;
      • Asynchronous Operation Processor 负责处理注册请求,并处理 I/O 操作;
      • Asynchronous Operation Processor 完成 I/O 操作后通知 Proactor;
      • Proactor 根据不同的事件类型回调不同的 Handler 进行业务处理;
      • Handler 完成业务处理;
    • image-20231004135708020

HTTP版本发展
http://lzhnet.top/2023/05/26/HTTP版本发展/
Author
kuaile000
Posted on
May 26, 2023
Licensed under