0%

计网 - 数据链路层

简单的说,数据链路层定义了电信号的分组方式。

数据链路层,连接了上层的 网络层 和下层的 物理层

数据链路层是对物理层功能的增强,将物理层连接转为逻辑上无差错的链路。

为上层网络层提供透明传输和可靠的数据传输服务。

数据链路层

单纯的电信号0和1是没有任何意义的,只有规定多少个为一组,每一组都是什么意思才有意义。
而这些分组要有意义,是由 通信协议 来控制的。

把实现这些 通信协议 的硬件和软件加到链路上,就形成了数据链路。
这样的硬件比如:网卡、交换机。

数据链路层需要解决三个问题:封装成帧、透明传输、差错校验。

主要关注的是:

  1. 怎么封装成帧
  2. 怎么去传输帧
  3. 帧传输目的地
  4. 校验帧完整性
在一段数据的前后增加首部、尾部,这就形成了一个帧。

数据链路帧

帧,包含:帧头、数据部分、帧尾。

不同的数据链路层通信协议会对应着不同的帧。

帧头

由8位二进制数组成,代表的是网络层数据包的开始。

从应用层开始往下,每一层都会接收上层数据,并加入自己的头。

数据部分

大小至少46字节,最大1500字节,也就是最大传输单元MTU。

如果数据过大,将会产生分片。

帧尾

由8位二进制数组成,代表的是网络层数据包的结束,也包含了一些控制信息。

通过帧的首部和尾部包含的控制信息,来给帧定义一个边界。

帧,采用的是透明传输。

不论上层传输过来的内容是什么,数据链路层只会将上层的数据部分的内容往下传输,起到一个通道的作用,并且保证传输质量,不参与任何业务。

为了表示一个帧结束了,在帧尾添加了 特殊转义字符ESC。当然,由于对上层数据采用透传的策略,可能因为数据中就包含了ESC,导致帧提前结束,因此遇到 多个ESC 的时候,将会删除其它,采用最后一个作为结束。

由于数据帧传输过程中可能发生错误,则需要差错校验。

因为在网络中传输的过程中,可能会有噪声等多方面因素,导致原本数据包中的bit产生比特差错,由1变成0,由0变成1,就需要进行差错校验。

差错校验

数据链路层中采用的方式是:CRC循环冗余校验法

CRC校验,通过在数据为K位的数据后添加n位的冗余码组成帧。

CRC校验

发送端和接收端,共同协商出一个多项式,作为除数,将要发送的数据设定为固定大小的位数,作为被除数,通过反复的异或取余,最终得到一个冗余码,通过比较二者冗余码 FCS是否一致来确定帧的完整性
多项式

多项式由 x^n 是否存在,由高到低组成,存在为1,否则为0。

冗余码

异或:1 ^ 1 = 01 ^ 0 = 10 ^ 0 = 0

数据链路层提供了三种基本服务。

根据链路的可靠性以及效率来划分。

  1. 无确认无连接服务
  2. 有确认无连接服务
  3. 有确认有连接服务

相比来说,无连接的比起有连接的效率更高,有确认的比无确认的可靠性更高。

通过差错校验之后,假设数据帧已经没有问题了,但如果由于网络问题,导致丢包了,那么这条链路也就算是不可靠的了。

无确认无连接服务,只管往哪个目的地传送数据帧即可,哪怕丢失了也不做处理。

有确认无连接服务,在无确认无连接服务的基础上,要求接收方在收到数据帧之后做确认处理,如果超时后没有收到则会重发。

有确认有连接服务,在有确认无连接服务的基础上,将接收方和发送方之间建立一个连接,并且给每一个发送的帧加上编号,并且需要接收方接收到帧后做确认处理,比起有确认无连接服务,可以防止一个帧被多次重复发送,接收方多次重复接收。

在不可靠的链路上,通过各种协议,来最终实现可靠传输。

CRC只能保证传输的帧的数据是完整的,无法保证传输的帧一定被接收。

为了实现可靠传输,产生了 停止等待协议退回N步协议选择重传协议

停止等待协议

