目录
数据链路层(Data Link Layer)介于物理层和网络层之间,主要负责在相邻网络节点间实现可靠的数据传输。数据链路层传输的数据叫做数据帧。
1. 以太网
1.1 以太网的简单介绍
以太网(Ethernet)是目前应用最广泛的局域网(LAN)技术,基于 IEEE 802.3 标准体系,以帧(Frame)为基本传输单元,通过物理层和数据链路层实现设备互联。
以太网的核心工作是实现局域网内设备的高速、可靠数据传输,支持多设备共享或专用信道。
与以太网技术并列的还有其他网络技术,比如令牌环网和无线 LAN 等。
1.2 以太网帧格式
(1)源地址和目的地址:指的是源主机网卡 MAC 地址和目的主机的网卡 MAC 地址,长度为 6 字节,48 位,在网卡出厂时就固化了。
(2)类型:帧协议类型字段有三种值,分别对应 IP(0800)、ARP(0806)、RARP(8035),表示该数据帧封装的是哪种协议,长度为 2 字节,16位。
(3)帧末尾:CRC 校验码,4字节,32 位。
其中 MAC 地址的介绍以及对 MAC 地址和 IP 地址的理解参考Linux网络基础。
2. 认识 MTU
MTU(Maximum Transmission Unit,最大传输单元),指的是网络中数据链路层(如以太网、PPP 等)允许传输的最大数据包大小(单位为字节)。
以太网帧中的数据长度规定最小 46 字节,最大 1500 字节,ARP 数据包的长度不够 46 字节,要在后面补填充位。
1500 称为以太网的最大传输单元(MTU),不同的网络类型有不同的 MTU。
如果一个数据包从以太网路由器到拨号链路上,数据包长度大于拨号链路的 MTU,则需要对数据包进行分片。
不同的数据链路层标准的 MTU 是不同的。
如上图所示,发送主机和路由器之间使用的是 FDDI(Fiber Distributed Data Interface,光纤分布式数据接口),是一种基于光纤的高速局域网技术。FDDI 帧长度可变,其 MTU 最大约为 4500 字节。
当发送主机将一个大小为 4352 的数据包封装成 FDDI 数据帧发送给路由器,路由器收到后进行解包,得到 4352 的 IP 数据报,但是因为与接收主机相连的是以太网,所以路由器对其进行分片,然后依次封装成以太网数据帧发送给接收主机,接收主机接收到数据之后,进行解包,根据 IP 首部的 16 位标识、3 位标志以及 13 位片偏移重新组装成一个 IP 数据报,然后传输给上层。
2.1 MTU 对 UDP 协议的影响
以以太网的 MTU 为例,一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部)- 8(UDP 首部)),那么就会在网络层分成多个 IP 数据报。这里的多个 IP 数据报有任意一个丢失,都会引起接收端网络层重组失败,这就意味着如果 UDP 数据报在网络层被分片,整个数据丢失的概率就大大增加了。
2.2 MTU 对 TCP 协议的影响
以以太网的 MTU 为例,TCP 的一个数据段也不能无线大,还是受限于 MTU。TCP 的单个数据段的最大有效载荷称为 MSS(Max Segment Size)。
TCP 在建立连接的过程中,通信双方会进行 MSS 协商。最理想的情况下,MSS 的值正好是在 IP 数据报不会被分片处理的最大长度 1460(1500 - 20(IP 首部)- 20(TCP 首部))。
双方在发送 SYN 的时候就会在TCP 首部写入自己能支持的 MSS 值,然后选择较小的作为最终的 MSS。MSS 的值就是在 TCP 首部的 40字节边长选项中。
从这里就可以看出来为什么在 TCP 数据段进行发送的时候,不一次性将窗口大小的内容发送出去,而是在传输层将其分成一段一段进行发送,目的就是为了减少网络层 IP 数据报的分片。
因为分片有以下缺点:
(1)传输开销增加:每个分片均包含 IP 首部(20 字节),若原 IP 数据报,分为 5 片,则会增加 4 个 IP 首部,增加了 80 字节的开销。
(2)重组延迟或失败:接收方需缓存所有分片并等待重组,若分片到达顺序混乱或部分丢失,会导致重组延迟或失败。
(3)丢包风险增大与重传效率低下:若一个 IP 数据报传输成功的概率为 99%,则将其分为 10 个分片,传输成功的概率就会变成 99% 的 10 次方,导致丢包风险增大。如果 10 个分片中丢失 1 个,则需要重传整个数据报,即全部 10 个分片,重传效率远低于未分片的效率。
如上图所示,为 TCP 中 MSS 与 MTU 的关系。
3. ARP 协议
ARP(Address Resolution Protocol,地址解析协议) 不是一个单纯的数据链路层的协议(如以太网数据帧协议),而是一个介于数据链路层和网络层之间的协议。
3.1 ARP 数据报格式
(1)硬件类型:指明 ARP 报文在何种网络上传输,值为 1 表示以太网。大小为 2 字节。
(2)协议类型:表明硬件地址(MAC)要映射的上层协议地址类型,若映射 IP 地址,其值位 0x0800。大小为 2 字节。
(3)硬件地址长度:标识 MAC 地址的长度,通常为 6。大小为 1 字节。
(4)协议地址长度:标识 IP 地址的长度,通常为 4。大小为 1 字节。
(5)操作类型:只当 ARP 报文类型,值为 1 表示 ARP 请求,值为 2 表示 ARP 应答,值为 3 表示 RARP 请求,值为 4 表示 RARP 应答。大小为 2 字节。
(6)源 MAC 地址:发送设备的硬件地址。大小为 6 字节。
(7)源 IP 地址:发送设备的 IP 地址。大小为 4 字节。
(8)目的 MAC 地址:接收方设备的硬件地址,在 ARP 请求报文中,该字段全为 0,表示尚未知晓目标 MAC 地址;在 ARP 应答报文中,该字段为目标主机的真实 MAC 地址。大小为 6 字节。
(9)目的 IP 地址:接收设备的 IP 地址。大小为 4 字节。
3.2 ARP 协议的作用
ARP 是网络层与数据链路层之间的桥梁协议,其核心功能是将 IP 地址解析为 MAC 地址,实现跨层地址映射,作用于以太网等广播型网络。
在网络通信时,源主机的应用程序直到目的主机的 IP 地址和端口号,但是不知道目的主机的 MAC 地址。
数据帧首先是被网卡接收到再去处理上层协议的,如果接收到的数据帧中的目的 MAC 地址与接收主机的 MAC 地址不符合,则直接丢弃。
因此在通讯前必须获取目的主机的 MAC 地址,而 ARP 的作用就是在通讯前获取目的主机的 MAC 地址。
3.3 ARP 的工作流程
当主机 A 要和主机 B 进行通信的时候,会在开始通信之前进行一下步骤。
(1)主机 A 发出 ARP 请求,用于询问 IP 地址为 172.20.1.2 的主机的 MAC 地址为多少。将 ARP 数据报封装成数据帧,此时并不知道目标主机的 MAC 地址,所以以太网帧首部的目的地址填 FF:FF:FF:FF:FF:FF,表示广播,即为向局域网中的所有主机发送该数据帧。
主机 A 发送的以太网数据帧的内容为下,表示以广播的形式发送一个 ARP(0806)数据报。
(2)局域网中其他主机收到该数据帧时,解包提取 ARP 请求报文,发现数据报中的目的 IP 地址与本机不相符,则丢弃报文。当主机 B 解包提取 ARP 请求报文,发现数据报中的目的 IP 与 本机的 IP 相符合,则构建一个 ARP 应答数据报,其中,将自己的 MAC 地址填入源 MAC 地址处,封装成数据帧的时候,目的地址填入主机 A 的 MAC 地址,表示该数据帧发送给主机 A。
主机 B 发送的以太网数据帧的内容如下,表示发送给主机 A 一个 ARP 数据报。
(3)主机 A 收到应答之后,将其中源 MAC 地址(主机 B 的 MAC 地址)提取出来,然后填入 ARP 缓存表中,则下次再给目标 IP 地址为 172.20.1.2(主机 B)发送数据帧的时候,目的地址填主机 B 的 MAC 地址。
每台主机都维护一个 ARP 缓存表,用于缓存 IP 地址和 MAC 地址的映射关系,可以使用 arp -a 命令查看。缓存表中的表项有过期时间,一般为 20 分钟。