计算机网络之数据链路层-上篇

数据链路层-上篇

概述

我们首先来看看数据链路层在网络体系结构中的地位。

如图所示,主机H1向主机H2发送数据,中间要经过3个路由器和电话网、局域网、广域网等多种网络。

从五层协议原理体系结构的角度来看,主机应具有体系结构中的各个层次。

而路由器仅需具有体系结构中下面三层,各设备通过物理层下面的传输媒体进行互连。

当主机H1向H2发送数据时,主机H1将待发送的数据逐层封装后,通过物理层将构成数据包的各比特转换为电信号,发送到传输媒体。

数据包进入路由器后,由下往上逐层解封到网络层。路由器根据数据包的目的网络地址和自身转发表,确定数据报的转发端口。然后从网络层向下逐层封装数据包,并通过物理层将数据包发送到传输媒体。

数据包最终到达主机H2时,还要由下往上逐层解封,最终解封出主机H1所发送的数据。

主机H1到H2的通信,可以看成是在4段不同的链路上的通信组成的。

所谓链路(Link)就是从一个结点到相邻结点的一段物理线路,而中间没有任何其他的交换节点。

仅有链路还不够,还需要一些通信协议来控制这些数据的传输。

数据链路(Data Link)是指把视线通信协议的硬件和软件加到链路上,就构成了数据链路。

在数据链路层上传输的数据包,又称为

也就是说,数据链路层是以帧为单位传输和处理数据。

数据链路层的三个重要问题

数据链路层传送的协议数据单元是

封装成帧

  • 封装成帧 (framing) 就是在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。
  • 首部和尾部的一个重要作用就是进行帧定界

差错控制

发送方将封装好的帧通过物理层发送到传输媒体,在传输过程中可能会产生比特差错:1 可能会变成 0, 而 0 也可能变成 1。

但是,接收方主机如何判断帧在传输过程中是否出现误码?

这可以通过检错码来发现。发送方在发送帧之前,基于待发送的数据和检错算法计算出检错码。并将其封装在帧尾。

可靠传输

接收方主机收到有误码的帧后,是不会接受该帧的,会将它丢弃。

如果数据链路层向其上层提供的是不可靠服务,那么丢弃就丢弃了,不会再有更多措施。

如果数据链路层向其上层提供的是可靠服务,那就还需要其他措施,来确保接收方主机还可以重新收到被丢弃的这个帧的正确副本

以上三个问题都是使用点对点信道的数据链路层来举例的

如果使用广播信道的数据链路层除了包含上面三个问题外,还有一些问题要解决

如图所示,主机A,B,C,D,E通过一根总线进行互连,主机A要给主机C发送数据,代表帧的信号会通过总线传输到总线上的其他各主机,那么主机B,D,E如何知道所收到的帧不是发送给它们的,主机C如何知道发送的帧是发送给自己的?

可以用编址(地址)的来解决。将帧的目的地址添加在帧中一起传输。

另外还有数据碰撞问题

当总线上多台主机同时使用总线来传输帧时,这是采用广播信道的共享式局域网不可避免的。

随着技术的发展,交换技术的成熟,

在 有线(局域网)领域 使用点对点链路链路层交换机交换式局域网取代了共享式局域网。

在无线局域网中仍然使用的是共享信道技术。

封装成帧

封装成帧是指数据链路层给上层交付的协议数据单元添加帧头和帧尾使之成为帧。

帧头和帧尾中包含有重要的控制信息

发送方的数据链路层将上层交付下来的协议数据单元封装成帧后,还要通过物理层,将构成帧的各比特,转换成电信号交给传输媒体,那么接收方的数据链路层如何从物理层交付的比特流中提取出一个个的帧?

实际上,帧头和帧尾的作用之一就是帧定界

但比不是每一种数据链路层协议的帧都包含有帧定界标志,例如下面例子:

前导码

  • 前同步码:作用是使接收方的时钟同步
  • 帧开始定界符:表明其后面紧跟着的就是MAC帧

另外以太网还规定了帧间间隔为96比特时间,因此,MAC帧不需要帧结束定界符。

接下来我们介绍透明传输的问题,透明传输是指数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样。

