目录
[2.3MAC 帧与MAC 地址](#2.3MAC 帧与MAC 地址)
[(5)MAC 地址与 IP 地址对比](#(5)MAC 地址与 IP 地址对比)
[2.4ARP 协议](#2.4ARP 协议)
1.IP分片
IP分片是网络层的专属功能 (数据链路层无法也不负责分片,只丢弃超MTU的包),其核心设计是在源端或路由器一次性分片、端到端重组 ,避免中间节点反复切割,从而减少开销并屏蔽异构链路**(如以太网→PPP→令牌环)**的MTU差异
(1)IP分片细节
- 三个字段的分工
| 字段 | 作用 |
|---|---|
| 16位标识 | 标识同一个原始IP包(同一批分片该值相同) |
| 3位标志 | 主要是MF位:1=后面还有分片,0=最后一个 |
| 13位片偏移 | 指示该分片的数据在原始包中的起始位置(单位:8字节) |
- 示例
假设一个原始IP数据包:数据部分长度为 4000 字节 ,需要通过一个 MTU(最大传输单元)为 1500 字节 的链路
参数:
- IP头:通常20字节(无选项)
- 每片最大数据量:1500 - 20 = 1480 字节(每个分片都有独立的ip报头)
- 片偏移单位:8字节。因此每片的数据长度必须是8的倍数(除最后一片)
| 分片编号 | 数据字节范围 | 数据长度 | 片偏移 (值) | 片偏移 (实际字节) | MF标志 |
|---|---|---|---|---|---|
| 第1片 | 0 ~ 1479 | 1480 | 0 | 0 | 1 (后面还有) |
| 第2片 | 1480 ~ 2959 | 1480 | 185 (1480/8) | 1480 | 1 (后面还有) |
| 第3片 | 2960 ~ 3999 | 1040 | 370 (2960/8) | 2960 | 0 (最后一片) |
重组步骤:
- 根据标识(0x1234)收集所有分片
- 按片偏移从小到大排序
- 检查数据是否连续 + 最后一片的MF == 0
- 拼接还原原始IP包
(2)分片丢失检测机制
- 重组超时定时器:接收端收到第一个分片(偏移=0)时,会启动一个定时器(通常30秒),如果在超时前没有收齐,就丢弃所有已收到的该标识符的分片
- 丢第一个分片:后续分片到达时,由于没有偏移=0的分片来初始化重组缓冲区,它们会被直接丢弃(或者缓存一小段时间等待,但最终超时),无法组装。
- 丢最后一个分片:收齐了所有非最后分片(MF=1),但永远等不到MF=0的分片,定时器超时后丢弃,永远无法收齐。
- 丢中间分片:比如收到片0和片2,但没收到片1。重组缓冲区会出现一个"空洞",定时器超时后丢弃所有,无法重组。
对于IPv4,丢失任意一个分片 = 丢失整个原始数据包 。接收端无法向发送端"我只缺第3片,请重传这一片"。它只能默默丢弃,等待发送端(如TCP的超时重传)重新发送整个原始数据包
(3)不建议分片
- 假设:一个1500字节的TCP数据包(含头),在传输中丢失一个IP分片的概率是 1%
- 如果分成2片:整个包丢失的概率 ≈ 2% (1 - 0.99^2)。丢包率翻倍
- 如果分成10片:整个包丢失的概率 ≈ 9.6%。丢包率放大近10倍
对于UDP :没有重传机制,分片丢失意味着应用层直接丢失了整个数据报
对于TCP :TCP的重传是按段 进行的,一个TCP段如果被分片,丢任一片就会导致TCP重传整个段,效率极低
(4)规避手段(MSS与路径MTU发现)
- MTU(最大传输单元 ):数据链路层限制,指单个数据帧有效载荷的最大总大小(包含整个IP包(IP头 + 传输层报文)),超了就得靠分片
- MSS(最大报文段大小 ):传输层限制,指单个TCP数据段中纯数据的最大字节数(不含IP头和TCP头),超了TCP自己会切,为的是避免分片
TCP MSS (最大段大小) 协商:
- TCP三次握手时,双方会通告自己的MSS,实际连接采用的MSS取两者最小值
- MSS 通常 = MTU - 40 (20字节TCP头 + 20字节IP头)如果IP或TCP头带选项,MSS相应变小
- 以太网MTU=1500,则MSS=1460。TCP发出的每个段都保证≤1460字节,封装成IP包后≤1500字节,永远不会被路由器分片。这是避免分片的最有效手段。
路径MTU发现 (PMTUD):
- 发送端设置IP包的DF=1 (Don't Fragment)
- 如果中间路由器发现包大于下一跳MTU,它无法转发,会丢弃该包,并返回一个ICMP报文:"需要分片但设置了DF位" (Type 3, Code 4),同时告诉发送端下一跳的MTU
- 发送端据此减小发送包的大小,并缓存这条路径的MTU
- 注意:很多网络会过滤ICMP,导致PMTUD失效,造成"黑洞连接"(能握手,但发大数据就卡死)
应用层规避(针对UDP):
- 因为纯UDP是无连接、重传等机制的,所以纯UDP不执行上述行为
- 在以太网环境下,安全的UDP数据净荷通常 ≤ 1472 字节 (1500 MTU - 20 IP头 - 8 UDP头)
- 如果需要传输更大的UDP数据,应用层应自行实现分块、确认和重传机制(如RPC、TFTP的做法)
2.数据链路层
(1)
| 知识点 | 核心说明 |
|---|---|
| 位置 | 网络层之下,与物理层交互,网卡驱动实现了数据链路层的主要功能 |
| 核心职责 | 解决直接相连的主机之间的数据帧传输 |
| 封装/解包 | 使用定长报头进行分离与组装 |
| 分用 | 通过帧中的类型字段决定交付给上层哪个协议(如 IP / ARP) |
| 典型协议 | 以太网(Ethernet) |
2.1以太网简介
以太网是目前最广泛使用的局域网技术
(1) MAC 帧

- MAC 帧格式:目的MAC + 源MAC + 类型 + 载荷 + FCS(CRC校验)
- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,在网卡出厂时固化
- 帧协议类型字段有三种值:0x0800:IP 报文;0x0806:ARP 报文;0x8035:RARP报文
- 帧末尾是CRC校验码
- RARP协议,通过MAC地址获取IP,应用场景少,更简单直接
- 固定报头可以有效分离,类型字段便于上层交付
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位
(2)以太网的关键机制
| 机制 | 作用 | 现状 |
|---|---|---|
| CSMA/CD | 碰撞检测与重发 | 交换式网络中不再需要 |
| MAC地址 | 唯一标识设备 | 仍为核心 |
| 广播 | 发送给所有设备 | 仍在ARP等场景使用 |
(3)一些易错点
| 问题 | 正确答案 |
|---|---|
| MAC 帧是否只在以太网存在? | 不是,但以太网是最典型的 |
| 交换机比集线器好在哪里? | 隔离冲突域,不碰撞 |
| CSMA/CD 现在还用吗? | 无线网还在用(CSMA/CA),有线网几乎不用 |
| 以太网 = 局域网吗? | 不完全,以太网是局域网的一种实现 |
2.2MAC 地址
MAC 地址用于在同一个局域网内唯一标识一台网络设备
(2)MAC 地址标准表示格式
| 格式 | 示例 | 说明 |
|---|---|---|
| 冒号分隔 | 08:00:27:AB:CD:EF |
Linux / 常见 |
| 连字符分隔 | 08-00-27-AB-CD-EF |
Windows |
| 点分四组 | 0800.27AB.CDEF |
Cisco / 某些设备 |
(3)MAC 地址的 48 位结构
| 位置 | 位宽 | 名称 | 含义 |
|---|---|---|---|
| 第 1 字节(最低位) | 1 bit | I/G 位(Individual/Group) | 0 = 单播,1 = 组播 |
| 第 1 字节(次低位) | 1 bit | U/L 位(Universal/Local) | 0 = 全球唯一,1 = 本地管理 |
| 其余 46 位 | 46 bit | 组织分配 | 由厂商或管理员分配 |
(4)MAC 地址类型
| 类型 | 说明 | 示例 | 判断方式 |
|---|---|---|---|
| 单播(Unicast) | 唯一设备,一对一通信 | 08:00:27:AB:CD:EF |
I/G 位 = 0 |
| 组播(Multicast) | 一组设备,一对多 | 01:00:5E:00:00:01 |
I/G 位 = 1 |
| 广播(Broadcast) | 所有设备 | FF:FF:FF:FF:FF:FF |
全 1 |
| 本地管理地址 | 手动修改,非全球唯一 | 02:00:00:00:00:01 |
U/L 位 = 1 |
| 全球唯一地址(OUI) | 厂商分配 | 08:00:27:AB:CD:EF |
U/L 位 = 0 |
(5)MAC 地址与 IP 地址对比
| 维度 | MAC 地址 | IP 地址 |
|---|---|---|
| 长度 | 48 位(6 字节) | 32 位(IPv4)/ 128 位(IPv6) |
| 表示 | 十六进制 | 点分十进制(IPv4) |
| 层次 | 数据链路层 | 网络层 |
| 作用范围 | 局域网 | 端到端 |
| 是否可变 | 通常固定(可手动改) | 可动态分配 |
| 全局唯一 | 理论上是,但可本地修改 | 公网 IP 唯一 |
| IP vs MAC | 下一站地址 | 最终地址 |
(6)特殊 MAC 地址
| 地址 | 用途 |
|---|---|
FF:FF:FF:FF:FF:FF |
广播 |
01:00:5E:00:00:00 ~ 01:00:5E:7F:FF:FF |
IPv4 组播范围 |
33:33:00:00:00:00 ~ 33:33:FF:FF:FF:FF |
IPv6 组播范围 |
00:00:00:00:00:00 |
无效 / 未指定 |
(7)查看 MAC 地址的命令
| 系统 | 命令 |
|---|---|
| Linux | ifconfig 或 ip addr |
| Windows | ipconfig /all |
| macOS | ifconfig 或 networksetup -listallhardwareports |
2.3局域网通信原理与碰撞处理
局域网通信的核心原理是:在同一广播域内,主机通过MAC地址 唯一标识自己,数据以MAC帧 形式在共享或交换介质中传输;发送方使用ARP协议 将目标IP解析为MAC地址,若目标在同一子网则直接通过交换机单播转发,否则通过默认网关 转发;早期共享介质(集线器)采用CSMA/CD 避免碰撞,现代交换网络则基于MAC地址表实现无碰撞、全双工转发,从而高效完成相邻节点间的数据交付
局域网 = 多台主机共享的临界资源,任意时刻只能一台发送
| 知识点 | 说明 |
|---|---|
| 通信特点 | 同一局域网中,所有主机都是"吃瓜群众",都能收到帧 |
| 核心问题 | 数据碰撞 |
| 碰撞原因 | 多台主机共享同一介质(早期总线 / 无线) |
| 避免算法 | CSMA/CD(先听后说、碰撞则停、随机重发) |
| 重发策略 | 碰撞后等待随机时间再重试 |
| 主机数影响 | 主机越多 → 碰撞概率越大 |
| 交换机 | 隔离碰撞域,但不隔离广播域 |
绕过数据链路层向局域网内发送大量垃圾报文,就会增大数据碰撞的概率,直接影响就是卡
2.4ARP 协议
(1)ARP 的作用与原理
| 知识点 | 说明 |
|---|---|
| 全称 | Address Resolution Protocol |
| 核心作用 | 已知目标 IP → 获取目标 MAC |
| 协议归属 | 属于数据链路层,在mac帧上层,所以封装在 MAC 帧中(类型 = 0x0806) |
| 请求 | 广播(目的MAC = FF:FF:FF:FF:FF:FF) |
| 应答 | 单播(直接回复请求方) |
| ARP 缓存 | arp -a 查看,避免频繁广播 |
| 缓存失效 | 重新发起 ARP 请求 |
获取MAC地址的邪修
通过本机IP与子网掩码计算出所在网段的网络号,遍历该网段所有可能的IP地址发送ping请求,从而触发ARP广播;活跃主机会响应ARP请求,本机将学习到的IP-MAC映射存入ARP缓存(可通过
arp -a查看),最终即可得到该局域网中所有活跃主机的IP地址及其对应的MAC地址。注意:若目标主机禁ping或不在同一广播域,则无法通过此方法发现
(2)ARP 报文格式
ARP 报文长度为 28 字节,封装在以太网 MAC 帧中(帧类型 = 0x0806)

| 字段 | 长度 | 值(以太网+IPv4) | 说明 |
|---|---|---|---|
| 硬件类型 | 2字节 | 0x0001 |
链路层协议类型,1=以太网 |
| 协议类型 | 2字节 | 0x0800 |
网络层协议类型,0x0800=IPv4 |
| 硬件地址长度 | 1字节 | 0x06 |
MAC地址长度(6字节) |
| 协议地址长度 | 1字节 | 0x04 |
IP地址长度(4字节) |
| 操作码 op | 2字节 | 1=请求,2=应答 |
3=RARP请求,4=RARP应答 |
| 发送端MAC | 6字节 | 发送方的MAC地址 | 请求/应答时都填 |
| 发送端IP | 4字节 | 发送方的IP地址 | 请求/应答时都填 |
| 目的端MAC | 6字节 | 接收方的MAC地址 | 请求时填 00:00:00:00:00:00 |
| 目的端IP | 4字节 | 接收方的IP地址 | 请求时填目标IP |
- 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的
(3)ARP 工作流程
-
查缓存 → 没有则广播请求 → 目标主机单播应答 → 更新缓存
-
请求方:构造 ARP 请求(op = 1),目的以太网地址 = FF:FF:FF:FF:FF:FF。封装成 MAC 帧,类型 = 0x0806,广播到局域网
-
接收方判断链路:,每个主机收到广播帧,检查帧类型 = 0x0806 → 交给 ARP 层,检查 op 和目的 IP,不是自己的 IP → 丢弃(ARP 层丢弃)
-
目标主机应答:构造 ARP 应答(op = 2),填充自己的 MAC 和 IP,单播回复请求方
-
请求方缓存:收到应答后,将 IP → MAC 存入 ARP 缓存
收到的任何arp报文都是先看op字段
(4)arp指令
arp 命令用于查看和修改本机的 ARP 缓存表
| 场景 | Windows | Linux |
|---|---|---|
| 查看所有 | arp -a |
arp -a 或 ip neigh |
| 查看单个 | arp -a IP |
`arp -a |
| 删除全部 | arp -d |
ip neigh flush all |
| 删除单个 | arp -d IP |
ip neigh del IP dev eth0 |
| 添加静态 | arp -s IP MAC |
ip neigh add ... permanent |
dfq@VM-0-16-ubuntu:~$ arp -a
_gateway (10.0.0.1) at fe:ee:7f:99:99:19 [ether] on eth0
| 字段 | 值 | 含义 |
|---|---|---|
| 主机名 | _gateway |
网关的 DNS 名称(自动解析) |
| IP 地址 | (10.0.0.1) |
网关的 IP 地址 |
| 分隔符 | at |
表示"对应的 MAC 地址是" |
| MAC 地址 | fe:ee:7f:99:99:19 |
网关的 MAC 地址 |
| 类型 | [ether] |
以太网(Ethernet) |
| 网络接口 | on eth0 |
通过网卡 eth0 学习到 |
(5)arp欺骗简介
HostA (192.168.1.2) HostM (192.168.1.100) Gateway (192.168.1.1)
| | |
|<--- 1. 伪造 ARP 应答 -------| |
| "网关 IP=192.168.1.1" | |
| "网关 MAC=MAC_M" | |
| | |
|--- 2. 上网数据包 --------->| |
| (目的MAC=MAC_M) | |
| |--- 3. 转发给真实网关 ------->|
| | (源IP仍是 HostA) |
| | |--- 4. 上网
|<--- 5. 返回数据 -----------| |
| (从网关收到后转发) |<-----------------------------|
关键点 :HostA 认为自己在和网关通信,实际在和 HostM 通信;HostM 再把数据转发给真正的网关。HostA 和网关都蒙在鼓里
攻击者 HostM 向源主机 HostA 发送大量伪造的 ARP 应答,声称"网关 IPR 对应的 MAC 地址是 MAC_M"。HostA 的 ARP 缓存被更新为 IPR → MAC_M。此后,HostA 发往网关的所有数据都会先到达 HostM。若同时欺骗网关,让网关也误以为 HostA 的 MAC 是 MAC_M,则可实现双向截获,完成中间人攻击
| 欺骗方式 | 操作 | 效果 |
|---|---|---|
| 单向欺骗 | 只欺骗 HostA(告诉 HostA:网关是 HostM) | HostA 的数据经过 HostM,但网关直接回复 HostA 时走正常路径,可能导致 TCP 序列号错乱 |
| 双向欺骗(更常见) | 同时欺骗 HostA 和网关(告诉网关:HostA 是 HostM) | HostA 和网关的所有通信都经过 HostM,完美的中间人 |
双向欺骗需要攻击者同时发送:
- 给 HostA:网关IP(192.168.1.1) → 攻击者MAC
- 给网关:HostA的IP(192.168.1.2) → 攻击者MA