【网络通信基础与实践第四讲】用户数据报协议UDP和传输控制协议TCP

一、UDP的主要特点

1、UDP是无连接的,减少了开销和发送数据之前的时延

2、UDP使用尽最大努力交付,但是不保证可靠交付

3、UDP是面向报文的。从应用层到运输层再到IP层都只是添加一个相应的首部即可

4、UDP没有拥塞机制,源主机以恒定的速率发送数据,允许在网络发生拥塞时丢失一些数据,但是不允许数据有太大的延迟

5、UDP支持一对一、一对多、多对一和多对多的交互通信。

6、UDP的首部开销小,只有八个字节。

二、UDP的首部格式

主机中的多个应用进程把用户数据通过各自的端口传输到了运输层后,就共用同一个网络层协议,把收到的UDP用户数据报组装成不同的IP数据报发送到互联网,这就是UDP的复用功能。

主机的网络层收到多个IP数据报后,提取出数据部分(UDP用户数据报),然后根据其首部中的目的端口号,分别传送到相应的端口,以便上层的应用进程到端口读取数据,这就是UDP的分用功能。

UDP有两个字段:数据字段和首部字段。首部字段很简单,只有八个字节,由四个字段组成,每个字段的长度都为2字节。

(1)源端口

在需要对方回信时选用,不需要时可以全部设置为0

(2)目的端口

在终点交付报文时必须使用

(3)长度

UDP用户数据报的长度,最小值为8(仅由首部)

(4)检验和 

通过在数据报之前添加12个字节的伪首部,伪首部既不向下传送也不向上递交,UDP的检验和是把首部和数据部分一起检验,检测UDP用户数据报在传输中是否有错

三、TCP协议的特点

1、TCP是面向连接的运输层协议

应用程序在使用TCP协议之前,必须先建立TCP连接,在传输数据完成之后必须释放已经建立的TCP连接。TCP连接的端点叫做嵌套字(socket)

嵌套字socket = (IP地址:端口号)

每一条TCP连接唯一地址被通信两端的两个端点所确定

TCP连接::={socket1,socket2} = {(IP1:port1),(IP2,port2)}

同一个ip地址可以有多个不同的TCP连接,而同一个端口号也可以出现在多个不同的TCP连接中。

2、每一条TCP连接是点对点的

3、TCP提供可靠交付的服务

通过TCP连接传送的数据,无差错、不丢失、不重复并且按序到达。

(1)停止等待协议

(i)无差错情况

(ii)出现差错

A只要超过一段时间仍然没有收到确认就认为刚才发送的分组丢失了,因而重传前面发送的分组,叫做超时重传。

因此,A在发送完一个分组后,必须暂时保留已经发送的分组的副本(在发送超时时使用),而且分组和确认分组必须进行编号,超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。 

(iii)确认丢失和确认迟到

(2)连续ARQ协议

连续ARQ协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。

接收方采取累计确认的方式,也就是说接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认。 

4、TCP提供全双工通信

TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存。

5、面向字节流

TCP中的“流”指的是流入到进程或者从进程流出的字节序列。

四、TCP报文段的首部格式

TCP报文的首部的前20个字节是固定的,后面有4n个字节是根据需要而增加的选项。因此TCP首部的最小长度是20字节。

(1)源端口和目的端口

各占用两个字节

(2)序号

占用四个字节,在TCP连接中传送的字节流中的每一个字节都按照序号编号。首部中的序号值为本报文段所发送的数据的第一个字节的序号。

(3)确认号

占四字节,是期望收到对方的下一个报文段的第一个数据字节的序号。例如,B收到了A发送过来的一个报文段,其序号字段值为501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号为701,于是B在发送给A的确认报文段中把确认号置为701。

总之,若确认号为N,则表明到序号N-1位置的所有数据都已正确收到。

(4)数据偏移

占4位,实际上指出了TCP报文段的首部长度,由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。

(5)保留

占6位,保留为今后使用

(6)6个控制位 

紧急URG:当URG=1时,表明紧急指针有效。他告诉系统此报文段中有紧急数据,应该尽快传送,而不需要按照原来的排队顺序传送。

确认ACK:仅当ACK=1时确认号字段才有效。

推送PUSH:当两个应用进程进行交互式的通信时,有时一端的应用程序希望在键入一个命令后立即就能够收到对方的响应,而不需要等待整个缓存都填满了再向上交付。

复位RST:当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。

同步SYN:SNY置1表示这是一个连接请求或者连接接受报文

终止FIN:当FIN=1时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。

(7)窗口

窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(因为接收方的数据缓存空间是有限的)

总之,窗口字段明明确指出了现在允许对方发送的数据量。窗口值经常在动态地变化着。

(8)检验和

占两字节,检验和字段检验的范围包括首部和数据这两部分。

(9)紧急指针

占2字节,紧急指针只有在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。

(10)选项

长度可变,最长可达40字节

TCP最初只规定了最大报文长度MSS,是每一个TCP报文段中的数据字段的最大长度。除此之外,还有窗口扩大选项,时间戳选项,选择确认(STACK)选项。

五、TCP可靠传输的实现

1、以字节为单位的滑动窗口

(1)发送窗口表示:在没有收到B的确认的情况下,A可以连续把窗口内的数据都发送出去。凡是已经发送的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。

发送窗口的位置由窗口前沿和后沿的位置共同确定。发送窗口后沿的变化情况有两种可能,即不动(没有收到新的确认)和前移(收到了新的确认)

(2)要描述一个发送窗口的状态需要三个指针:P1,P2,P3。指针都指向字节的序号。 

P1之前的数据是已发送并已收到确认的部分

P3之后的数据是不允许发送的数据

P3-P1=A的发送窗口=20

P2-P1=已发送但尚未收到确认的字节数

P3-P2=允许发送但是当前尚未发送的字节数(又称为可用窗口)
(3)除此之外,还需要注意三点

虽然A的发送窗口是根据B的接收窗口设置的,但是在同一时刻,A的发送窗口并不总是和B的接收窗口一样大。

TCP通常是把不按序到达的数据先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。

TCP要求接收方必须有累积确认的功能,这样可以减小传输开销。

2、超时重传时间的选择

TCP采取了一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间差就是报文段的往返时间RTT。TCP保留了RTT的一个加权平均往返时间RTTs

新的RTTs=(1-a)* (旧的RTTs)+ a * (新的RTT样本)

超市计时器设置的超时重传时间RTO应该略大于上面得出的RTTs。

RTO=RTTs + 4 * RTTd

3、选择确认SACK

若收到的报文段无差错,只是未按照序号,中间还缺少一些序号的数据,选择确认SACK可以只传送缺少的数据而不重传已经正确到达接收方的数据。

如果要使用选择确认SACK,那么在建立TCP连接时,就要在TCP首部的选项中加上“允许SACK”的选项,而必须双方都事先商量好。

六、TCP的流量控制

1、利用滑动窗口实现流量控制

所谓的流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收

设A向B发送数据,在建立连接时,B告诉A我的接受窗口rwnd=400,之后接收方的主机B进行了三次流量控制。第一次减少到rwnd=300,第二次减少到rwnd=100,最后减少到rwnd=0,之后即不允许发送方再次发送数据了,这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。

但是同时存在一个潜在的问题,就是如果主机B重新发出的新的窗口值在传输的过程中丢失了,A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据,如果没有其他的措施,这种互相等待的死锁局面将一直延续下去。

为了解决这个问题,TCP为每一个连接设有一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续的计时器设置的时间到期,就发送一个零窗口探测报文段,而对方就在确认这个探测报文段时给出了现在的窗口值。如果窗口仍然为零,那么收到这个报文段的一方就重新设置持续寄存器。如果窗口不是零,那么死锁的僵局就可以被打破了。

2、TCP的传输效率

(1)TCP报文段的发送时机问题

可以采用不同的机制来控制TCP报文段的发送时机。

第一种机制就是TCP维持一个变量,它等于最大报文长度MSS。只要缓存中存放的数据达到MSS字节时,就组装成一个TCP报文发送出去,

第二种机制是由发送方的应用程序指明要求发送报文段,即TCP支持的推送操作。

第三种机制是发送方的一个计时器期限到了,这时就把当前的缓存数据装入报文段(但长度不能超过MSS)发送出去,目前广泛采用Nagle算法来控制TCP发送报文段的时机。

(2)糊涂窗口综合征(silly window syndrome)

还有一种情况就是TCP的接收方的缓存已满,而交互式的应用进程一次只从接收缓存中读取1个字节(这样就使接受空间只腾出一个字节),然后向发送方发送确认,并将窗口设置为1个字节。接着,发送方又发来一个字节的数据。接收方发回确认,仍然将窗口设置为一个字节,这种情况被称为糊涂窗口综合征(silly window syndrome)

要解决这个问题,可以让接收方等待一段时间,使得或者接受缓存有足够的空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。只要这两个情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。

七、TCP的拥塞机制

1、拥塞控制的一般原理

