简单的说,数据链路层定义了电信号的分组方式。
数据链路层,连接了上层的 网络层
和下层的 物理层
。
数据链路层是对物理层功能的增强,将物理层连接转为逻辑上无差错的链路。
为上层网络层提供透明传输和可靠的数据传输服务。
单纯的电信号0和1是没有任何意义的,只有规定多少个为一组,每一组都是什么意思才有意义。
而这些分组要有意义,是由 通信协议
来控制的。
把实现这些 通信协议
的硬件和软件加到链路上,就形成了数据链路。
这样的硬件比如:网卡、交换机。
数据链路层需要解决三个问题:封装成帧、透明传输、差错校验。
主要关注的是:
- 怎么封装成帧
- 怎么去传输帧
- 帧传输目的地
- 校验帧完整性
在一段数据的前后增加首部、尾部,这就形成了一个帧。
帧,包含:帧头、数据部分、帧尾。
不同的数据链路层通信协议会对应着不同的帧。
帧头
由8位二进制数组成,代表的是网络层数据包的开始。
从应用层开始往下,每一层都会接收上层数据,并加入自己的头。
数据部分
大小至少46字节,最大1500字节,也就是最大传输单元MTU。
如果数据过大,将会产生分片。
帧尾
由8位二进制数组成,代表的是网络层数据包的结束,也包含了一些控制信息。
通过帧的首部和尾部包含的控制信息,来给帧定义一个边界。
帧,采用的是透明传输。
不论上层传输过来的内容是什么,数据链路层只会将上层的数据部分的内容往下传输,起到一个通道的作用,并且保证传输质量,不参与任何业务。
为了表示一个帧结束了,在帧尾添加了 特殊转义字符ESC
。当然,由于对上层数据采用透传的策略,可能因为数据中就包含了ESC
,导致帧提前结束
,因此遇到 多个ESC
的时候,将会删除其它,采用最后一个作为结束。
由于数据帧传输过程中可能发生错误,则需要差错校验。
因为在网络中传输的过程中,可能会有噪声等多方面因素,导致原本数据包中的bit产生比特差错,由1变成0,由0变成1,就需要进行差错校验。
数据链路层中采用的方式是:CRC循环冗余校验法
。
CRC校验,通过在数据为K位的数据后添加n位的冗余码组成帧。
发送端和接收端,共同协商出一个多项式
,作为除数
,将要发送的数据设定为固定大小的位数,作为被除数
,通过反复的异或取余
,最终得到一个冗余码
,通过比较二者冗余码 FCS
是否一致来确定帧的完整性
。
多项式由 x^n
是否存在,由高到低组成,存在为1,否则为0。
异或:1 ^ 1 = 0
、1 ^ 0 = 1
、0 ^ 0 = 0
。
数据链路层提供了三种基本服务。
根据链路的可靠性以及效率来划分。
- 无确认无连接服务
- 有确认无连接服务
- 有确认有连接服务
相比来说,无连接的比起有连接的效率更高,有确认的比无确认的可靠性更高。
通过差错校验
之后,假设数据帧已经没有问题了,但如果由于网络问题,导致丢包
了,那么这条链路也就算是不可靠
的了。
无确认无连接服务
,只管往哪个目的地传送数据帧即可,哪怕丢失了也不做处理。
有确认无连接服务
,在无确认无连接服务的基础上,要求接收方在收到数据帧之后做确认
处理,如果超时后没有收到则会重发。
有确认有连接服务
,在有确认无连接服务的基础上,将接收方和发送方之间建立一个连接
,并且给每一个发送的帧加上编号
,并且需要接收方接收到帧后做确认
处理,比起有确认无连接服务,可以防止一个帧被多次重复发送,接收方多次重复接收。
在不可靠的链路上,通过各种协议,来最终实现可靠传输。
CRC只能保证传输的帧的数据是完整的,无法保证传输的帧一定被接收。
为了实现可靠传输,产生了 停止等待协议
、退回N步协议
、选择重传协议
。
停止等待协议
发送方一次只能发送一帧,发送的同时启动计时器,然后等待接收方的确认信息。
如果时间超过了两倍来回时间,则重新发送当前帧,并重新启动计时器。
如果确认分组丢失了,或者接收到的帧的编号不是接收方期望接收到的编号或者超时了,则会要求发送方重新发送要求发送的帧。
退回N步协议
由于停止等待协议
这种方式效率较低,为了改进以便提高信道的传输效率,接收方允许发送方一次
发送多个帧
,将帧存入FIFO buffer
中,然后再逐步ack
,从中删除正确的帧。但是,如果中间某一帧丢失
了,那么就需要从丢失的帧号
开始全部重传
。
另外,由于发送方和接收方的处理能力不一样,需要基于 滑动窗口
来控制发送的速率和帧数。
选择重传协议
由于退回N步协议
,每次都需要从丢失的帧号
开始 全部重传
,对于已经被ack
的分组也会被重传
,这种方式也是不利于提高信道的传输效率的,那么就通过选择重传协议
,只将发送错误的分组
重传即可。
数据链路层的信道分为:点对点信道、广播信道。
点对点信道采用的主要是 PPP协议
,一种点对点的协议。
家庭中的宽带拨号的时候,通常会是PPPoE
。
PPP的链路包含6个步骤。
用户通过宽带PPPoE拨号,与ISP建立连接,由下层物理层来负责链路的建立,当链路建立成功后,双方发送LCP包来确认链路的一些信息(最大帧长、鉴权协议)以及是否可以在当前链路传输,之后再进行鉴权(身份识别、是否欠费)操作,成功的话,则开始进行网络层控制协议(NCP)配置的协商(分配IP、网络层协议),协商成功后则正式打开链路,进行数据的传输,数据传输完成后就进入了链路终止状态。
广播信道主要采用的是以太网通信标准,常用于局域网。
所谓的一台计算机发送的信号会被局域网内的所有计算机都收到。
以太网协议,早期各企业自定分组方式,后形成的标准。
上文提到了,数据链路层通过通信协议为电信号提供分组方式。
Ethernet
规定,一组电信号组成一个数据包,称为帧
。
每一个数据帧由头 head
和数据 data
组成。
head
固定18个字节,包含:发送者/源地址
、接收者/目标地址
、数据类型
,各占6字节。data
最短46字节,最长1500字节,是数据包的具体内容,超过MTU的话则需要分片传输。
以太网就是局域网,局域网不一定是以太网。
在以太网中,发送者/源地址
、接收者/目标地址
是由 mac地址
来确定的,这个地址在网卡上标识着,全球唯一的。
因此,发送者、接收者的地址,说的就是 网卡的地址
。
mac地址
由48位二进制组成,12位16进制组成,前6位是厂商编号,后6位是流水号。
找了个网址查了一下,点击查询
有了mac地址之后,同一个网络中的计算机就可以通过mac地址找到对方,并进行通信了。
理论上,全世界的计算机之间都可以通过mac地址和对方相互通信。
只需要在数据帧的 head
部分写入自己的mac地址和对方的mac地址,然后给同一网络
中的所有
计算机发送信息,对比接收者是否自身,以此方式完成通信。这种方式,也称之为 广播
。
通常,在通信的时候,只知道对方的IP地址,而不知道物理地址。
ARP协议就被设计来通过IP地址查询对方MAC地址。
一台计算机通过ARP协议可以获取另一台计算机的mac地址。
在TCP/IP模型中,ARP协议属于网络层协议。
在OSI模型中,ARP协议属于数据链路层协议。
抓包信息如下:
通过ARP协议,发送以太网帧,去询问同一网络上的所有计算机,IP是目标计算机的话,那就回复MAC地址,否则丢弃,默认请求数据下为 00:00:00:00:00:00
。查询到目标IP对应的MAC地址之后就缓存到自己的内存中。
ARP分为两种类型:静态和动态。
通过 arp -a
命令可以查看到已缓存、配置的IP和MAC地址映射表,且可以知道动静类型。
ARP地址解析协议的工作流程如下: