数据链路层(Data Link Layer)是 TCP/IP 五层模型的第 2 层(对应 OSI 七层模型的第 2 层),介于物理层和网络层之间,核心作用是 将物理层的原始信号封装成可传输的 "帧",并解决相邻节点间的可靠通信问题
也就是说数据链路层解决同一个子网里的通信。
以太网
以太网既是一种网络技术标准,也是数据链路层的核心协议,更准确地说,我们常说的以太网协议(IEEE 802.3) 是数据链路层 + 物理层的复合标准,其中数据链路层的定义是其核心。
我们来看看以太网帧的格式:

这里目的地址和源地址就是MAC地址。
类型是用来分清上层协议的。
CRC 是 "循环冗余校验码"(Cyclic Redundancy Check),也是用来检验数据正确性的。
也就是说以太网帧通过固定的报头长度来实现报头和有效载荷分离;
通过类型来实现分用。
以太网帧最常见的上层协议就是IPv4,类型会填0800:

除此之外,还有ARP和RARP等上层协议:

这里PAD是填充字段:
以太网帧的数据字段长度要求是 46~1500 字节(太短会导致传输效率低),而 ARP 请求 / 应答本身只有 28 字节,所以需要加PAD(填充字段)补到 46 字节,保证帧结构合法。
以太网帧的有效载荷(数据字段)设置 46 字节的最小限制,核心是为了适配早期以太网的 CSMA/CD(载波监听多路访问 / 冲突检测)机制,保证冲突能被正确检测,同时兼顾传输效率。
除此之外,上层协议如果是ipv6,类型就是86DD。
MAC地址
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48位,及6个字节.一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
- 在网卡出厂时就确定了,不能修改.mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些网卡支持用户配置mac地址)
MTU
注意到我们以太网帧的有效载荷大小上限是1500,其实这就是MTU。
MTU(Maximum Transmission Unit,最大传输单元)指网络通信中单次数据传输允许的最大数据包大小,单位为字节(Byte)。不同网络协议或物理介质对 MTU 的限制不同,例如以太网的默认 MTU 为 1500 字节。
我们在IP部分就已经谈过MTU对上层协议的影响。有了MTU的限制,IP不得不对报文大小超过MTU的报文进行分片。这会导致报文丢失的概率增加。因此为了避免分片TCP又有着MSS的规定:
MSS(Maximum Segment Size)指TCP协议中单次传输数据的最大分段大小,用于避免IP层分片。通常在TCP三次握手阶段协商,默认值为1460字节(基于以太网MTU 1500字节减去IP和TCP头部40字节)。
一次发送的报文大小不超过MSS就能避免报文在下层分片。
MTU对上层如此不便为什么要这么规定呢?
其实回顾我们刚进入网络世界:

那时候提到了,同一个局域网里通信时。
不同主机发送报文会互相影响,发生碰撞。碰撞之后就要休眠一段时间再发送。因此碰撞会影响发送报文的效率。
报文越大,发送的时间越长,越容易发生碰撞。因此规定一个发送帧的上限大小,本质也是为了减少发生碰撞的概率,这样反而能提高效率。
输入ifconfig指令能查看本主机的MTU大小:

交换机
我们以前常说网络通信里会用到交换机和路由,事实上我们一直分不清这两者的区别,现在来明确一下。
首先我要介绍一下碰撞域的概念:
碰撞域(Collision Domain)是指在网络通信中,所有可能发生数据帧冲突(碰撞)的设备集合。当多个设备同时发送数据时,若共享同一传输介质(如以太网总线或集线器连接的设备),数据帧会相互干扰,导致碰撞。碰撞域的范围决定了网络性能,因为碰撞会降低有效带宽。
我一开始说一个以太网是一个碰撞域,这在以前是正确的,现在随着交换机的发展就不太准确了。
因为我们的交换机会分割碰撞域。
首先我们在一个以太网中接入一个交换机,交换机有两个端口,连接不同的主机:

一开始交换机不清楚当前局域网情况,当A向C发送报文时:

这时候交换机也不知道C在哪,因此当交换机收到A的报文时,也会将报文交给右边的区域。这时候以太网还是在同一个碰撞域。
但是交换机可以很确定,主机A一定在左边。
工作一段时间后,交换机就能摸清当前局域网的主机分布情况:


这时候A向B发送报文,交换机就会知道A、B都在左边,因此不会将报文交给右边。这时候不会影响右边D向E通信。
所以交换机就将以太网分成了两个碰撞域。
所以,交换机作用在同一个子网通信。路由器则是连接不同的子网。
ARP
虽然我们在这里介绍ARP协议,但是需要强调,ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议。
还记得我们写的套接字编程吗。里面写的从来没有目的MAC地址。那么我们怎么知道对方MAC地址呢?
这里就到了ARP协议登场了:
ARP协议建立了主机IP地址和MAC地址的映射关系
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;
- 因此在通讯前必须获得目的主机的硬件地址
ARP协议的工作流程

-
源主机发出ARP请求,询问"IP地址是192.168.0.1的主机的硬件地址是多少",并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播);
这就是IP部分提到的广播地址:

-
目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中;
-
每台主机都维护一个ARP缓存表,可以用arp-a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址

如此我们才能知道对方的MAC地址,然后再继续IP报文发送。
我们再来看看ARP的报文格式:

下边就是ARP报文格式:
- 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
- 硬件类型指链路层网络类型,1为以太网
- 协议类型指要转换的地址类型,0x0800为IP地址
- 硬件地址长度对于以太网地址为6字节
- 协议地址长度对于和IP地址为4字节
- op字段为1表示ARP请求,op字段为2表示ARP应答
很显然,当同一个局域网里所有主机收到ARP报文都会进行处理。收到IP报文则不一定会处理。
RARP概述
RARP(Reverse Address Resolution Protocol,反向地址解析协议)是一种网络协议,用于通过已知的物理地址(MAC地址)获取对应的IP地址。它是ARP(Address Resolution Protocol)的逆向过程,主要用于无盘工作站或设备启动时获取IP配置。
这个过程比ARP还要简单就不赘述了。