QUIC的优势与缺陷

news2024/12/26 0:06:27

被寄予厚望的下一代互联网传输协议,QUIC究竟有哪些优点呢? 总结如下:

  • 多路复用:QUIC升华了HTTP/2中的多路复用技术,实现了基于互相独立的多流(多通道)数据传输,从根本上解决了TCP存在的队头阻塞问题。

  • 快速握手:即使不使用TLS,TCP建连过程也至少需要经过三次握手。而QUIC融合了握手和密钥协商交换的过程,从而实现了“初次光临1-RTT回头客0-RTT”的建连速度,大大提高了握手效率,这对于短连接频繁或者时延较高的场景非常有用

  • 精准的RTT计算:TCP由于受到“重传报文仍然使用原始报文的序列号(sequence number)”的影响,在存在重传报文的情况下,会产生RTT计算歧义性。QUIC使用的包序号(packet number)则具有单调递增的属性,故即使发送方发送了重传报文,在收到ACK之后仍能准确计算出对应的RTT

  • 连接迁移:前面提到,TCP的连接是由一对四元组定义的,而QUIC的连接则是由连接ID定义。因此当底层四元组变化时,TCP必须重新握手建连,QUIC则仍然能让连接继续保持,从而避免了再次握手,减少了握手时间的损耗。这一特性在移动端场景中已被证实非常有用

  • 内生安全:TCP报文的整个头部是通过明文进行传输的,且如果需要在建立TCP连接过程中需要额外进行TLS握手,而对QUIC来说,除了例如目的ID等个别字段外,报文头部中的大部分字段也进行了加密;同时TLS1.3直接内嵌在QUIC内部,加密过程中产生的握手信息和警告直接通过QUIC进行封装传输

  • 细致的流量控制:QUIC从不同粒度进行流量控制,即基于连接的流量控制与基于流的流量控制。由于一个QUIC连接中可以起许多条单向流或双向流,所以仅靠连接级别的流量控制还不够,仍然有可能导致整体流量过载,因此必须搭配连接级别的流量控制一起使用,才能从宏观到微观对流量进行全面控制

  • 更快的特性迭代速度:由于TCP是在内核态实现,所以如果用户想要切换或者升级一些新特性是非常麻烦的事,比如加入新的拥塞控制算法。QUIC则是在用户态实现的,支持新特性的快速演进,这也是为何其能支持可插拔的拥塞控制算法:不仅能够在现有的成熟拥塞控制算法,,例如Cubic,BBR等之间进行轻易切换,而且还能快速部署验证基于AI的拥塞控制算法——例如基于强化学习(Reinforcement Learning)的拥塞控制算法

  • 多路径传输提高带宽利用率:多路径QUIC(MPQUIC)是一项基于QUIC路经验证、同时类似于QUIC连接迁移的衍生技术。在保证路径合法性的基础上,它可以让一个QUIC连接同时利用多条链路来进行数据传输,从而最大化可用带宽的利用率,也提高了连接的容错能力(其中一条链路出现故障不会影响传输)。MPQUIC不仅能够利用QUIC的自带优势,在路径分配上还能借鉴多路径TCP(MPTCP)中许多成熟和优秀的算法

  • 可以按需进行一定的扩展:在IETF的QUIC主页上,除了RFC8999-9002这四篇与QUIC本身特性密切相关的标准外,更多的RFC或者draft介绍的是QUIC的一些扩展特性,例如基于Datagram帧的不可靠数据传输扩展(RFC9221)、基于QUIC的负载均衡(draft-ietf-quic-load-balancers)等。许多扩展特性目前虽然并未被纳入到正式标准中,但它们不断为QUIC自身特性注入新的血液,也为QUIC的应用前景带来了更广阔的想象
    虽然QUIC的种种优势受到了不少追捧,也已在不少公司的产品中落地,然而当前QUIC自身仍有许多问题有待解决,包括由于QUIC自身特性导致或者是一些客观情况造成的“硬伤”。具体来说,QUIC的问题主要发生在下面几种情况:

  • 网络质量较好的链路上QUIC的表现可能还不如TCP:这一点早在2017年的SIGCOMM会议上,从谷歌发表的论文中就可以看出来[1],其中特别提到在高带宽(超过100Mbps)、低时延(几毫秒)和低丢包率的网络中,QUIC的性能有时还不如TCP。另外在2020年的SIGCOMM会议上,谷歌专门针对QUIC的CPU使用率情况做了相关汇报[2]:2017年所做的实验可以表明,同等流量下,(2017年的)QUIC的CPU消耗是TCP/SSL的2倍左右,即使后续进行了一些优化,但是仍然要高于使用了SSL的TCP。

