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

参考链接
https://xiaolincoding.com/network/2_http/http_interview.html#http-1-1-%E7%9B%B8%E6%AF%94-http-1-0-%E6%8F%90%E9%AB%98%E4%BA%86%E4%BB%80%E4%B9%88%E6%80%A7%E8%83%BD

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-%E5%81%9A%E4%BA%86%E4%BB%80%E4%B9%88%E4%BC%98%E5%8C%96

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-%E5%81%9A%E4%BA%86%E5%93%AA%E4%BA%9B%E4%BC%98%E5%8C%96

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的握手连接)

TLS1.3握手过程,只需要1RTT

  1. 连接迁移

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—25.K 个一组翻转链表【困难】

2023每日刷题(八十二) Leetcode—25.K 个一组翻转链表 算法思想 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val…

Conda python管理packages一 从入门到精通

Conda系列: 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门Conda python管理环境environments 一 从入门到精通Conda python管理环境environments 二 从入门到精通Conda python管理环境environments 三 从入门到精通…

力扣每日一题 ---- 1970. 你能穿过矩阵的最后一天

这题对于没怎么做到过这题的朋友来说比较陌生,他给出的条件是两个都是动态的条件,一个条件随着另一个条件走,这个时候是很熟悉这题的朋友就会感觉比较麻烦,比较难,就不想写了,两个强相关条件的第一个是水每…

IT大侦“碳”:Concept Luna向循环设计持续演进

今天聊点轻松的话题。上个月,小编用来吃饭的家伙开始闹罢工,笔记本的触控和键盘突然没了反应,电脑虽然还能打开,但嗡嗡直叫的风扇让我意识到这件事并不简单。 你问我为什么电脑会出问题?好吧,那我得先搞清楚…

GBase 8s常见问题解析---追踪统计SQL执行情况 SQLTRACE

本文摘自GBASE南大通用社区,by:wty,原文请点击:GBase 8s常见问题 -- 追踪统计SQL执行情况 SQLTRACE|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商 问题现象 某些SQL执行慢、有问题…

C# HSLCommunication与物联网技术结合的可能性及在智能制造中的应用

引言: 随着物联网(IoT)技术的迅速发展,智能制造和工业互联网等领域对高效、稳定的通信技术需求日益增长。C# HSLCommunication库作为一种高效的通信工具,与物联网技术的结合为这些领域带来了新的可能性。本文将详细介绍…

【Java万花筒】缓存与存储:Java应用中的数据处理利器

激发性能之源:深度剖析Java开发中的五大数据缓存与存储方案 前言 在现代软件开发中,高效地处理和存储数据是至关重要的任务。本文将介绍一系列在Java应用中广泛使用的数据缓存与存储库,涵盖了Ehcache、Redisson、Apache Cassandra、Hazelca…

js触发input的打开文件选择器,将本地图片回显以及上传

js触发input的打开文件选择器,将本地图片回显以及上传 你可以通过以下 JavaScript 代码触发文件选择器:这里的场景不是通过input标签来触达的文件选择器,这样对于样式较为复杂的上传可以在html结构上保持清爽愉快,不用多添加一个i…

java web mvc-08-Grails 入门介绍

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …

R语言【taxa】——is_*():检查对象是否为某个类

is_classification(x) 检查对象是否为 classification 类。 is_internode(x) 检查每个分类单元是否为节间。节间是指一个分类单元恰好有一个上级分类单元和 一个下级分类单元。这些分类群可以在不丢失它们之间的关系信息的情况下被移除。 x <- taxonomy(c(Carnivora, Felid…

设置Django中的静态文件

在Django中&#xff0c;静态文件&#xff08;如CSS、JavaScript、图片等&#xff09;是网站开发中不可或缺的一部分。为了让网站能够正确加载这些静态文件&#xff0c;我们需要在Django中进行相应的设置。 首先&#xff0c;我们需要在settings.py文件中设置STATIC_URL&#xf…

Unity通用渲染管线升级URP、HDRP

Unity通用渲染管线升级URP、HDRP 一、Build-in Pipline升级到 URP 一、Build-in Pipline升级到 URP 安装URP包 升级所有材质&#xff08;升级完成后材质会变成紫红色&#xff0c;Shader丢失&#xff0c;此为正常现象&#xff09; 创建 UniversalRenderPipelineAsset 配置文…

Pillow图像处理:从零开始的奇妙之旅

图像处理&#xff0c;就像是一场神奇的冒险&#xff0c;让我们的照片变得更有趣、更生动。而在这个冒险的旅途中&#xff0c;Pillow就如同一位魔法师&#xff0c;为我们开启了无尽的可能性。无论你是刚刚踏入图像处理领域的小白&#xff0c;还是已经略有基础的程序员&#xff0…

深入Kafka broker

一、协议设计 颗粒度, PRODUCE和FETCH中支持topic,partion等层级的颗粒度;测试友好, 基于session_id和epoch确定一条拉取链路的fetch session;全量增量结合, FetchRequest中的全量拉取和增量拉取;基本结构: headerbody。 常见header: api_key, api_version, corelation_id, cl…

opencv中的几个重要函数

对于我们经常使用python的同学&#xff0c;尤其还习惯使用numpy库&#xff0c;突然上手opencv c时&#xff0c;就会感觉想要一个结果&#xff0c;python一行代码搞定&#xff0c;但是c却无处下手&#xff0c;因此特总结遇到的几个重要opencv函数&#xff0c;方便能够快速获取跟…

8.前端--CSS-显示模式

元素的显示模式 元素显示模式就是元素&#xff08;标签&#xff09;以什么方式进行显示&#xff0c;比如<div>自己占一行&#xff0c;比如一行可以放多个<span>。 1.块元素 常见的块元素 常见的块元素&#xff1a;<h1>~<h6>、<p>、<div>、…

SQLyog的使用

快捷键功能备注对象浏览器窗口及查询执行快捷键  F5刷新对象浏览器窗口 CtrlB 切换鼠标光标焦点至对象浏览器窗口&#xff1b; F8执行当前行SQL&#xff0c;并允许编辑查询结果 F9执行查询/执行当前行的SQL 连接  CtrlM创建新连接 CtrlN以当前连接属性创建新连接 Ctr…

如何预防服务器IP被劫持,危害有什么?

服务器IP被劫持是一种严重的网络安全问题&#xff0c;攻击者通过篡改服务器的IP地址&#xff0c;将网络流量重定向到恶意服务器或网站&#xff0c;导致用户无法正常访问目标服务器&#xff0c;并可能面临数据泄露、恶意软件感染等安全风险。了解服务器IP被劫持的危害和预防措施…

理解Java中的AQS

一、定义 AQS:AbstractQueuedSynchronizer(抽象队列同步器)&#xff0c;是一个用于构建锁和同步器的抽象的同步框架。AQS 提供了一种可扩展的基础&#xff0c;允许开发者实现各种形式的同步控制机制。 例如&#xff1a;独占锁&#xff08;ReentrantLock&#xff09;、共享锁&a…

Jumpserver中安装httpx

查看已安装的包 pip freeze # python -V # Python 2.7.5安装anyio 刚开始直接pip install httpx&#xff0c;未设置版本号&#xff0c;因已有idna2.7&#xff0c;所以出现版本不兼容的现象 anyio 3.0.0 requires idna>2.8, but you have idna 2.7 which is incompatible.…