当前位置: 首页 > news >正文

第三十三篇:TCP协议如何避免/减少网络拥塞,TCP系列八

一、流量控制

一般来说,我们总是希望数据传输得更快一些,但是如果发送方把数据发送得太快,接收方可能来不及接收,造成数据的丢失,数据重发,造成网络资源的浪费甚至网络拥塞。所谓的流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制,就可以很方便的在TCP连接上实现流量控制。

滑动窗口机制使用关闭窗口控制发送方发送数据。发送方持续发送报文,但是接收方处理不过来,那就是浪费网络资源。

使⽤ Nagle 算法,用于自动连接许多的小缓冲消息;尽可能发送大块数据,避免网络中充斥着许多小数据块浪费网络资源

二、拥塞控制

网络是一个相当复杂的环境,我们发送数据不能只考虑交互两端的情况,基于交互两端的情况做出流量控制是不够的,我们还需要考虑网络的情况,网络上的包就像来来往往的车流,如果没有管制,那将是灾难的,试想,如果在十字路口没有红绿灯还没有交警,那将会发生什么?

1. 拥塞的形成

如上图,当数据到达一个大的管道(如一个快速局域网)并向一个较小的管道(如一个较慢的广域网)发送时便会发生拥塞。当多个输入流到达一个路由器,而路由器的输出流小于这些输入流的总和时也会发生拥塞。

上图显示了一个典型的大管道向小管道发送报文的情况。之所以说它典型,是因为大

多数的主机都连接在局域网上,并通过一个路由器与速率相对较低的广域网相连(我们再次

假定图中上半部分的报文段(9 ~ 20)都是相同的,而图中下半部分的 ACK也都是相同的)。

在该图中,我们已经标记路由器 R1为“瓶颈”,因为它是拥塞发生的地方。假定瓶颈路由器具有足够的容纳这 20个分组的缓存。那么将正常进行,否则,就会引起路由器丢弃分组。

而在TCP的实现上,数据包发送出去,我们通过一个计时器timer采样了RTT并计算RTO,如果因为网络拥堵,网络包应答超时或丢失,那么发送方将重发,而本身网络就处理能力有限而且拥堵,这时候还重发,试想如果成千上万的网络包都这样,这无疑雪上加霜,形成“网络风暴”,最后网络瘫痪。

2.拥塞窗口

前面我们说过,如果我们采用一问一答的方式,即我发送一个包,你应答一次,然后我再发送下一个包,这传输速率显然很慢,严重影响我们的用户体验,所以我们制定了一个策略:窗口控制滑动窗口,即相应数量以内的包在未被确认的情况下,发送方也能继续发送,这提高了数据的传输速度。

下图为滑动窗口的初步商定:

但是我们只考虑发送方和接收方的情况下而进行窗口大小的设定,如果窗口过大发送方一股脑的将数据快速传输出去而网络的传输能力又有限就会导致包的传输超时或者丢包

所以我们需要在上面窗口大小的基础上加上“网络传输能力”的限制这个窗口的大小就是拥塞窗口对拥塞窗口大小的调整就是拥塞控制

注意前面我们说过发送窗口的大小受到接收方窗口大小和拥塞窗口大小的限制

发送窗⼝的值是swnd = min(cwnd, rwnd),也就是拥塞窗⼝和接收窗⼝中的最⼩值。

拥塞窗⼝ cwnd是发送⽅维护的⼀个的状态变,它会根据⽹络的拥塞程度动态变化的

3. 什么影响拥塞窗口的大小?

        1)网络没有拥塞,拥塞窗口就会变大

        2)网络有拥塞,拥塞窗口就会变小

另外,“网络是否拥塞”是通过是否发生了超时重传,超时重传就认为网络拥塞。

4. 了解TCP拥塞控制的前提

        1)假设接收方的总是有足够大的缓冲区,发送方的发送窗口仅由网络的拥塞程度决定,不考虑接收方的接收窗口大小(事实上发送窗口的大小由拥塞窗口和接收方的接收窗口大小共同控制)

        2)以最大报文段MSS的个数作为讨论单位,而不是以字节为单位

发送窗口拥塞窗口接收窗口实际都是以字节为单位但是为了更好的探讨使用报文段(MSS)为单位

        3)发送方以n个包的发送为一轮(在这n个包的发送过程内,不用考虑接收方是否应答)