其实这些现象从下面几个角度来理解:
o 底层传输协议:QUIC底层使用UDP进行传输,而由于内核中设计的UDP收发包机制存在一定问题,使得其批量收发包等接口性能都不如TCP,而这也同时影响QUIC报文的传输性能[3];
o 报文加解密:QUIC内部利用TLS对报文进行了从头到尾全方位的加密,而TCP本身并不会强制使用SSL机制来进行加密。复杂的加密过程对CPU的性能损耗不容小觑;
o ACK处理:虽然TCP和QUIC均是反馈驱动的传输协议,发送方通过来自接收方的ACK来进行丢包重传等一系列处理,然而TCP的ACK报文是直接在内核中通过tcp_ack函数进行处理,而QUIC则是不管三七二十一把包括ACK在内的所有报文先收上来放到用户层后再进行处理,这就导致了额外的用户级和内核级的上下文切换以及数据从内核转移至用户的额外拷贝;
o UDP限速(UDP throttling):国内不少运营商会对UDP流量进行限速处理,主要原因在于UDP这类不存在流量控制、拥塞控制的协议可能会被滥用从而抢占大量链路带宽,因此才会出现许多故意把UDP报文伪装成TCP报文(俗称fake TCP)从而绕开限速的工具。另外由于UDP五元组变化频繁,这就会导致某些状态设备在短时间内需要保存大量的UDP连接,这会给设备造成很大的压力
在这里插入图片描述

图1 QUIC与TCP在CPU性能消耗上的对比。可以看出即使经过了优化,QUIC的CPU消耗率仍比TCP/SSL要高不少https://conferences.sigcomm.org/sigcomm/2020/files/slides/epiq/0%20QUIC%20and%20HTTP_3%20CPU%20Performance.pdf

  • 对流量管理和分析不太友好:由于使用了TLS1.3作为安全性保证,以及UDP作为底层传输协议,这让Wireshark、Zeek等抓包及网络安全分析工具无法获取到QUIC报文携带的关键信息,这同时会给想要过滤QUIC流量的用户造成一定影响[4]。不过,目前较新版本的Wireshark已经支持通过导入密钥日志文件来抓取QUIC报文并进行解密,QUIC协议也自带了qlog这一机制(目前还处于草案阶段)来方便使用者进行调试并观察QUIC报文交互过程。另外还有像qvis[5]这样的可视化工具,也给未来QUIC的流量分析的提供了更多的可能性。

  • 移动端性能:虽然设计QUIC的初衷是为了优化网页端的用户体验,但由于其结合了UDP和可靠性传输两个特性,所以人们自然而然想到如果在移动端也是用QUIC,说不定能为音视频等业务提供更高的服务质量(QoS)。事实上,已经有不少大公司在移动端将QUIC进行了商用:在国外,像Facebook就从将自家设计的QUIC开源框架mvfst用于Facebook App上并在用户侧收获了一些体验的提升[6],Uber同样也利用了QUIC的0-RTT握手、更精准的RTT计算等特性解决了使用TCP时存在的痛点,从而提升了弱网环境下移动端的性能,让用户享受到更快的叫车速度[7]。国内例如阿里、百度等大厂也早已将自研的QUIC工程用于淘宝的短视频场景以及百度App上[8,9]。即便如此,QUIC在移动端的使用仍然会碰到一些棘手的问题[10]:
    o 首先,不像socket接口,目前业界并不存在统一的SDK来进行开发,如果开发者想要将QUIC集成到移动端上,只能自己从零开始实现QUIC协议,或者使用开源的第三方库[11];
    o 其次,集成到移动端的QUIC代码必须适配多种操作系统(至少要适配目前主流的iOS和Android),这种多系统适配开发本身就有一定的难度;
    o 再者,如果设备发现使用QUIC的效果不尽人意(例如有些网络中QUIC流量会被屏蔽),则相应的设备必须具备能够回退到原来HTTP或TCP版本的能力,这给应用开发者和QUIC的部署带来了一定的挑战。例如,谷歌研究人员曾在YouTube over Google’s QUIC vs Internet Middleboxes:A Tug of War between Protocol Sustainability and Application QoE这篇论文中提到,根据YouTube上的测试结果来看,如果受到中间件问题引起的传输失败(middleboxes failure)或者网络拥塞控制的影响,盲目地将QUIC流量切换回TCP这种回退行为会导致QUIC的性能有较大程度的下降[12]。因此,比起QUIC自身的连接迁移特性所带来的优势,QUIC与其他协议之间所进行的“连接迁移”可就不那么让人放心了;