帧界定标志也就是个特定数据值,如果在上层交付的协议数据单元中, 恰好也包含这个特定数值,接收方就不能正确接收。

所以数据链路层应该对上层交付的数据有限制,其内容不能包含帧定界符的值。

解决透明传输问题

解决方法:面向字节的物理链路使用字节填充 (byte stuffing) 或字符填充 (character stuffing),面向比特的物理链路使用比特填充的方法实现透明传输。

发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是1B)。

接收端的数据链路层在将数据送往网络层之前删除插入的转义字符。

如果转义字符也出现在数据当中,那么应在转义字符前面插入一个转义字符 ESC。当接收端收到连续的两个转义字符时,就删除其中前面的一个。

为了提高帧传输的效率,应当使帧的数据部分的长度尽可能大些

考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的长度上限,即最大传送单元MTU(Maximum Transfer Unit)。

差错检测

介绍

我们知道,实际的通信链路都不是理想的,比特在传输过程中可能出现差错:1可能会变成0,而0可能会变成1。这称为比特差错

在一段时间内,传输错的比特占所传输比特总数比率称为误码率BER(Bit Error Rate)

使用差错检测码来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。

奇偶校验

在待发送的数据后面添加1位奇偶校验位,使整个数据(包括所添加的校验位在内)中"1"的个数为奇数(奇校验)或偶数(偶校验)。

通过下面例子可以看出:

如果有奇数个位发生误码,则奇偶性发生变化,可以检测出误码

如果有偶数个位发生误码,则奇偶性不发生变化,不能检测出误码(漏检)。

由于奇偶校验的漏检率比较高,因此计算机网络的数据链路层一般不会采用这种检测方法。

循环冗余校验CRC(Cyclic Redundancy Check)

这是一种具有很强检错能力的检错方法,漏检率极低。

  • 收发双方约定好一个生成多项式G(x);
  • 发送方基于待发送的数据和生成多项式计算出差错检测码(冗余码),将其添加至待传输数据后面一起传输;
  • 接收方通过生成多项式来计算收到的数据是否产生了误码;

总结

  • 检错码只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误
  • 要想纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错。但纠错码的开销比较大,在计算机网络中较少使用。
  • 循环冗余校验CRC有很好的检错能力(漏检率非常低),虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层
  • 在计算机网络中通常采用我们将要讨论的检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向其上层提供的是可靠传输服务还是不可靠传输服务。

循环冗余校验 CRC 是一种检错方法,而帧校验序列 FCS 是添加在数据后面的冗余码。

可靠传输

基本概念

当检测出帧中出现了比特差错,那么,接下来该如何处理呢?这取决于数据链路层向其上层提供的服务类型。

如果提供的是不可靠传输服务仅仅丢弃有误码的帧,其他什么也不做。

如果提供的是可靠传输服务想办法实现发送端发送什么,接收端就接收什么

一般情况下,有线链路的误码率比较低,为了减少开销,并不要求数据链路层向上提供可靠传输服务,即使出现了误码,可靠传输的问题也由其上层处理。

然而,无线链路易受干扰,误码率比较高,因此要求数据链路层必须向上层提供可靠传输服务。

需要说明的是比特差错只是传输差错中的一种。

从整个计算机网络体系结构来看,传输差错还包括分组丢失分组失序以及分组重复

  • 分组丢失:路由器输入队列快满了,主动丢弃收到的分组。
  • 分组失序:数据并未按照发送顺序依次到达接收端。
  • 分组重复:由于某些原因,有些分组在网络中滞留了,没有及时到达接收端,这可能会造成发送端对该分组的重发,重发的分组到达接收端,但一段时间后,滞留在网络的分组也到达了接收端,这就造成分组重复的传输差错。

分组丢失、分组失序以及分组重复这些传输差错,一般不会出现在数据链路层,而会出现在其上层。

可靠传输服务并不仅局限于数据链路层,其他各层均可选择实现可靠传输。

三种可靠协议

  • 停止-等待协议SW
  • 回退N帧协议GBN
  • 选择重传协议SR

这三种可靠传输实现机制的基本原理并不仅限于数据链路层,可以应用到计算机网络体系结构的各层协议中。

停止-等待协议SW