在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞(congestion)

拥塞控制与流量控制的关系非常密切,它们之间也存在着一些差别。所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不至于过载。拥塞控制是一个全局性的过程,而流量控制往往是点对点通信量的控制,是个端对端的问题(接收端控制发送端),流量控制所要做的就是抑制发送端发送数据的速率,以便接收端来得及接收。

流量控制可以用来比喻水桶太小,来不及接收注入水桶的水,这时只好请求管水龙头的人把水龙头拧的小一点,以减缓放水的速率。

拥塞控制表示虽然水桶足够大,但是管道中有很狭窄的地方,使得管道不通畅,水流被阻塞,反馈到管水龙头的人那里请求把水龙头拧小一点减缓放水的速率目的是为了减缓水管的阻塞状态。

当网络的吞吐量明显小于理想的吞吐量,网格就进入了轻度拥塞的状态。更值得注意的是,当提供的负载达到某一数值时,网络的吞吐量反而随着提供的负载的增大而下降到零,网络已经无法正常工作,这就是所谓的死锁。

从控制理论的角度来看拥塞控制的问题,可以分为开环控制和闭环控制两种方法。开环控制就是在设计网络时事先将发生拥塞的有关因素考虑到,力求网络在工作时不发生拥塞。但是一旦整个系统运行起来,就不再中途进行改正了、

闭环控制基于反馈环路的概念,监测网络系统以便检测到拥塞在何时何处发生,把拥塞发生的信息传送到可采取行动的地方,调整网络系统的运行以解决出现的问题。

2、TCP的拥塞控制方法

TCP进行拥塞控制的算法有四种:慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)和快恢复(fast recovery)。 

1、慢开始算法和拥塞控制

发送方维持一个叫做拥塞窗口cwnd的状态变量。发送方控制拥塞窗口的原则是只要网络没有出现拥塞,拥塞窗口就可以更增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。

这里发送方在超时重传计时器启动时,就判断网络出现了阻塞。

慢开始的算法是由小到大逐渐增大注入到网络中的数据字节,也就是说,由小到大逐渐增大拥塞窗口数值。

慢开始规定:在每收到一个新的报文段的确认后,可以把拥塞窗口增加最多一个SMSS的数值,也就是说:

拥塞窗口cwnd每次的增加量=min(N,SMSS),N是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。 

为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。

当cwnd<ssthresh时,使用上述的慢开始算法;

当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法;

当cwnd=ssthresh时,都可以;

拥塞避免算法的目的是让拥塞窗口cwnd加法增大(Additive Increase),即按照线性规律缓慢增长。

 

2、快重传和快恢复

快重传算法规定,发送方只要一连收到3个重复确认,就可以知道现在并未出现网络拥塞,而只是接收方少收到一个报文段M3,因而立即进行重传M3。

当发送方知道了现在只是丢失了个别的报文段,于是不启动慢开始,而是执行快恢复算法。

如果把本节所讨论的拥塞控制和接收方对发送方的流量控制一起考虑,那么发送窗口的上限值=Min[rwnd,cwnd],也就是说,rwnd和cwnd中数值较小的一个,控制了发送方发送数据的速率。

3、主动队列管理AQM(Active Queue Managemnet)

网络层的策略对TCP拥塞控制影响最大的就是路由器的分组丢弃策略。在最简单的情况下,路由器的队列通常都按照先进先出FIFO的规则处理到来的分组。由于队列长度总是有限的,因此当队列已满时,以后再到达的所有分组都将被丢弃,这就叫做尾部丢弃策略。

而在网络中通常有很多的TCP连接,这些连接中的报文段通常是复用在网络层的IP数据报中传输的。在这种情况下若发生了路由器的尾部丢弃,就可能会同时影响到很多条TCP连接,结果使很许多TCP连接在同一时间突然都进入到慢开始状态,称为全局同步,主动队列管理AQM可以在队列长度达到某个值得警惕的数值时就主动丢弃到达的分组,经典的方法有随机早期检测RED。

八、TCP的运输连接管理

1、TCP的连接建立

TCP建立连接的过程叫做握手,握手需要在客户端和服务器之间交换三个报文段。

(1)最初两端的TCP进程都处于CLOSED状态。

(2)一开始B的TCP服务器进程先创建传输控制块TCB,准备接收客户进程的连接请求。然后服务器进程处于LISTEN状态,等待客户的连接请求。

(3)A的TCP客户进程也是首先创建传输控制块TCB。然后在打算建立TCP连接时向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x,这时TCP客户进程进入SYN-SENT状态。