发送方一次只能发送一帧,发送的同时启动计时器,然后等待接收方的确认信息。

如果时间超过了两倍来回时间,则重新发送当前帧,并重新启动计时器。

如果确认分组丢失了,或者接收到的帧的编号不是接收方期望接收到的编号或者超时了,则会要求发送方重新发送要求发送的帧。

退回N步协议

由于停止等待协议这种方式效率较低,为了改进以便提高信道的传输效率,接收方允许发送方一次发送多个帧,将帧存入FIFO buffer中,然后再逐步ack,从中删除正确的帧。但是,如果中间某一帧丢失了,那么就需要从丢失的帧号开始全部重传

arq

另外,由于发送方和接收方的处理能力不一样,需要基于 滑动窗口 来控制发送的速率和帧数。

选择重传协议

由于退回N步协议,每次都需要从丢失的帧号开始 全部重传,对于已经被ack的分组也会被重传,这种方式也是不利于提高信道的传输效率的,那么就通过选择重传协议,只将发送错误的分组重传即可。
arq

数据链路层的信道分为:点对点信道、广播信道。

dll-road

点对点信道采用的主要是 PPP协议,一种点对点的协议。

家庭中的宽带拨号的时候,通常会是PPPoE

ppp

PPP的链路包含6个步骤。

用户通过宽带PPPoE拨号,与ISP建立连接,由下层物理层来负责链路的建立,当链路建立成功后,双方发送LCP包来确认链路的一些信息(最大帧长、鉴权协议)以及是否可以在当前链路传输,之后再进行鉴权(身份识别、是否欠费)操作,成功的话,则开始进行网络层控制协议(NCP)配置的协商(分配IP、网络层协议),协商成功后则正式打开链路,进行数据的传输,数据传输完成后就进入了链路终止状态。

ppp

广播信道主要采用的是以太网通信标准,常用于局域网。

所谓的一台计算机发送的信号会被局域网内的所有计算机都收到。

broadcast

以太网协议,早期各企业自定分组方式,后形成的标准。

上文提到了,数据链路层通过通信协议为电信号提供分组方式。

Ethernet 规定,一组电信号组成一个数据包,称为

每一个数据帧由头 head 和数据 data 组成。

  • head 固定18个字节,包含:发送者/源地址接收者/目标地址数据类型,各占6字节。

  • data 最短46字节,最长1500字节,是数据包的具体内容,超过MTU的话则需要分片传输。

以太网就是局域网,局域网不一定是以太网。

在以太网中,发送者/源地址接收者/目标地址是由 mac地址来确定的,这个地址在网卡上标识着,全球唯一的。

因此,发送者、接收者的地址,说的就是 网卡的地址

mac地址由48位二进制组成,12位16进制组成,前6位是厂商编号,后6位是流水号。

mac地址

找了个网址查了一下,点击查询

mac地址

有了mac地址之后,同一个网络中的计算机就可以通过mac地址找到对方,并进行通信了。

理论上,全世界的计算机之间都可以通过mac地址和对方相互通信。

只需要在数据帧的 head 部分写入自己的mac地址和对方的mac地址,然后给同一网络中的所有计算机发送信息,对比接收者是否自身,以此方式完成通信。这种方式,也称之为 广播

通常,在通信的时候,只知道对方的IP地址,而不知道物理地址。

ARP协议就被设计来通过IP地址查询对方MAC地址。

一台计算机通过ARP协议可以获取另一台计算机的mac地址。

在TCP/IP模型中,ARP协议属于网络层协议。

在OSI模型中,ARP协议属于数据链路层协议。

arp帧

抓包信息如下:

arp

通过ARP协议,发送以太网帧,去询问同一网络上的所有计算机,IP是目标计算机的话,那就回复MAC地址,否则丢弃,默认请求数据下为 00:00:00:00:00:00。查询到目标IP对应的MAC地址之后就缓存到自己的内存中。

ARP分为两种类型:静态和动态。

通过 arp -a 命令可以查看到已缓存、配置的IP和MAC地址映射表,且可以知道动静类型。

ARP地址解析协议的工作流程如下:

arp