目录
[一、MAC 帧协议](#一、MAC 帧协议)
[1. 网络通信的三层结构](#1. 网络通信的三层结构)
[2. 以太网](#2. 以太网)
[3. MAC 帧报头结构](#3. MAC 帧报头结构)
[4. MTU 与 MSS](#4. MTU 与 MSS)
[二、ARP 协议(地址解析协议)](#二、ARP 协议(地址解析协议))
[1. 局域网内通信](#1. 局域网内通信)
[2. 数据碰撞](#2. 数据碰撞)
[3. ARP 协议的作用](#3. ARP 协议的作用)
[4. ARP 协议报头结构](#4. ARP 协议报头结构)
[5. ARP 请求的发送过程](#5. ARP 请求的发送过程)
[6. ARP 应答的返回过程](#6. ARP 应答的返回过程)
[7. ARP 缓存](#7. ARP 缓存)
[8. 通信过程中的 ARP](#8. 通信过程中的 ARP)
一、MAC 帧协议
1. 网络通信的三层结构
把数据从不同公网的主机 A 传到主机 B,本质是由不同局域网间的主机通信构成的。
| 层级 | 协议 | 作用 |
|---|---|---|
| 传输层 | TCP | 确保可靠性,处理丢包问题 |
| 网络层 | IP | 长距离传输,指明大概方向 |
| 数据链路层 | MAC 帧 | 每个局域网内具体怎么传 |
2. 以太网
以太网不是具体的某个网络,而是一种标准(IEEE 802.3 系列)。
数据链路层的两个基本功能:
-
分离:通过固定长度的协议头,将报头和有效载荷分离
-
分用:通过帧类型字段,将数据交给上层对应的协议
3. MAC 帧报头结构
text
[ 目的MAC地址 ][ 源MAC地址 ][ 类型 ][ 数据 ][ CRC ]
6字节 6字节 2字节 46-1500字节 4字节
字段说明:
-
目的 MAC 地址(6 字节):接收方的物理地址
-
源 MAC 地址(6 字节):发送方的物理地址
-
类型(2 字节):上层协议类型
-
0x0800:IP 协议 -
0x0806:ARP 协议
-
-
数据(46-1500 字节):上层传下来的有效载荷
-
CRC(4 字节):循环冗余校验,检测数据是否损坏
MAC 地址:
-
用于数据链路层的节点识别
-
出厂时设定,全球唯一(理论上)
4. MTU 与 MSS
MTU(最大传输单元):
-
以太网规定数据帧的大小范围:46 ~ 1500 字节
-
小于 46 字节需要填充
-
大于 1500 字节需要分片
为什么要有下限 46 字节?
-
以太网是共享介质,存在数据碰撞
-
为了检测碰撞,帧需要足够长
-
太短的帧可能无法检测到碰撞
MSS(最大分段大小):
-
MSS = MTU - IP 报头 - TCP 报头
-
典型值:1500 - 20 - 20 = 1460 字节
-
对于 UDP:1500 - 20 - 8 = 1472 字节
分片位置:
-
分片不一定只发生在主机中
-
MTU 较小的路由器也可能对数据报进行分片
-
由于 IP 报头中有偏移量和标志位,无论怎么分片,最终都可以重组
TCP 的优化:
-
TCP 三次握手时,双方会在选项字段中携带自己的 MSS 大小
-
双方取较小的 MSS 作为发送上限
-
这样 TCP 层就能控制向下传递的数据大小,减少 IP 层分片
-
注意:IP 层不知道 MSS,它只是被动地执行分片任务;MSS 是 TCP 层的概念
二、ARP 协议(地址解析协议)
1. 局域网内通信
当局域网内的主机 A 要发送数据到主机 E 时:
-
A 将数据发送给路由器
-
路由器向局域网广播
-
B、C、D 等主机收到后自动丢弃
-
E 主机接收并处理
2. 数据碰撞
-
局域网是一个碰撞域,同一时刻只能有一个设备发送数据
-
多个设备同时发送,会产生数据碰撞
-
碰撞发生后,需要采用**重发、退避(休眠)**等机制恢复
帧大小的限制:
-
从碰撞角度考虑,单个主机占用网络的时间越短越好
-
但帧太短可能无法检测到碰撞
-
因此以太网规定了帧的上下限:46 ~ 1500 字节
3. ARP 协议的作用
问题:MAC 帧通信需要目标 MAC 地址,但第一次通信时不知道对方的 MAC 地址。
解决方案:ARP 协议
ARP 的作用:通过 IP 地址获取 MAC 地址
工作过程:
-
主机知道目标 IP,但不知道目标 MAC
-
在局域网内广播一个 ARP 请求:"谁的 IP 是 x.x.x.x?请告诉我你的 MAC 地址"
-
目标主机收到后,单播回复 ARP 应答,告知自己的 MAC 地址
协议层次:
-
ARP 协议和 MAC 帧协议都在数据链路层
-
但 ARP 是 MAC 的上层协议
-
ARP 报文需要先被 MAC 帧封装,然后发送
4. ARP 协议报头结构
ARP 报头固定 28 字节:
text
[ 硬件类型 ][ 协议类型 ][ 硬件地址长度 ][ 协议地址长度 ][ OP ][ 发送方MAC ][ 发送方IP ][ 目标MAC ][ 目标IP ]
2字节 2字节 1字节 1字节 2字节 6字节 4字节 6字节 4字节
字段说明:
| 字段 | 长度 | 说明 |
|---|---|---|
| 硬件类型 | 2 字节 | 链路层网络类型,以太网为 1 |
| 协议类型 | 2 字节 | 上层协议类型,IP 协议为 0x0800 |
| 硬件地址长度 | 1 字节 | MAC 地址长度,一般为 6 |
| 协议地址长度 | 1 字节 | IP 地址长度,一般为 4 |
| OP | 2 字节 | 操作类型:1=ARP 请求,2=ARP 应答 |
| 发送方 MAC | 6 字节 | 发送方的物理地址 |
| 发送方 IP | 4 字节 | 发送方的 IP 地址 |
| 目标 MAC | 6 字节 | 目标物理地址(请求时填 0) |
| 目标 IP | 4 字节 | 目标的 IP 地址 |
填充问题:
-
MAC 帧协议 14 字节 + ARP 协议 28 字节 = 42 字节
-
小于以太网规定的 46 字节下限
-
因此会在数据后面补足随机数据,凑够 46 字节
5. ARP 请求的发送过程
发送 ARP 请求:
-
OP 字段 = 1(请求)
-
目标 MAC 地址填
FF:FF:FF:FF:FF:FF(广播地址) -
被 MAC 帧封装时,MAC 报头的目标地址也是
FF:FF:FF:FF:FF:FF
接收处理:
-
局域网内所有主机都会收到这个 MAC 帧
-
网卡发现目标 MAC 是广播地址,向上传递给 ARP 协议
-
ARP 协议解析报文:
-
如果 OP = 1 且目标 IP 是自己 → 发送 ARP 应答
-
如果目标 IP 不是自己 → 直接丢弃
-
6. ARP 应答的返回过程
发送 ARP 应答:
-
OP 字段 = 2(应答)
-
目标 MAC 地址填写请求方的 MAC(已经从请求报文中获得)
-
被 MAC 帧封装时,MAC 报头的目标地址就是请求方的 MAC
接收处理:
-
只有请求方主机会收到这个 MAC 帧(其他主机在 MAC 层就会丢弃)
-
请求方解析 ARP 报文,获得目标主机的 MAC 地址
广播与应答的区别:
-
请求时:MAC 层广播,所有主机都收到,ARP 层判断是否是自己
-
应答时:MAC 层单播,只有目标主机收到,ARP 层直接处理
7. ARP 缓存
为了提高效率,主机会维护一个 ARP 缓存表,记录最近通信过的 IP 地址与 MAC 地址的映射关系。
为什么不永久保存?
-
MAC 设备可能更换(网卡坏了换新网卡)
-
IP 地址是动态分配的(DHCP),可能变化
-
因此缓存会设置过期时间(通常是几分钟到几十分钟)
查看 ARP 缓存:
arp -a
8. 通信过程中的 ARP
ARP 不仅发生在主机和路由器之间,在路由器与路由器之间也会触发。
在整个通信过程中,ARP 会一直触发:
-
每经过一个路由器,都需要知道下一跳的 MAC 地址
-
因此 ARP 是网络通信的基础机制