确认与否认

如下图所示,收发双方基于互联网通信,而不是局限于一条点对点的数据链路。

发送方给接收方发送数据分组,接收方收到后对其进行差错检测,如没有误码,则接受该数据分组,并给发送方发送确认分组,简称为ACK。

发送方收到对所发送数据分组的确认分组后,才能发送下一个数据分组。

假设这个数据分组在传输过程中出现了误码,接收方收到后对其进行差错检测,发现了误码,则丢弃该分组。并给发送方发送否认分组,简称NAK。

发送方收到对所发送数据分组的否认分组后,就知道了自己之前发送的数据分组出现了差错而被接收方拒绝,于是立刻重传该数据分组。

因此发送方每发送完一个数据分组后,并不能立刻将该数据分组从缓存中删除,只有在收到针对该数据分组的确认分组后,才可以将其从缓存中删除。随后发送下一个数据分组。

超时重传

发送方给接收方发送数据分组,然而该数据分组在传输过程中丢失了。

需要说明的是,对于数据链路层点对点信道而言,不太容易出现这种情况。

但对于多个网络通过多个路由器互连的复杂互联网环境而言,是会经常出现的。

接收方收不到数据分组,就不会发送ACK或者NAK。如果不采取其它措施,发送方就会一直处于等待接收方ACK或者NAK的状态。

为解决该问题,可以在发送方发送完一个数据分组后,启动一个超时计时器。若到了超时计时器所设置的重传时间而发送方仍没有收到接收方的ACK或NAK,则重传原来的数据分组,这就叫做超时重传

一般可将重传时间设置为略大于"从发送方到接收方的平均往返时间"。

  • 在数据链路层点对点的往返时间比较确定,重传时间比较好设定。
  • 然而在运输层,由于端到端往返时间非常不固定,设置合适的重传时间并不容易。

确认丢失

到目前为止,貌似基于停止等待、使用确认或否认分组,再加上超时重传的手段,就可以实现可靠传输了。

但请大家思考一下,是否还会出现目前手段不足以应对实现可靠传输的情况呢?

既然发送方发送的数据分组可能丢失,那么接收方放的确认或否认分组也可能丢失。

当接收方发送ACK或NAK丢失时候,必然会造成发送方对之前所发送数据分组的超时重传。

那么接收方如何判断该数据分组是否是一个重复分组呢?

避免分组重复这种传输错误,必须给每个分组带上序号

对于停止-等待协议,由于每发送一个数据分组就停止等待,只要保证每发送一个新的数据分组,其发送序号与上次发送的数据分组的序号不同即可。

因此,使用一个比特来编号就够了

确认迟到

既然发送分组需要编号,那么确认分组是否也需要编号呢?

我们来看这种情况,发送方发送0号数据分组,接收方正确接收后,给发送方发送确认分组。由于某些原因,该分组迟到了。

这必然会导致发送方进行超时重传,在重传0号数据分组的传输过程中,发送方接收到迟到了确认分组。于是发送1号数据分组。

接收方收到数据分组后,发现是一个重复的数据分组,则丢弃。并针对该数据分组发送确认分组,以免再次超时重传。

我们可以清楚地看到,这是对0号数据的重复确认。

但是发送方又如何知道呢?如果不采取其它措施的话,发送方会误认为这是对1号数据分组的确认分组。

如果对确认分组也进行编号,就可以解决这种误判。

对于数据链路层的点对点信道,往返时间比较固定,不会出现确认迟到的情况,可以不用给确认分组编号。

像停止-等待协议这样通过确认和重传机制实现的可靠传输协议,常称为自动请求重传协议ARQ(Automatic Repeat reQuest),意思是重传的请求是自动进行,因为不需要接收方显式地请求,发送方重传某个发送的分组。

回退N帧协议GBN

为什么使用回退N帧协议?

因为停止-等待协议的信道利用率很低,若出现超时重传,则信号利用率更低。

在相同的时间内,使用停止-等待协议的发送方只能发送一个数据分组,而采用流水线传输的发送方,可以发送多个数据分组。

回退N帧协议在流水线传输的基础上,利用发送窗口来限制发送方可连续发送数据分组的个数。

