数据链路层

发布于:2025-08-10 ⋅ 阅读:(15) ⋅ 点赞:(0)


数据链路层用于两个设备(同一种数据链路节点)之间进行传递,与网络层相比网络层负责报文在网络中如何进行路由,当我们的报文经过网络层路由到达目标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报文的分片与组装

  1. 如何分片
  • IP层发现传输层向下交付的报文大小超过 (MTU - 20)字节 就会进行分片(MTU值由网络类型决定,如以太网为1500)。
  • 将传输层交付的整个报文作为IP层有效载荷,切割为多个数据段(每个数据段不含传输层报头副本,仅第一个分片包含传输层报头,后续分片只携带原始数据片段。)。
  • 为每个数据段封装独立的IP层报头:
    • 16位标识 (Identification):所有分片复制原始报文的相同标识值。
    • 3位标志字段:
      • 第一位:保留位(恒为0)。
      • 第二位 (DF):0 = 允许分片,1 = 禁止分片(若需分片则丢弃并返回错误)。
      • 第三位 (MF):0 = 最后一个分片;1 = 后续还有分片(非末尾分片)。
  • 13位片偏移:当前分片在原始报文中的偏移量(字节) ÷ 8(单位:8字节块)。
  • 总长度字段:设置为当前分片的总长度(IP头+数据段长度)。
  1. 如何组装
    1. 总长度字段:设置为当前分片的总长度(IP头+数据段长度)。
    • 若满足任一条件即为分片:
      • MF(三位标志位最后一位) = 1(还有后续分片)
      • 片偏移 > 0(非首片)
    • ✅ 未分片报文特征:MF=0 且 片偏移=0。
    1. 分组与排序:
    • 通过 16位标识 将同一报文的分片归组。
    • 按 13位片偏移值升序排序(值越小越靠前)。
    1. 检测完整性:
    • 首片丢失:无片偏移=0的分片 → 重组失败。
    • 末片丢失:最后一个分片的 MF ≠ 0 → 重组失败。
    • 中间分片丢失:计算当前分片结束位置 (片偏移×8 + 当前分片数据长度) ≠ 下一分片起始位置 (下一片偏移×8) → 重组失败。
    1. 重组数据:
    • 按序拼接所有分片的数据部分(不含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的工作流程

  1. 场景:主机A(192.168.1.2)想访问主机B(192.168.1.100)。
  2. 问题:主机A知道B的IP,但不知道B的MAC地址。
  3. ARP请求:
    • 主机A广播一个ARP请求:“谁有IP 192.168.1.100?请告诉MAC地址!”
    • 局域网内设备处理流程:
      1.物理层:所有主机均接收广播电信号并转换为数据帧。
      2. 数据链路层:
      • 帧接收: 所有主机检查目的MAC地址:FF:FF:FF:FF:FF:FF(广播地址)→ 接收该帧
      • 协议解析: 根据帧头类型字段=0x0806识别为ARP协议 → 将帧载荷交给ARP模块处理
      1. ARP模块处理(数据链路层子层):
        • 所有主机解析ARP请求包,检查目标IP地址:
        • 匹配自身IP(如主机B)→ 生成ARP响应
        • 不匹配自身IP(如主机C)→ 丢弃请求包(但缓存主机A的IP-MAC映射)
  4. ARP响应:
    • 主机B单播回复:“IP 192.168.1.100 的MAC地址是 22:33:44:55:66:77”。
    • 仅目标主机(主机B)通过数据链路层单播回复ARP响应帧。
  5. 结果:
    • 主机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 缓存管理命令

  1. 清除单个 ARP 条目
sudo ip neigh del 192.168.1.100 dev eth0
  1. 清空整个 ARP 缓存
sudo ip neigh flush all
  1. 添加静态 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 缓存的工作原理
动态学习:

  1. 当主机 A 需要与主机 B(IP 已知)通信时:

    • 先查 ARP 缓存,若无 B 的条目 → 广播 ARP 请求

    • 主机 B 响应后,A 将 B 的 IP-MAC 映射加入缓存

  2. 缓存时效:

    • 动态条目默认 15-20 分钟 过期(可配置)

    • 过期前若再次使用,会刷新有效期

  3. 主动维护:

    • 系统定期验证陈旧条目(发送 ARP 请求确认)

    • 若主机无响应,标记为 FAILED 并最终删除

查看 ARP 缓存超时时间(Linux)

# 查看当前 ARP 缓存设置
sysctl -a | grep net.ipv4.neigh

# 关键参数:
#   base_reachable_time_ms:基础有效期(默认 30,000 毫秒)
#   gc_stale_time:过期回收时间(默认 60 秒)

网站公告

今日签到

点亮在社区的每一天
去签到