o 最后,由于QUIC使用了TLS进行加密,网络供应商无法使用传统的流量管理工具来分析QUIC流量造成的各种消耗,并进行用户体验质量管理(QoE),这一点在在线视频播放中尤为重要。由于QUIC的优势,视频流占据了大部分的QUIC流量,同时,部分移动端视频又使用了一种叫做码率自适应(ABR,Adaptive Bitrate)的技术,这一技术能够根据实时网络情况以及客户端播放缓冲区的状态对码率进行动态调整,从而提高用户在线观看视频的体验。由于QUIC的安全性措施,客户端便无法获取High Bit Rate[13]。

  • 可能会造成安全漏洞:与支持QUIC协议的浏览器以及服务器不同,诸如防火墙等这类网络中的安全设备无法识别QUIC流量。正常情况下,大部分防火墙具备检测四层至七层流量的能力,比如一旦其检测到HTTP流量就会其进行立刻警觉起来,并采取一定的保护手段以防网络攻击。但由于QUIC仅仅被视为UDP数据,也就是四层报文进行处理,QUIC流量因此避开了来自防火墙的监管,导致防火墙无法识别像披了隐身衣一般的应用层数据,这就给恶意攻击者提供了一个绕过防火墙的机会。

  • 无法支持一些流媒体协议:前面提到,相比不支持TCP连接复用的HTTP1.0来说,HTTP/1.1引入了复用TCP的长连接模式,服务端会通过在回应报文头中添加了“Content-Length”字段来表示回应报文的数据长度,这样客户端才知道收到的回应报文在哪里结束以及下一个回应报文从哪里开始。但对于一些动态生成的内容来说,由于无法提前得知数据的长度,所以HTTP/1.1引入了另外一种传输方式——分块传输编码(chunked transfer encoding),即将网页服务器发送给网页浏览器(或者其他形式的客户端请求)的回应数据分割成多个数据块进行传输,需要注意点是这种机制只有HTTP1.1中有。因此,对于一些需要使用到分块传输编码功能的流媒体协议来说,就无法使用基于QUIC的HTTP/3,例如低时延通用媒体应用程序格式(LLCMAF, Low-Latency Common Media Application Format)[14]。

  • 首包安全性问题:QUIC在握手期间需要交换密钥从确保后续所有发送数据的安全性。对于作为客户端在发起握手时被发送的第一个报文——Initial包来说,它却不得不牺牲自己,做出“舍己为包”的行为:虽然它携带了要进行交换的密钥,但因为是首包所以无法使用本身携带的密钥进行加密。目前QUIC对于客户端第一个Initial包的加密方法是基于Initial包的目的连接ID(随机生成)以及初始salt值(initial_salt)来生成密钥并自行加密。由于初始salt值是公开的,根据QUIC协议自身提到,这只能“抵御被动攻击者(off-path attacker),以及不知道QUIC版本的中间设备(middleboxes),而无法抵御主动攻击者(on-path attacker)“[15],甚至有研究者认为当前QUIC协议中对于Initial包的保护实际上是形同虚设[16]。不过,目前已经有人对Initial包的保护进行了研究,例如杜克大学的研究人员提交了一份草案,其中提到客户端可以通过利用server产生的密钥来对Initial包进行加密,而这一密钥有关的配置文件(Encrypted ClientHello Configuration)则可以通过例如域名系统(Domain Name System, DNS)这类带外系统(out-of-band system)来获得。不过这个过程涉及到了Initial包头格式的修改,目前来看并不通用[17]。

  • 连接迁移对负载均衡的影响:当由于用户网络发生变化而导致连接迁移时,由于四层负载均衡设备仍然按照四元组哈希来派发请求报文,因而本该落在某一服务器上的请求很有可能落到不同的服务器上,这么一来由于QUIC上下文的丢失便会引发连接的中断。不过目前已经有研究人员提出了一种基于结构化连接ID(structured connection ID)来进行负载均衡的策略[18],这样就可以不再依赖四元组进行负载均衡。

  • 连接的记忆问题:NAT是常用的一种实现内网和公网相互通信的技术。我们平时常用的例如手机、笔记本等设备使用的都是私有IP,需要通过NAT设备来进行IP转化,这样才能连接到公网。NAT设备一般会记住某一连接的状态,并在通信完成时释放相关的信息。得益于TCP报文的结构,对于使用TCP的传输来说,NAT设备可以根据TCP报文头中的SYN、FIN字段来判断TCP连接当前的状态,从而合理得进行连接记忆的释放。但对于不具备这类标记的UDP报文来说,NAT设备无法确切得知连接的终止时间点。由于QUIC基于UDP,如果NAT设备端口记忆时间过短则可能会造成QUIC连接的中断,除非人为开启QUIC的保活机制,周期性发送保活报文,避免NAT设备过早遗忘连接信息。

