• Http 1.0 1.1 2.0 3.0 版本差别


    Http 1.0

    发布年份:1996 非官方标准

    • 短链接:每一次请求都对应一次TCP的连接与释放

      • 开销大:每次请求都要TCP的连接与释放
      • 队头阻塞:每次请求都必须等上一次请求获得响应之后,才可以发送;效率低下
    • 缓存:在HTTP1.0中主要使用header里的协商缓存 last-modified(上次修改时间),if-modified-since(是否修改),强缓存 Expires(缓存过期时间);减少了不必要的网络传输

    Http 1.1

    发布年份:1997 官方标准,并长期使用

    • 长连接:HTTP1.1增加Connection字段,通过设置Keep-Alive保持HTTP连接不断开。避免每次客户端与服务器请求都要重复建立释放建立TCP连接。提高了网络的利用率。

    如果客户端想关闭HTTP连接,可以在请求头中携带Connection:false来告知服务器关闭请求。

    • 管道化(pipelining):HTTP1.1支持请求管道化(pipelining)。TCP连接之后,Http可以像流水线一样,连续发送多次请求,而不必等待上一次请求响应之后再发送

    需要注意的是:服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。也就是说,HTTP管道化可以让我们把先进先出队列从客户端(请求队列)迁移到服务端(响应队列)。
    可见,HTTP1.1还是无法解决队头阻塞的问题。同时“管道化”技术存在各种各样的问题,所以很多浏览器要么根本不支持它,要么直接默认关闭,并且开启的条件很苛刻……而且好像实际也没有什么用处。

    由此可见,管线化并不是真正的并行的传输,现阶段的浏览器厂商采取了另外一种做法,它允许我们打开多个TCP的会话。eg.Chrome一般是6个

    • 缓存:加入了一些新的字段如cache-control,支持断点传输
    • Host 标头:使得一个服务器能够用来创建多个Web站点

    Http 2.0

    发布年份:2015 官方标准,逐渐普及中

    • 头部压缩: HTTP2.0会压缩(Header)部分;如果同时多个请求其头部一样或相似,那么协议会消除重复部分。

    利用HPAK算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,就不用重复发送同样字段了,只发送索引号,减少数据量提高速度

    • 二进制格式: HTTP/1.0和HTTP/1.1中,报文都是纯文本的格式简单易读;而在2.0中采用了二进制的格式,不再可读;数据以数据流(stream)的形式以字节单位发送,数据包可以不按顺序发送

    • 多路复用协议: 真正的并行的请求能在同一个链接中处理,移除了 HTTP/1.x 中顺序和阻塞的约束。
      在这里插入图片描述

    在HTTP2.0中,对头阻塞是发生在TCP层面

    • 服务端推送: 服务端不再是被动地响应,可以主动向客户端发送消息、推送额外的资源。

    在实际中应用的也比较少

    Http 3.0

    发布年份:2022 官方文档 逐渐普及中

    • QUIC协议: 而QUIC是基于 UDP 协议,不需要三次连接进行握手,而且也会缩短 TLS 建立连接的时间。解决了队头阻塞问题。

    在这里插入图片描述

    参考资料

    • https://blog.csdn.net/weixin_45910068/article/details/126290248
    • https://xiaolincoding.com/network/2_http/http_interview.html#http-1-1%E3%80%81http-2%E3%80%81http-3-%E6%BC%94%E5%8F%98
    • https://zhuanlan.zhihu.com/p/266578819
    • https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
  • 相关阅读:
    Pangolin安装报错解决
    【数据库】通过实例讲清楚,Mongodb的增删查改,分组查询,聚合查询aggregate
    基因数据平台
    各种存储性能瓶颈分析与优化方案
    在java应用程序中使用spring
    《JavaSE-第十章》之抽象类与接口
    【HttpRunner】接口自动化测试框架
    电机带宽的形象理解
    SLAM从入门到精通(用python实现机器人运动控制)
    【leetcode】三维形体投影面积 c++
  • 原文地址:https://blog.csdn.net/weixin_50799082/article/details/132590951