5. 拥塞控制主要是四个方法(算法)

        1)慢启动,

        2)拥塞避免,

        3)拥塞发生,

        4)快速恢复。

三次握手后,通过报文中的MSS选项得知通信双方最大报文的大小、窗口大小即滑动窗口大小。

TCP模块通常将MSS设置为(MTU-40)字节(减掉的这40字节包括20字节的TCP头部和20字节的IP头部)。这样携带TCP报文段的IP数据报的长度就不会超过MTU(假设TCP头部和IP头部都不包含选项字段,并且这也是一般情况),从而避免本机发生IP分片。对以太网而言,MSS值是1460(1500-40)字节。

窗口大小随着数据发送不断变化,发送端开始发送数据。

1)慢启动


前面我们讲到,发送端为了提高网络效率,不会发送一个确认一个,而是在一定范围内的报文发送不需要应答也能继续发送数据。于是有了滑动窗口。

同理,我们也不能上来就一股脑的发送报文数据,这会导致,接收端处理不过来,丢包;网络传输不过来,产生拥塞。

所以我们需要慢慢来,一步步的提高传输窗口,试探网络的承受能力,达到一个合理的值。

慢启动的规则

  1. 当发送⽅每收到⼀个 ACK,拥塞窗⼝ cwnd 的⼤⼩就会加 1个MSS单位大小的字节数。
  2. 慢启动的拥塞窗口增加也不是没有上限的,有时我们会达到中间路由器的极限,此时分组将被丢弃。所以需要一个门限ssthresh,初始值为65535个字节。拥塞窗口初始化大小为1个MSS单位大小的字节数。
  3. 当慢启动阶段的拥塞窗口大小增长到门限ssthresh的时候,慢启动阶段结束,进入拥塞避免阶段。

可以看出慢启动算法,发包的个数是指数性的增⻓。

每个报文的应答确认ACK都会让拥塞窗口增加一个MSS单位的大小,如上图,第一个往返时间内的ACK让cwnd增加一个MSS的字节数,第二个往返时间段内发送2个,返回两个ACK,让窗口变成4个MSS大小的字节数,一次类推,直到cwnd >= ssthresh,停止慢启动,变为拥塞避免即这个时候就要注意增长不要让网络拥塞了需要更小心的试探网络让增长的幅度减小

2)拥塞避免


慢启动阶段停止,进入拥塞避免阶段,这个阶段就是更加小心的慢慢试探网络情况,所以增长的幅度降低。

拥塞避免规则

  1. 变成了每次ACK增长1/cwnd个单位的MSS,cwnd为本次往返时间内的拥塞窗口大小,MSS为最大报文段大小。那么本次往返时间段内共增加了1个MSS单位大小的字节数。
  2. 拥塞避免阶段也不可能无休止的增长上去,当触发了重传机制,也就进⼊了「拥塞发⽣算法」。

3)拥塞发生


当⽹络出现拥塞,也就会发⽣数据包重传,重传机制主要有两种:

  1. 超时重传
  2. 快速重传

超时重传拥塞发生时的算法规则

  1. 网络是复杂的,发生超时重传,发送方压根不知道网络发生了什么,只能往最坏的情况去想,我们假设网络拥堵严重,此时就只能让拥塞窗口即cwnd = 1MSS字节,重新试探网络。
  2. 既然是重新试探网络,则重新启动慢启动阶段。
  3. 但是由于第一次的教训,为了避免给网络添堵,sshthresh =  cwnd /2,cwnd为发生超时重传时的拥塞窗口大小。

简要概括就是

  1. cwnd = 1MSS字节,可谓是一夜回到解放前。
  2. sshthresh =  cwnd /2,cwnd为发生超时重传时的拥塞窗口大小。
  3. 进入慢启动阶段。

快速重传,拥塞发生时的算法规则

上面那种发生超时重传,网络流量断崖式下跌,这是武断的,所以人们在已有的基础上进行了改进,在收到3个重复的 ACK时就开启重传,而不用等到RTO超时,导致流量断崖式下跌。因为TCP认为,你都收到ACK了,说明网络也没有那么差。

快速重传有两种实现方式TCP Tahoe、TCP Reno。

  • TCP Tahoe的实现和RTO超时一样。
  • TCP Reno的实现是:
  1. cwnd = cwnd /2
  2. sshthresh = cwnd
  3. 进入快速恢复算法——Fast Recovery

4)快速恢复算法 Fast Recovery


快速重传和快速恢复算法一般同时使用。快速恢复算法是认为,你还有3个Duplicated Acks说明网络也不那么糟糕,所以没有必要像RTO超时那么强烈。 注意,正如前面所说,进入Fast Recovery之前,cwnd 和 sshthresh已被更新:

  1. cwnd = cwnd /2
  2. sshthresh = cwnd

快速恢复的算法规则如下

TCP Reno版本

  1. cwnd = sshthresh  + 3 * MSS (3的意思是确认有3个数据包被收到了)
  2. 重传3个重复ACK指定的数据包
  3. 如果再收到3个重复的ACK一样的ACK,那么认为重传成功,此时cwnd = cwnd +1MSS单位字节
  4. 如果收到了新的ACK,那么,cwnd = sshthresh ,然后就进入了拥塞避免的算法了。

TCP New Reno版本

上面这个算法也有问题,那就是——它依赖于3个重复的ACK。注意,3个重复的ACK并不代表只丢了一个数据包,很有可能是丢了好多包。但这个算法只会重传一个,而剩下的那些包只能等到RTO超时重传,于是,进入了恶梦模式——超时一个窗口就减半一下,多个超时会超成TCP的传输速度呈级数下降,而且也不会触发Fast Recovery算法了。

通常来说,正如我们前面所说的,SACK或D-SACK的方法可以让Fast Recovery或Sender在做决定时更聪明一些,但是并不是所有的TCP的实现都支持SACK(SACK需要两端都支持),所以,需要一个没有SACK的解决方案。而通过SACK进行拥塞控制的算法是FACK。

于是,1995年,TCP New Reno(参见 RFC 6582 )算法提出来,主要就是在没有SACK的支持下改进Fast Recovery算法。

  • 当sender这边收到了3个Duplicated Acks,进入Fast Retransimit模式,开发重传重复Acks指示的那个包。如果只有这一个包丢了,那么,重传这个包后回来的Ack会把整个已经被sender传输出去的数据ack回来。如果没有的话,说明有多个包丢了。我们叫这个ACK为Partial ACK。
  • 一旦Sender这边发现了Partial ACK出现,那么,sender就可以推理出来有多个包被丢了,于是乎继续重传sliding window里未被ack的第一个包。直到再也收不到了Partial Ack,才真正结束Fast Recovery这个过程。

我们可以看到,这个“Fast Recovery的变更”是一个非常激进的玩法,他同时延长了Fast Retransmit和Fast Recovery的过程。

5)其他算法


TCP Vegas 拥塞控制算法

这个算法1994年被提出,它主要对TCP Reno 做了些修改。这个算法通过对RTT的非常重的监控来计算一个基准RTT。然后通过这个基准RTT来估计当前的网络实际带宽,如果实际带宽比我们的期望的带宽要小或是要多的活,那么就开始线性地减少或增加cwnd的大小。如果这个计算出来的RTT大于了Timeout后,那么,不等ack超时就直接重传。(Vegas 的核心思想是用RTT的值来影响拥塞窗口,而不是通过丢包) 这个算法的论文是《TCP Vegas: End to End Congestion Avoidance on a Global Internet》这篇论文给了Vegas和 New Reno的对比:

关于这个算法实现,你可以参看Linux源码:/net/ipv4/tcp_vegas.h, /net/ipv4/tcp_vegas.c

HSTCP(High Speed TCP) 算法

这个算法来自RFC 3649(Wikipedia词条)。其对最基础的算法进行了更改,他使得Congestion Window涨得快,减得慢。其中:

  1. 拥塞避免时的窗口增长方式: cwnd = cwnd + α(cwnd) / cwnd
  2. 丢包后窗口下降方式:cwnd = (1- β(cwnd))*cwnd

注:α(cwnd)和β(cwnd)都是函数,如果你要让他们和标准的TCP一样,那么让α(cwnd)=1,β(cwnd)=0.5就可以了。 对于α(cwnd)和β(cwnd)的值是个动态的变换的东西。 关于这个算法的实现,你可以参看Linux源码:/net/ipv4/tcp_highspeed.c

 TCP BIC 算法

2004年,产内出BIC算法。现在你还可以查得到相关的新闻《Google:美科学家研发BIC-TCP协议 速度是DSL六千倍》 BIC全称Binary Increase Congestion control,在Linux 2.6.8中是默认拥塞控制算法。BIC的发明者发这么多的拥塞控制算法都在努力找一个合适的cwnd Congestion Window,而且BIC-TCP的提出者们看穿了事情的本质,其实这就是一个搜索的过程,所以BIC这个算法主要用的是Binary Search——二分查找来干这个事。 关于这个算法实现,你可以参看Linux源码:/net/ipv4/tcp_bic.c