(4)B收到连接请求报文段后,若同意建立连接,则向A发送确认。在确认报文段中应该吧SYN位和ACK位都置1,确认号为ack=x+1,同时也为自己选择一个初始序号seq=y。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。如果B先发送一个确认报文段(ACK=1,ack=x+1),然后再发送一个同步报文段(SYN=1,seq=y),这样就变成了四报文握手

(5)TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1,这时,TCP连接已经建立,A进入ESTABLISHED状态

(6)当B收到A的确认以后,也进入ESTABLISHED状态。 

采用三报文或者四报文握手最后一次的确认是为了防止已失效的连接请求报文段(网络节点时间长滞留了)突然又传送到了B因而产生错误。

2、TCP的连接释放

TCP还设有保活计时器(keepalive timer),当客户端已经主动与服务器建立了TCP连接,但是后来客户端的主机突然出现了故障,这个时候服务器就不能收到客户发来的数据,可以通过服务器每收到一次数据就重新设置保活计时器的方式 避免服务器白白等待、

3、TCP的有限状态机

 

 

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

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

相关文章

Zookeeper安装使用教程

# 安装 官网下载安装包 #配置文件 端口默认8080&#xff0c;可能需要更改一下 #启动 cd /Users/lisongsong/software/apache-zookeeper-3.7.2-bin/bin ./zkServer.sh start #查看运行状态 ./zkServer.sh status #停止 ./zkServer.sh stop #启动客户端 ./zkCli.sh ls /

Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW

GUFW是UFW的图形化前端&#xff0c;可以通过以下命令安装&#xff1a; sudo apt install gufw安装成功后&#xff0c;可以通过应用程序菜单启动GUFW&#xff0c;在图形界面中&#xff0c;可以方便地添加、修改和删除规则&#xff0c;查看状态和日志。

java之杨辉三角问题

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 如何实现呢&#xff1f; 思路&#xff1a;首先&#xff0c;我们可以将杨辉三角视作i行j列的二维数组。除了第一行和第二行之外&am…

IPD流程体系:IPD在硬件产品开发中的应用

目录 1、内容简介 2、开发各阶段介绍 3、PVT阶段 4、资源群更新 作者简介 1、内容简介 在硬件类相关产品的开发过程中&#xff0c; 每个阶段的工作都是需要按照一定的流程、规范和标准去进行的。 整体还是相对瀑布化的流程&#xff0c; 每个阶段的输入、输出、准入、准…

C++初阶学习——探索STL奥秘——反向迭代器

适配器模式是 STL 中的重要组成部分&#xff0c;除了容器适配器外&#xff0c;还有 选代器适配器&#xff0c;借助 选代器适配器 &#xff0c;可以轻松将各种容器中的普通迭代器转变为反向迭代器&#xff0c;这正是适配器的核心思想 注:库中的反向迭代器在设计时&#xff0c;为…

【HTTP】请求“报头”(Host、Content-Length/Content-Type、User-Agent(简称 UA))

Host 表示服务器主机的地址和端口号 URL 里面不是已经有 Host 了吗&#xff0c;为什么还要写一次&#xff1f; 这里的 Host 和 URL 中的 IP 地址、端口什么的&#xff0c;绝大部分情况下是一样的&#xff0c;少数情况下可能不同当前我们经过某个代理进行转发。过程中&#xf…

С++第十三节课 string初体验

一、string类的相关函数 string实际上也就是一个管理字符的顺序表&#xff01; 如果我们需要遍历一个字符串&#xff0c;怎么实现&#xff1f; 我们可以通过下标访问操作符 size实现字符串的遍历&#xff01; int main() {string s1("hello world");// 遍历一个字…

不可思议的效率飞跃:RPA如何重塑你的工作流程,释放人力潜能!

RPA简介 机器人流程自动化&#xff08;Robotic Process Automation&#xff0c;简称RPA&#xff09;是一种模拟人类用户操作的软件技术&#xff0c;它通过自动化执行重复性、规律性强的任务来提高工作效率和准确性。RPA软件机器人可以模拟鼠标点击、键盘输入、数据复制粘贴等操…

anaconda的windows新手安装及配置教程(适用于物联网工程、计算机专业)

第一步:点击免费下载 点击我直达anaconda官网">——>点击我直达anaconda官网 第二步:跳过注册 第三步:下载windows版本 第四步:安装步骤 1.Next (下一步) 2.I Agree (我同意) 3.默认即可,下一步 4.安装地址可以选到D盘,如果没有默认也行,只是一个…

