数据链路层
数据链路层用于两个设备(同一种数据链路节点)之间进行传递,与网络层相比网络层负责报文在网络中如何进行路由,当我们的报文经过网络层路由到达目标IP所在的局域网路由器,如何把报文在局域网中把报文交给我们的目标主机,就是我们数据链路层解决的问题。我们知道局域网通信类型有多种如:以太网、无线LAN、令牌环网。下文我们讲解以以太网为例子。
以太网
- “以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物
理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等; - 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
- 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
MAC地址
- MAC地址用来识别数据链路层中相连的节点;
- 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
- 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地
址, 可能会冲突; 也有些网卡支持用户配置mac地址).
IP地址和MAC地址
- 特性:MAC地址 (物理地址) IP地址 (逻辑地址)
- 工作层级:MAC在数据链路层,IP是网络层
- 作用范围:MAC同一物理网络内(广播域),IP跨网络全局寻址(互联网)
- 唯一性:全球唯一(由制造商烧录,但是虚拟机的mac地址可以进行配置),IP地址网络内唯一(可动态分配)
- 长度:MAC地址48位十六进制(如 00:1A:C2:7B:00:47);IP地址 IPv4:32位十进制(如 192.168.1.100) IPv6:128位十六进制
- 寻址目标:MAC下一跳设备(如路由器、交换机、主机);IP最终目标主机(跨网络)。
- 总结:IP地址用于找到目标主机所在的网络,MAC地址用于在该网络内找到具体设备。你可以把IP地址理解为一个长期目标,而我们的mac地址就是为了完成长期目标,不断变化的短期目标。就像你要去云南,你可以中转类似与这样。
以太网帧格式
目的MAC
目的MAC是接收方设备的物理地址(目标设备的MAC地址),用于在局域网内精准定位数据帧的接收者。
源MAC
就是发送设备网卡的MAC地址,这样接收方也知道了发送方的MAC地址方便后续通信。
类型
帧协议类型字段有三种值,分别对应IP、ARP、RARP;
- 常见值:0x0800 → IPv4、0x0806 → ARP、0x8035 → RARP(基本淘汰)
- 作用:告诉接收方“数据字段里装的是什么协议的数据”。
数据
就是上层网络层进行封包后,交付的IP报文。
MTU
MTU 是英文 Maximum Transmission Unit 的缩写,即最大传输单元,它的单位是字节,指的是数据链路层的最大payload,由硬件网卡设置MTU,是一个硬性限制。
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
- 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation),在网络层进行;
- 不同的数据链路层标准的MTU是不同的;
MTU对IP协议的影响
- 将较大的IP包分成多个小包, 并给每个小包打上标签;
- 每个小包IP协议头的 16位标识(id) 都是相同的;
- 每个小包的IP协议头的3位标志字段中, 第2位置为0, 表示允许分片, 第3位来表示结束标记(当前是否是最后一个小包, 是的话置为1, 否则置为0);
- 到达对端时再将这些小包, 会按顺序重组, 拼装到一起返回给传输层;
- 一旦这些小包中任意一个小包丢失, 接收端的重组就会失败. 但是IP层不会负责重新传输数据,这是传输层的工作。
IP报文的分片与组装
- 如何分片
- IP层发现传输层向下交付的报文大小超过 (MTU - 20)字节 就会进行分片(MTU值由网络类型决定,如以太网为1500)。
- 将传输层交付的整个报文作为IP层有效载荷,切割为多个数据段(每个数据段不含传输层报头副本,仅第一个分片包含传输层报头,后续分片只携带原始数据片段。)。
- 为每个数据段封装独立的IP层报头:
- 16位标识 (Identification):所有分片复制原始报文的相同标识值。
- 3位标志字段:
- 第一位:保留位(恒为0)。
- 第二位 (DF):0 = 允许分片,1 = 禁止分片(若需分片则丢弃并返回错误)。
- 第三位 (MF):0 = 最后一个分片;1 = 后续还有分片(非末尾分片)。
- 13位片偏移:当前分片在原始报文中的偏移量(字节) ÷ 8(单位:8字节块)。
- 总长度字段:设置为当前分片的总长度(IP头+数据段长度)。
- 如何组装
- 总长度字段:设置为当前分片的总长度(IP头+数据段长度)。
- 若满足任一条件即为分片:
- MF(三位标志位最后一位) = 1(还有后续分片)
- 片偏移 > 0(非首片)
- ✅ 未分片报文特征:MF=0 且 片偏移=0。
- 分组与排序:
- 通过 16位标识 将同一报文的分片归组。
- 按 13位片偏移值升序排序(值越小越靠前)。
- 检测完整性:
- 首片丢失:无片偏移=0的分片 → 重组失败。
- 末片丢失:最后一个分片的 MF ≠ 0 → 重组失败。
- 中间分片丢失:计算当前分片结束位置 (片偏移×8 + 当前分片数据长度) ≠ 下一分片起始位置 (下一片偏移×8) → 重组失败。
- 重组数据:
- 按序拼接所有分片的数据部分(不含IP头)。
- 将完整数据交给传输层。
MTU对UDP协议的影响
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.
- 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了.
MTU对于TCP协议的影响
- TCP的一个数据报也不能无限大, 还是受制于MTU. TCP的单个数据报的最大消息长度, 称为MSS(Max Segment Size);
- TCP在建立连接的过程中, 通信双方会进行MSS协商.
- 最理想的情况下, MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU).分片会导致丢包概论变大
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值.
- 然后双方得知对方的MSS值之后, 选择较小的作为最终MSS.
- MSS的值就是在TCP首部的40字节变长选项中(kind=2);
MSS和MTU关系
为什么要限制发送帧大小
因为我们的局域网是一个碰撞域,如果我们进行每次发送的帧大小比较大时间比较长,就会加大碰撞概率;如果我们发送帧比较小,就比如一个IP报文我们分为好几个来发,虽然发送时间短,但是发送次数多啊,也会导致碰撞概率大。
查看硬件地址和MTU
ifconfig
ARP协议
虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议;如下图:
ARP协议的作用
当我们的网络层交付给下层的时候我们只知道目的IP却不知道我们接受主机的MAC地址,ARP协议就是解决这个问题的。ARP协议建立了主机 IP地址 和 MAC地址 的映射关系。
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则
直接丢弃; - 因此在通讯前必须获得目的主机的硬件地址;
ARP的工作流程
- 场景:主机A(192.168.1.2)想访问主机B(192.168.1.100)。
- 问题:主机A知道B的IP,但不知道B的MAC地址。
- ARP请求:
- 主机A广播一个ARP请求:“谁有IP 192.168.1.100?请告诉MAC地址!”
- 局域网内设备处理流程:
1.物理层:所有主机均接收广播电信号并转换为数据帧。
2. 数据链路层:- 帧接收: 所有主机检查目的MAC地址:FF:FF:FF:FF:FF:FF(广播地址)→ 接收该帧
- 协议解析: 根据帧头类型字段=0x0806识别为ARP协议 → 将帧载荷交给ARP模块处理
- ARP模块处理(数据链路层子层):
- 所有主机解析ARP请求包,检查目标IP地址:
- 匹配自身IP(如主机B)→ 生成ARP响应
- 不匹配自身IP(如主机C)→ 丢弃请求包(但缓存主机A的IP-MAC映射)
- ARP响应:
- 主机B单播回复:“IP 192.168.1.100 的MAC地址是 22:33:44:55:66:77”。
- 仅目标主机(主机B)通过数据链路层单播回复ARP响应帧。
- 结果:
- 主机A将B的IP-MAC映射存入ARP缓存表。
- 后续通信直接封装目标MAC地址发送数据帧。
ARP协议格式
2字节硬件类型
- 硬件类型指链路层网络类型,1为以太网
- 其他值:6=IEEE 802网络,15=帧中继
2字节协议类型
- 协议类型指要转换的地址类型,IPv4固定为0x0800
- 其他值:0x0806=ARP,0x8035=RARP
1字节硬件地址长度
- MAC地址长度固定为6(如00:1A:C2:7B:00:47)
1字节协议地址长度
- IPv4地址长度固定为4(如192.168.1.100)
2字节操作码(op)
- op字段为1表示ARP请求,op字段为2表示ARP应答。
- op字段位3表示RARP请求,4为RARP响应。
6字节发送端以太网地址
- 就是发送方的MAC地址
4字节发送端IP地址
- 就是发送方的IP地址
6字节目的以太网地址
- 对于发送方请求时该值为0
- 当接收方发送ARP响应时,该值就是接收方的MAC地址
4字节目的IP地址
- 就是接收方的IP地址
工作流程示例
ARP请求封装(主机A → 广播):
字段 | 值 |
---|---|
硬件类型 | 0x0001 (以太网) |
协议类型 | 0x0800 (IPv4) |
硬件地址长度 | 0x06 |
协议地址长度 | 0x04 |
操作码 | 0x0001 (请求) |
发送端MAC | AA:BB:CC:DD:EE:FF (主机A) |
发送端IP | 192.168.1.2 |
目的MAC | 00:00:00:00:00:00 (全0) |
目的IP | 192.168.1.100 |
ARP响应封装(主机B → 主机A):
字段 | 值 |
---|---|
硬件类型 | 0x0001 |
协议类型 | 0x0800 |
硬件地址长度 | 0x06 |
协议地址长度 | 0x04 |
操作码 | 0x0002 (响应) |
发送端MAC | 11:22:33:44:55:66 (主机B) |
发送端IP | 192.168.1.100 |
目的MAC | AA:BB:CC:DD:EE:FF (主机A) |
目的IP | 192.168.1.2 |
IP与MAC地址的映射
操作系统会维护一个 ARP 缓存表(ARP Cache),用于记录局域网内 IP 地址与 MAC 地址的映射关系。在 Linux 系统中,您可以通过以下方式查看和管理 ARP 缓存:
arp -n
- Address:目标 IP 地址
- HWaddress:对应的 MAC 地址
- Flags:C 表示动态学习条目(会过期),P 表示永久静态条目
- Iface:使用的网络接口
ARP 缓存管理命令
- 清除单个 ARP 条目
sudo ip neigh del 192.168.1.100 dev eth0
- 清空整个 ARP 缓存
sudo ip neigh flush all
- 添加静态 ARP 条目(绕过 ARP 请求)
sudo arp -s 192.168.1.200 aa:bb:cc:dd:ee:aa
# 或
sudo ip neigh add 192.168.1.200 lladdr aa:bb:cc:dd:ee:aa dev eth0 nud permanent
ARP 缓存的工作原理
动态学习:
当主机 A 需要与主机 B(IP 已知)通信时:
先查 ARP 缓存,若无 B 的条目 → 广播 ARP 请求
主机 B 响应后,A 将 B 的 IP-MAC 映射加入缓存
缓存时效:
动态条目默认 15-20 分钟 过期(可配置)
过期前若再次使用,会刷新有效期
主动维护:
系统定期验证陈旧条目(发送 ARP 请求确认)
若主机无响应,标记为 FAILED 并最终删除
查看 ARP 缓存超时时间(Linux)
# 查看当前 ARP 缓存设置
sysctl -a | grep net.ipv4.neigh
# 关键参数:
# base_reachable_time_ms:基础有效期(默认 30,000 毫秒)
# gc_stale_time:过期回收时间(默认 60 秒)