破旧立新的过程肯定会遇到许多的阻碍,QUIC作为传输协议的明日之星,其试图改进的不仅是TCP的逻辑,更是希望带给TCP背后整个庞大网络体系以更高的性能和更好的用户体验。路漫漫其修远兮,虽然从目前来看TCP仍是网络传输中的主流协议,HTTP1.1和HTTP2也同样是当前主流的HTTP协议,但随着QUIC和HTTP/3对应RFC标准的发布、学术界越来越多研究人员的关注、业界许多大厂的推进与部署,以及人们对于用户体验的越发重视,未来QUIC一定能闯出一片更广阔的天地来。相信随着时间的推移,QUIC的生态将会越发完善,应用场景也会越发丰富,定会带领网络传输技术迈向那片星辰大海。

注: [1]Langley A, Riddoch A, Wilk A, et al. The quic transport> protocol: Design and internet-scale eployment[C]//Proceedings of the> conference of the ACM special interest group on data communication.> 2017: 183-196.
[2]https://conferences.sigcomm.org/sigcomm/2020/files/slides/epiq/0%20QUIC%20and%20HTTP_3%20CPU%20Performance.pdf
[3]UDP协议栈的性能问题参见博文https://blog.csdn.net/csdnnews/article/details/98551466
[4]QUIC & The Dead: Which of the Most Common IDS/IPS Tools Can Best
Identify QUIC Traffic? [5]qvis.quictools.info/#/files [6]How Facebook
is bringing QUIC to billions
https://engineering.fb.com/2020/10/21/networking-traffic/how-facebook-is-bringing-quic-to-billions/
[7]Employing QUIC Protocol to Optimize Uber’s App Performance
https://eng.uber.com/employing-quic-protocol/ [8]淘宝APP在短视频场景下的IETF
QUIC最佳实践https://developer.aliyun.com/article/857436
[9]百度APP移动端网络深度优化实践分享(三):移动端弱网优化篇https://juejin.cn/post/6844903901649616910
[10]The Future of Wireless Protocols: Google and PacketZoom Push the
Boundaries
https://www.bizety.com/2018/07/18/the-future-of-wireless-protocols-google-and-packetzoom-push-the-boundaries/
[11]关于不同QUIC开源工程已实现的功能与它们彼此之间的互通性参见https://interop.seemann.io/
[12]Chaudhary S, Sachdeva P, Mondal A, et al. YouTube over Google’s
QUIC vs Internet Middleboxes: A Tug of War between Protocol
Sustainability and Application QoE[J]. arXiv preprint
arXiv:2203.11977, 2022. [13] Does QUIC Suit Well with Modern Adaptive
Bitrate Streaming Techniques? [14]
https://www.wowza.com/blog/low-latency-cmaf-chunked-transfer-encoding
[15] RFC9001 Section 5.2 [16] Gagliardi E , Levillain O . Analysis of
QUIC Session Establishment and Its Implementations[M]. 2020. [17]
Protected QUIC Initial
Packets:https://datatracker.ietf.org/doc/pdf/draft-duke-quic-protected-initial-04
[18] QUIC-LB: Generating Routable QUIC Connection
IDs,https://datatracker.ietf.org/doc/draft-ietf-quic-load-balancers/

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

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