无差错情况流程

发送方将序号落在发送窗口内的0~4号数据分组,依次连续发送出去。

他们经过互联网传输正确到达接收方,没有乱序和误码,接收方按序接收它们,每接收一个,接收窗口就向前滑动一个位置,并给发送方发送针对所接收分组的确认分组,再通过互联网的传输正确到达了发送方。

发送方每接收一个、发送窗口就向前滑动一个位置,这样就有新的序号落入发送窗口,发送方可以将收到确认的数据分组从缓存中删除了,而接收方可以择机将已接收的数据分组交付上层处理。

使用回退N帧协议的接收方,可以采用累积确认的方式。也就是说,接收方不一定要对收到的数据分组逐个发送确认,而是可以在收到几个数据分组后,对按序到达的最后一个数据分组发送确认,ACKn表示序号为n及以前的数据分组都已正确接收。

假设发送方发送0-4号数据分组,正确到达接收方后进行发送确认分组,比如当确认到1号数据分组时,给发送方发送了一个累计确认ACK1,随后进行后续接受完2-4号数据分组后,又发送了一个ACK4。

即使ACK1在发送给发送方时丢失了,当ACK4到达发送方时,也可以知道序号为4及以前的数据已经被接收方正确接收了。发送方就可以将收到确认分组的数据从缓存中删除。

累计确认的优缺点:

优点:

  • 即使确认分组丢失,发送方也可能不必重传
  • 减小接收方的开销
  • 减小对网络资源的占用

缺点:

  • 不能向发送方及时反映出接收方已经正确接收的数据分组信息

有差错情况

例如,在传输数据分组时,5号数据分组出现误码,接收方通过数据分组中的检错码发现了错误。

于是丢弃该分组,而后续到达的这剩下四个分组与接收窗口的序号不匹配。

接收方同样也不能接收它们,将它们丢弃,并对之前按序接收的最后一个数据分组进行确认,发送ACK4,每丢弃一个数据分组,就发送一个ACK4

当收到重复的ACK4时,就知道之前所发送的数据分组出现了差错,于是可以不等超时计时器超时就立刻开始重传,具体收到几个重复确认就立刻重传,根据具体实现决定。

如果收到这4个重复的确认并不会触发发送方立刻重传,一段时间后。超时计时器超时,也会将发送窗口内已发送过的这些数据分组全部重传。

在本例中,尽管序号6、7、0、1的数据分组正确到达接收方方,但由于5号数据分组误码不被接受,它们也会受牵连而不被接受,发送方还要重传这些数据分组,这就是所谓的GO-back_N(回退N帧)。

可见,当通信线路信号不好时,回退N帧协议的信道利用率并不比停止-等待协议高。

总结

  • 回退N帧协议在流水线传输的基础上利用发送窗口来限制发送方连续发送数据分组的数量,是一种连续ARQ协议。
  • 在协议的工作过程中发送窗口和接收窗口不断向前滑动,因此这类协议又称为滑动窗口协议。

选择重传协议SR

回退N帧协议的接收窗口尺寸WR只能等于1,因此接收方只能按序接收正确到达的数据分组

一个数据分组的误码就会导致其后续多个数据分组不能被接收方按序接收而丢弃(尽管它们无乱序和误码)。这必然会造成发送方对这些数据分组的超时重传,显然这是对通信资源的极大浪费。

为了进一步提高性能,可设法只重传出现误码的数据分组。因此,接收窗口的尺寸WR不应再等于1而应该大于1,以便接收方先收下失序到达但无误码并且序号落在接收窗内的那些数据分组,等到所缺分组收齐后再进一并送交给上层。这就是选择重传协议

需要注意的是:选择重传协议为了使发送方仅重传出现差错的分组,接收方不能再使用累计确认,而需要对每个正确接收到的数据分组进行逐一确认

假设采用3个比特给分组编序号,因此序号的取值范围是0-7,当序号到达7时再从0开始。

接收方的WR一般可与发送窗口的尺寸WT取值相同

发送方将数据分组按序发送出去,经过互联网传输后陆续到达接收方,但其中2号数据分组丢失了

只要序号落入接收窗口内且无误码的数据分组,接收方都会接收。