OpenAI GPT o1技术报告阅读(4)- 填字游戏推理

✨继续阅读报告&#xff1a;使用大模型来学习推理(Reason) 原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 这次我们继续看一个填字游戏的案例。 我们先看下问题&#xff1a; 解决以下填字游戏&#xff1a; Across&#xff08;横向&#xff09…

推荐2024年好用的4款日语翻译工具

日语在学习研究&#xff0c;商务合作&#xff0c;旅游文化交流等多个领域还是占有着一个比较重要的作用&#xff0c;将中日两种语言进行准确地翻译能够这些活动更加高效有益地进行和发展。因此好的翻译工具便尤为重要&#xff0c;今天我也给大家挑选了几款优秀地日语翻译工具。…

可视化工具箱-Visualization Toolkit(VTK)

一、Visualization Toolkit&#xff08;VTK&#xff09;简概 可视化工具箱&#xff08;VTK&#xff09;&#xff0c;是一个用于3D计算机图形、图像处理和科学可视化的开源软件系统&#xff0c;其包含C类库和Tcl/Tk、Java与python的解释型接口层。VTK支持各种可视化算法&#xf…

电机设计及电机仿真APP系列之—轴向磁通电机仿真APP

电机的各种工作状态和参数变化。用户可通过调整仿真参数&#xff0c;快速得到电机的响应和性能参数&#xff0c;从而进行针对性的优化和改进。借助仿真APP&#xff0c;可大大减少电机设计迭代次数和成本&#xff0c;提高测试效率和准确性。 小编整理了10款不同类型的电机仿真A…

前端vue-v-for循环遍历

&#xff08;item,index&#xff09;in list中&#xff0c;index这个索引可加可不加&#xff0c;item代表list中的每一个元素&#xff0c;list可以是数组&#xff0c;也可以是对象&#xff0c;要遍历谁就把 &#xff08;item,index&#xff09;in list加在哪里。 关于加不加&a…

BUUCTF-MISC-隐藏的钥匙

下载题目文件&#xff0c;获得了一张格式为jpg的路飞图片 按照习惯&#xff0c;首先使用十六进制编译器打开文件&#xff0c;这里我使用winhex打开文件 首先考虑有没有flag直接隐写在文件中&#xff0c;按照图示步骤查找flag字段 我们查到了flag&#xff0c;通过经验和图中base…

MySQL的缓存策略

目录 一、MySQL 缓存方案用来干什么 二、提升MySQL访问性能的方式 1、读写分离&#xff08;MySQL的主从复制&#xff09; 2、连接池 3、异步连接 三、缓存方案是怎么解决的 1、缓存与MySQL一致性状态分析 2、制定热点数据的读写策略 四、缓存方案问题的解决方法 1、缓…

正点原子阿尔法ARM开发板-IMX6ULL(八)——串口通信(寄存器解释)(补:有源蜂鸣器)

文章目录 一、蜂鸣器&#xff08;待&#xff0c;理解&#xff09;1.1 第一行1.2 第二行1.3 第三行 二、串口原理2.1 通信格式2.2 UART寄存器 一、蜂鸣器&#xff08;待&#xff0c;理解&#xff09; 1.1 第一行 对于第一行&#xff0c;首先先到fsl_iomuxc文件里面寻找IOMUXC_S…

人力资源数据集分析(一)_t-test、卡方检验和描述性统计

数据入口&#xff1a;人力资源分析数据集 - Heywhale.com 数据说明 字段说明EmpID唯一的员工IDAge年龄AgeGroup年龄组Attrition是否离职BusinessTravel出差&#xff1a;很少、频繁、不出差DailyRate日薪Department任职部门&#xff1a;研发部门、销售部门、人力资源部门Dista…

【VUE3.0】如何得到一张像素风格的图片?

目录 引言网络途径获取代码转换已有的图片0. 先看效果1. 上传图片&#xff0c;这个没什么好说的&#xff0c;前端上传图片基本操作。2. 通过滑动条提供一个1-10的数字&#xff0c;用于放缩图片画质。3. 函数拿到图片资源后先对图片进行缩小100倍尺寸处理&#xff0c;此时画质已…

服务器非法关闭后MySQL服务启动失败

在写这篇文章前&#xff0c;我弄好了&#xff0c;写完之后把成功安装的几个MySQL都删除了&#xff0c;只留了最后测试成功的服务“mysql-test” ,然后点击运行&#xff0c;发现又出现上图的错误。心态炸了。 本以为定位到问题了&#xff0c;但是这个错误让我迷茫了。我只能临时…