相关文章

基于C语言学生信息教务管理系统编程设计

一.实现功能 1.从键盘添加学生信息 2.从文件添加学生信息 3.显示学生信息到屏幕 4.显示学生信息到文件 5.删除学生信息 6.插入学生信息 7.查找学生信息 8.成绩排名 二、相关代码 #include<stdio.h> #include<stdlib.h> //使用malloc函数以及exit函数 #include<…

力扣(LeetCode)1759. 统计同构子字符串的数目(C++)

题目描述 双指针数学 根据同构字符串的定义&#xff0c;还有示例&#xff0c;发现同构子字符串的数量&#xff0c;只和字母相同的区间有关。如abbcccaa&#xff0c;有 444 个影响答案的区间&#xff0c;直观切分为a bb ccc aa&#xff0c;用空格划分区间。遍历的任务就是维护这…

灵动岛前端Ui

一、前言 灵动岛&#xff08;Dynamic Island &#xff09;是什么&#xff1f; 灵动岛&#xff0c;是苹果公司iPhone 14 Pro系列 [2] 交互UI&#xff0c;让虚拟软件和硬件的交互变得更为流畅。当有来电、短信等通知时&#xff0c;灵动岛会变化它的形态&#xff0c;以便让用户能…

【大数据】M1 mac win docker安装kafka+mysql+canal

文章目录kafkadocker-compose创建kafka容器启动以后&#xff0c;访问容器&#xff0c;并且发送消息测试问题Exception in thread "main" kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTINGmysqldocker…

LAPS本地管理员密码之使用PowerShell查看和重置密码

目录 一、PowerShell策略设置 二、引入AdmPwd.PS模块 三、查看密码 四、强制重置密码 文章主要介绍在部署了LAPS后&#xff0c;怎么使用PowerShell查看和管理域内本地管理员密码。需要注意的是被操作的电脑需要加域&#xff0c;所有操作都在域内环境下进行。 LAPS介绍 LAP…

Spring Boot 知识总结

Spring Boot 知识总结 一、Spring Boot基础 1.1 什么是Spring Spring是一个开源框架&#xff0c;2003年兴起的一个Java轻量级开发框架&#xff0c;作者&#xff1a;Rod Johnson。 Spring是为了解决企业级应用开发的复杂性而创建的&#xff0c;简化开发。 Spring是如何简化…

LeetCode 每日一题——1759. 统计同构子字符串的数目

1.题目描述 1759. 统计同构子字符串的数目 难度中等43 给你一个字符串 s &#xff0c;返回 s 中 同构子字符串 的数目。由于答案可能很大&#xff0c;只需返回对 109 7 取余 后的结果。 同构字符串 的定义为&#xff1a;如果一个字符串中的所有字符都相同&#xff0c;那么…

Rancher RFO 正式 GA

Rancher RFO GA RFO 是 Rancher For openEuler 的缩写&#xff0c;旨在面向 openEuler 打造 Rancher 基础平台。其中最核心的工作是打造一款面向 openEuler 生态的 Kubernetes 发行版。它基于上游 RKE2 的技术栈&#xff0c;构建物采用 openEuler base image&#xff0c;致力于…

C语言及算法设计课程实验一:C程序的运行环境和运行C程序的方法

C语言及算法设计课程实验一&#xff1a;C程序的运行环境和运行C程序的方法一、实验目的二、实验内容2.1、输人并运行一个简单的正确的程序2.2、输人并编辑一个有错误的C程序2.3、输入并运行一个需要在运行时输入数据的程序2.4、运行一个自己编写的程序三、实验步骤3.1、输人并运…

Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效

OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投影 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用…

基于MWORKS.Sysplorer的电子控制器应用案例——永磁同步电机FOC算法建模

1 前言 MWORKS是面向数字工程的新一代科学计算与系统建模仿真平台&#xff0c;可提供机械、电子、液压、控制、热、信息等多领域统一建模仿真环境。经过同元持续攻关&#xff0c;全新推出的MWORKS.Sysplorer嵌入式代码生成器&#xff0c;现已支持面向电子控制器的产品级的嵌入…

循环神经网络的简洁实现

参考8.6. 循环神经网络的简洁实现 — 动手学深度学习 2.0.0 documentation 本节将展示如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 pip install mxnet1.7.0.post1 pip install d2l0.15.0 from mxnet import n…

ubuntu18.04下用Fiddler抓取curl库网络数据包总结

本人在ubuntu18.04下进行开发&#xff0c;需要使用http和服务端进行通信&#xff0c;为了确认自己发送给服务端和服务端返回数据字段&#xff0c;所以需要进行抓包分析参数。本文就说明一下如何在ubuntu18.04使用fidder对自己编写的应用程序进行http协议数据包抓取。 目录 1.…

无线网络渗透测试清单

©网络研究院 无线渗透测试积极检查 WiFi 网络中的信息安全措施的过程&#xff0c;并分析弱点、技术流程和关键无线漏洞。 我们应该关注的最重要的对策是威胁评估、数据盗窃检测、安全控制审计、风险预防和检测、信息系统管理和升级基础设施&#xff0c;并且应该准备一份…

13-14-15-RabbitMq工作模式深度剖析与Spring整合MQ以及RabbitMq高级特性

RabbitMQ消息传递流程 连接( Connection) 在RabbitMQ中&#xff0c;生产者和消费者与RabbitMQ的通信就是基于TCP连接的。不过呢我们知道TCP连接的创建和销毁在高并发场景下对于操作系统来说都是特别昂贵的开销&#xff0c;所以RabbitMQ又引入了信道的概念 信道&#xff08;Chan…

云原生之使用Docker部署轻量级web服务器lighthttpd

云原生之使用Docker部署轻量级web服务器lighthttpd一、Lighthttpd介绍二、检查系统版本三、检查docker状态四、下载lighthttpd镜像五、部署lighthttpd1.创建数据目录2.创建lighthttpd容器3.查看容器状态六、访问lighthttpd服务七、编辑index.html1.编辑index.html文件2.重新访问…

Hadoop大数据存算分离方案:计算层无缝对接存储系统

Hadoop的诞生改变了企业对数据的存储、处理和分析的过程&#xff0c;加速了大数据的发展。随着大数据系统建设的深入&#xff0c;企业的数据基础设施易出现计算资源浪费、存储性能低、管理成本过高等挑战。相比存算一体架构&#xff0c;存算分离架构具有性能与成本最优、兼具灵…

3D地图app

3D三维地图APP 发布时间&#xff1a;2018-07-19 版权&#xff1a; 3D地图依据高程数据等对地表进行渲染&#xff0c;实现地表的起伏&#xff0c;模拟出真实的三维场景&#xff0c;让你有如身临其境般的感觉。 &#xff08;注&#xff1a;Bigemap 3D地图是一个三维地图浏览功能…

项目沟通怎么才能不像在吵架?

项目沟通并非吵架&#xff0c;看起来却总是剑拔弩张。有效沟通才能真正解决问题&#xff0c;笔者给出了一些实用的建议&#xff0c;从对象到场景&#xff0c;再到方法与技巧&#xff0c;应该在沟通中有针对性地注意这些问题。 沟通是个老话题&#xff0c;在项目管理中有专门讲沟…

draw.io使用教程

大部分的绘图应用都离不开三个基本的元素&#xff0c;图形&#xff0c;链接&#xff0c;文本。每个元素都有基本的操作和样式&#xff0c;元素与元素之间又可以进行组合&#xff0c;“三生万物”&#xff0c;生成各种各样的图表。 如果没有这款绘图的 可以点击获取 : drawio文…