接收方接收0号和1号数据分组,并发送0号和1号确认分组,接收窗口向前滑动两个位置,这样就有4和5这两个新的序号落入接收窗口。

接收方接收3号分组,并发送3号确认分组,但接收窗口不能向前滑动,因为3号数据分组是未按序到达的数据分组。

这些确认分组经过互联网的传输陆续到达发送方。发送方每按序收到一个确认分组,发送窗口就向前滑动一个位置。

发送方接收0号和1号确认分组,发送窗口向前滑动两个位置。这样就有4和5这两个新的序号落入发送窗口。

发送方将序号落入发送窗口的4号和5号数据发送出去。这时发送方就可以删除0号和1号数据缓存。

接收方可择机将已接收到的0和1交付给上层处理。

发送方接收3号确认分组,但发送窗口不能向前滑动,因为这是一个未按序到达的确认分组,发送方还未收到它之前的2号确认分组。不过需要记录3号数据分组已收到确认,这样该数据分组就不会超时重发

随后接收方接收4号和5号数据分组,并发送4号和5号确认分组,但接收窗口不能向前滑动,因为它们是未按序到达的数据分组。接收方还没收到它们之前的2号数据分组。

随后发送方会针对2号数据进行超时重发,此时发送方也接收到了4号和5号的确认分组,但发送窗口不能向前滑动,因为因为这是一个未按序到达的确认分组,发送方还未收到它之前的2号确认分组。不过需要记录4号和5号数据分组已收到确认,这样该数据分组就不会超时重发

随后接收方接收到2号数据分组,接受窗口就可以向前滑动4个位置,这样6、7、0、1这四个新的序号落入接收窗口。

2号确认分组经过互联网的传输到达发送方,发送方接收该确认分组,发送方窗口可以向前滑动4个位置。这样6、7、0、1这四个新的序号落入发送窗口。

这样就可以继续发送接下来的数据了,并且从缓存中删除之前的数据分组。

总结

如果发送窗口和接收窗口的尺寸超过了取值范围,就会使接收方无法分辨新、旧数据分组,进而出现分组重复这种传输差错。

热门文章

暂无图片
编程学习 ·

那些年让我们目瞪口呆的bug

程序员一生与bug奋战,可谓是杀敌无数,见怪不怪了!在某知识社交平台中,一个“有哪些让程序员目瞪口呆的bug”的话题引来了6700多万的阅读,可见程序员们对一个话题的敏感度有多高。 1、麻省理工“只能发500英里的邮件” …
暂无图片
编程学习 ·

redis的下载与安装

下载redis wget http://download.redis.io/releases/redis-5.0.0.tar.gz解压redis tar -zxvf redis-5.0.0.tar.gz编译 make安装 make install快链方便进入redis ln -s redis-5.0.0 redis
暂无图片
编程学习 ·

《大话数据结构》第三章学习笔记--线性表(一)

线性表的定义 线性表:零个或多个数据元素的有限序列。 线性表元素的个数n定义为线性表的长度。n为0时,为空表。 在比较复杂的线性表中,一个数据元素可以由若干个数据项组成。 线性表的存储结构 顺序存储结构 可以用C语言中的一维数组来…
暂无图片
编程学习 ·

对象的扩展

文章目录对象的扩展属性的简洁表示法属性名表达式方法的name属性属性的可枚举性和遍历可枚举性属性的遍历super关键字对象的扩展运算符解构赋值扩展运算符AggregateError错误对象对象的扩展 属性的简洁表示法 const foo bar; const baz {foo}; baz // {foo: "bar"…
暂无图片
编程学习 ·

让程序员最头疼的5种编程语言

世界上的编程语言,按照其应用领域,可以粗略地分成三类。 有的语言是多面手,在很多不同的领域都能派上用场。大家学过的编程语言很多都属于这一类,比如说 C,Java, Python。 有的语言专注于某一特定的领域&…
暂无图片
编程学习 ·

写论文注意事项

参考链接 给研究生修改了一篇论文后,该985博导几近崩溃…… 重点分析 摘要与结论几乎重合 这一条是我见过研究生论文中最常出现的事情,很多情况下,他们论文中摘要部分与结论部分重复率超过70%。对于摘要而言,首先要用一小句话引…
暂无图片
编程学习 ·