TCP WestWood算法

westwood采用和Reno相同的慢启动算法、拥塞避免算法。westwood的主要改进方面:在发送端做带宽估计,当探测到丢包时,根据带宽值来设置拥塞窗口、慢启动阈值。 那么,这个算法是怎么测量带宽的?每个RTT时间,会测量一次带宽,测量带宽的公式很简单,就是这段RTT内成功被ack了多少字节。因为,这个带宽和用RTT计算RTO一样,也是需要从每个样本来平滑到一个值的——也是用一个加权移平均的公式。 另外,我们知道,如果一个网络的带宽是每秒可以发送X个字节,而RTT是一个数据发出去后确认需要的时候,所以,X * RTT应该是我们缓冲区大小。所以,在这个算法中,ssthresh的值就是est_BD * min-RTT(最小的RTT值),如果丢包是Duplicated ACKs引起的,那么如果cwnd > ssthresh,则 cwin = ssthresh。如果是RTO引起的,cwnd = 1,进入慢启动。   关于这个算法实现,你可以参看Linux源码: /net/ipv4/tcp_westwood.c

拥塞算法示意图

以上就是拥塞控制的全部内容了,看完后,你再来看下⾯这张图⽚,每个过程我相信你都能明⽩:

拥塞避免是发送方使用的流量控制,而通告窗口则是接收方进行的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。

相关文章:

第三十三篇:TCP协议如何避免/减少网络拥塞,TCP系列八

一、流量控制 一般来说,我们总是希望数据传输得更快一些,但是如果发送方把数据发送得太快,接收方可能来不及接收,造成数据的丢失,数据重发,造成网络资源的浪费甚至网络拥塞。所谓的流量控制(fl…...

并发编程(2)——线程管控

目录 二、day2 1. 线程管控 1.1 归属权转移 1.2 joining_thread 1.2.1 如何使用 joining_thread 1.3 std::jthread 1.3.1 零开销原则 1.3.2 线程停止 1.4 容器管理线程对象 1.4.1 使用容器 1.4.2 如何选择线程运行数量 1.5 线程id 二、day2 今天学习如何管理线程&a…...

【数据仓库】

数据仓库:概念、架构与应用 目录 什么是数据仓库数据仓库的特点数据仓库的架构 3.1 数据源层3.2 数据集成层(ETL)3.3 数据存储层3.4 数据展示与应用层 数据仓库的建模方法 4.1 星型模型4.2 雪花模型4.3 星座模型 数据仓库与数据库的区别数据…...

计算机毕业设计——ssm基于HTML5的互动游戏新闻网站的设计与实现录像演示2021

作者:程序媛9688开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 🌟文末获取源码数据库🌟感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题)&#xff0…...

ubuntu上申请Let‘s Encrypt HTTPS 证书

Ubuntu 16.04及以上版本通常自带Snapd,如果你的系统还没有安装,可以通过以下命令安装: 安装Certbot# 使用Snap安装Certbot,确保你获得的是最新版本: bash sudo snap install --classic certbot准备Certbot命令# 确保C…...

解决VMware虚拟机的字体过小问题

前言: (1)先装VMware VMware17Pro虚拟机安装教程(超详细)-CSDN博客 (2)通过清华等镜像网站安装好Ubuntu镜像,下面贴上链接 教程虚拟机配置我没有做,因为学校给了现成的虚拟机~~大家需要的自己…...

java-web-day6-下-知识点小结

JDBC JDBC --是sun公司定义的一套操作所有关系型数据库的规范, 也就是接口api 数据库驱动 --是各个数据库厂家根据JDBC规范的具体实现, 例如mysql的驱动依赖 Lombok 简介 Lombok是一个实用的java类库, 通过注解的方式自动生成构造器, getter/setter, equals, hashcode, toStr…...

Cisco Packet Tracer 8.0 路由器静态路由配置

文章目录 静态路由简介一、定义与特点二、配置与命令三、优点与缺点四、应用场景 一,搭建拓扑图二,配置pc IP地址三,pc0 ping pc1 timeout四,配置路由器Router0五,配置路由器Router1六,测试 静态路由简介 …...