安卓 串口开发

上图: 上码: 在APP grable添加 // 串口 需要配合在项目build.gradle中的repositories添加 maven {url "https://jitpack.io" }implementation com.github.licheedev.Android-SerialPort-API:serialport:1.0.1implementation com.jakewhart…
暂无图片
编程学习 ·

2021-2027年中国铪市场调研与发展趋势分析报告

2021-2027年中国铪市场调研与发展趋势分析报告 本报告研究中国市场铪的生产、消费及进出口情况,重点关注在中国市场扮演重要角色的全球及本土铪生产商,呈现这些厂商在中国市场的铪销量、收入、价格、毛利率、市场份额等关键指标。此外,针对…
暂无图片
编程学习 ·

Aggressive cows题目翻译

描述&#xff1a; Farmer John has built a new long barn, with N (2 < N < 100,000) stalls.&#xff08;John农民已经新建了一个长畜棚带有N&#xff08;2<N<100000&#xff09;个牛棚&#xff09; The stalls are located along a straight line at positions…
暂无图片
编程学习 ·

剖析组建PMO的6个大坑︱PMO深度实践

随着事业环境因素的不断纷繁演进&#xff0c;项目时代正在悄悄来临。设立项目经理转岗、要求PMP等项目管理证书已是基操&#xff0c;越来越多的组织开始组建PMO团队&#xff0c;大有曾经公司纷纷建造中台的气质&#xff08;当然两者的本质并不相同&#xff0c;只是说明这个趋势…
暂无图片
编程学习 ·

Flowable入门系列文章118 - 进程实例 07

1、获取流程实例的变量 GET运行时/进程实例/ {processInstanceId} /变量/ {变量名} 表1.获取流程实例的变量 - URL参数 参数需要值描述processInstanceId是串将流程实例的id添加到变量中。变量名是串要获取的变量的名称。 表2.获取流程实例的变量 - 响应代码 响应码描述200指…
暂无图片
编程学习 ·

微信每天自动给女[男]朋友发早安和土味情话

微信通知&#xff0c;每天给女朋友发早安、情话、诗句、天气信息等~ 前言 之前逛GitHub的时候发现了一个自动签到的小工具&#xff0c;b站、掘金等都可以&#xff0c;我看了下源码发现也是很简洁&#xff0c;也尝试用了一下&#xff0c;配置也都很简单&#xff0c;主要是他有一…
暂无图片
编程学习 ·

C语言二分查找详解

二分查找是一种知名度很高的查找算法&#xff0c;在对有序数列进行查找时效率远高于传统的顺序查找。 下面这张动图对比了二者的效率差距。 二分查找的基本思想就是通过把目标数和当前数列的中间数进行比较&#xff0c;从而确定目标数是在中间数的左边还是右边&#xff0c;将查…
暂无图片
编程学习 ·

项目经理,你有什么优势吗?

大侠被一个问题问住了&#xff1a;你和别人比&#xff0c;你的优势是什么呢? 大侠听到这个问题后&#xff0c;脱口而出道&#xff1a;“项目管理能力和经验啊。” 听者抬头看了一下大侠&#xff0c;显然听者对大侠的这个回答不是很满意&#xff0c;但也没有继续追问。 大侠回家…
暂无图片
编程学习 ·

nginx的负载均衡和故障转移

#注&#xff1a;proxy_temp_path和proxy_cache_path指定的路径必须在同一分区 proxy_temp_path /data0/proxy_temp_dir; #设置Web缓存区名称为cache_one&#xff0c;内存缓存空间大小为200MB&#xff0c;1天没有被访问的内容自动清除&#xff0c;硬盘缓存空间大小为30GB。 pro…
暂无图片
编程学习 ·

业务逻辑漏洞

身份认证安全 绕过身份认证的几种方法 暴力破解 测试方法∶在没有验证码限制或者一次验证码可以多次使用的地方&#xff0c;可以分为以下几种情况︰ (1)爆破用户名。当输入的用户名不存在时&#xff0c;会显示请输入正确用户名&#xff0c;或者用户名不存在 (2)已知用户名。…