Unity3D学习FPS游戏(3)玩家第一人称视角转动和移动

前言:上一篇实现了角色简单的移动控制,但是实际游戏中玩家的视角是可以转动的,并根据转动后视角调整移动正前方。本篇实现玩家第一人称视角转动和移动,觉得有帮助的话可以点赞收藏支持一下! 玩家第一人称视角 修复小问…...

引领数字未来:通过企业架构推动数字化转型的策略与实践

在全球经济迅速数字化的背景下,企业正面临日益复杂的挑战。为了保持竞争优势,企业必须迅速调整其业务模式,采用先进的技术,推动业务创新。企业架构(EA)作为企业转型的战略工具,在这一过程中发挥…...

计算机毕业设计Python+大模型恶意木马流量检测与分类 恶意流量监测 随机森林模型 深度学习 机器学习 数据可视化 大数据毕业设计 信息安全 网络安全

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! Python大模型恶意木马流量检…...

ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用

本文整理于 2024 年云栖大会阿里云智能集团高级技术专家金吉祥(牟羽)带来的主题演讲《ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用》 云消息队列 ApsaraMQ 全系列产品 Serverless 化,支持按量付费、自适应弹性、跨可…...

Xcode 16.1 (16B40) 发布下载 - Apple 平台 IDE

Xcode 16.1 (16B40) 发布下载 - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 发布日期:2024 年 10 月 28 日 Xcode 16.1 包含适用于 iOS 18.1、iPadOS 18.1、Apple tvOS 18.1、watchOS 11.1、macOS Sequoia 15.1 和 visionOS 2.1 的 SDK。Xco…...

使用ONNX Runtime对模型进行推理

今天的深度学习可谓是十分热门,好像各行各业的人都会一点。而且特别是Hinton获得诺奖后,更是给深度学习添了一把火。星主深知大家可能在平时仅仅将模型训练好后就不会去理会它了,至于模型的部署,很多人都没有相关经验。由于我最近…...

五款pdf转换成word免费版,谁更胜一筹?

作为一名在都市丛林中奋斗的打工人,每天处理各种文件是家常便饭。尤其是PDF和Word文档之间的转换,简直是日常工作中不可或缺的一部分。今天,我就来和大家分享一下我使用过的几款PDF转Word免费版工具,看看它们的表现如何。 一、福…...

【C++】踏上C++学习之旅(四):细说“内联函数“的那些事

文章目录 前言1. "内联函数"被创造出来的意义2. 内联函数的概念2.1 内联函数在代码中的体现2.2 普通函数和内联函数的汇编代码 3. 内联函数的特性(重点)4. 总结 前言 本章来聊一聊C的创作者"本贾尼"大佬,为什么要创作出…...

SVN克隆或更新遇到Error: Checksum mismatch for xxx

文章目录 前言问题的产生探索解决方案正式的解决方法背后的故事总结 前言 TortoiseSVN 作为版本控制常用的工具,有一个更为人们熟知的名字 SVN,客观的讲SVN的门槛相比Git而言还是低一些的,用来存储一些文件并保留历史记录比较方便&#xff0…...

QT交互界面:实现按钮运行脚本程序

一.所需运行的脚本 本篇采用上一篇文章的脚本为运行对象,实现按钮运行脚本 上一篇文章:从0到1:QT项目在Linux下生成可以双击运用的程序(采用脚本)-CSDN博客 二.调用脚本的代码 widget.cpp中添加以下代码 #include &…...

驱动和芯片设计哪个难

驱动和芯片设计哪个难 芯片设计和驱动开发 芯片设计和驱动开发 都是具有挑战性的工作,它们各自有不同的难点和要求。 对于芯片设计,它是一个集高精尖于一体的复杂系统工程,涉及到从需求分析、前端设计、后端设计到流片的全过程。 芯片设计的…...

【云原生】云原生后端:监控与观察性

目录 引言一、监控的概念1.1 指标监控1.2 事件监控1.3 告警管理 二、观察性的定义三、实现监控与观察性的方法3.1 指标收集与监控3.2 日志管理3.3 性能分析 四、监控与观察性的最佳实践4.1 监控工具选择4.2 定期回顾与优化 结论参考资料 引言 在现代云原生架构中,监…...

ES6从入门到精通:前言

ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

无法与IP建立连接,未能下载VSCode服务器

如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

【AI学习】三、AI算法中的向量

在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Android15默认授权浮窗权限

我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...