%%
# 纲要
> 主干纲要、Hint/线索/路标
# Q&A
#### 已明确
#### 待明确
> 当下仍存有的疑惑
**❓<font color="#c0504d"> 有什么问题?</font>**
# Buffer
## 闪念
> sudden idea
## 候选资料
> Read it later
%%
# ARP 协议
> ARP(Address Resolution Protocol),**地址解析协议**。
ARP 协议用于**在==局域网内==获取某一已知 ==IP 地址==对应的==设备的 MAC 地址==**,其属于 "**==数据链路层==(二层)协议**"。
> [!NOTE] APR 协议的作用:**根据同一网段下的目标设备的 IP 地址来获取其 MAC 地址**。
>
> 当一台网络设备要**与同一网段中的另一台设备通信**时,需要知晓**目标设备的 MAC 地址**,该过程即通过 APR 协议实现。
>
> 
>
> [!NOTE] ARP 协议仅用于 IPv4 网络中,在 IPv6 中使用邻居发现协议。
<br><br><br>
# ARP 地址解析过程
ARP 过程涉及两类报文:
- **==ARP 请求==**(ARP Request)——以 "**==广播==**" 的形式发送,用于查找**目标 IP 地址对应的 MAC 地址**。
- **==ARP 响应==**(ARP Reply)——以 "**单播**" 的形式应答,提供 IP 地址对应的 MAC 地址。
![[_attachment/02-开发笔记/07-计算机网络/数据链路层/ARP 协议.assets/IMG-ARP 协议-9641767AC83D6C303685F423EFE6C918.png|613]]
> [!NOTE] ARP 报文格式
>
> 请求、响应报文的格式均如下,参见[^1](P116)。
> 注意,ARP 是链路层协议,其**只具有 MAC 头部,没有 IP 头部**。
>
> ![[_attachment/02-开发笔记/07-计算机网络/数据链路层/ARP 协议.assets/IMG-ARP 协议-BEE273DB2708B640A14434D3B2E74F4F.png|757]]
>
<br>
## ARP 请求报文(广播)
当设备 A 想要与同网段内的设备 B 通信,但不知道设备 B 的 MAC 地址时,其会**在所属网段内**广播一个 **ARP 请求** 。
ARP 请求以 "**==链路层广播帧==**" 的形式发送,发送给**同一链路层上的所有设备**。
在该请求报文中的字段说明:
| 字段 | 说明 |
| --------- | -------------------------------- |
| 源 IP 地址 | 即**源主机的 IP 地址** |
| 源 MAC 地址 | 即**源主机的 MAC 地址** |
| 目的 IP 地址 | 即**源主机所==请求查询的 IP 地址==** |
| 目的 MAC 地址 | **`FF:FF:FF:FF:FF:FF` ==广播地址==** |
> [!NOTE] ARP 广播只在单个网段内进行
>
> 路由器发起 arp 广播时,**只会从其某一个端口发出,在该端口所属的网段内进行广播**。
<br>
## ARP 应答报文(单播)
同一链路层上的各台设备收到 ARP 请求后:
- **检查==目标 IP 地址==是否==与自己匹配==**:
- 若匹配,则该设备**直接向 "==请求的源主机==" 回发一个 ==ARP 响应消息==**。
- 否则,**丢弃该数据包**,拒绝响应。
在该响应报文中的字段说明:
| 字段 | 说明 |
| --------- | --------------------------------- |
| 源 IP 地址 | 即 **目标设备自身的 IP 地址** |
| 源 MAC 地址 | 即 **==目标设备自身的 MAC 地址==**,作为查询结果返回 |
| 目的 IP 地址 | **发起 ARP 请求的源主机的 IP 地址** |
| 目的 MAC 地址 | **发起 ARP 请求的源主机的 MAC 地址** |
<br><br><br>
# ARP 缓存表
APR 查询结果保存在设备的 **==ARP 缓存表==** 中,**主机或路由器**内部均**存储有一张 ARP 缓存表**。
ARP 缓存表中记录了 **==该设备各个接口所在网段中==的其他设备的 ==IP 地址== 与 ==MAC 地址==的映射关系**。
例如,假设主机有**两张网卡 1 和 2**,分别标识为**接口 `eth1` 和 `eth2`**,则 **ARP 表中将分别记录**:
- 与网卡 `eth1` 直连的**其他设备的 IP 地址及 MAC 地址**;
- 与网卡 `eth2` 直连的**其他设备的 IP 地址及 MAC 地址**。
> [!NOTE] ARP 缓存表在 "路由转发" 过程中的作用
>
> 在路由转发过程中:
>
> - 路由器首先就 "**目的 IP 地址**" 查询 "**路由表**",获得「**用以==转发==该数据包的接口**」 以及 「**==下一跳设备==的 IP 地址**」;
> - 路由器进而就 "**下一跳设备 IP 地址**" 查询 "**ARP 表**",获取「**下一跳设备的 ==MAC 地址==**」,从而封**装 MAC 头部,进行转发**。
>
> [!info] Linux 或 Windows 下可通过 `arp -a` 命令查看 ARP 缓存
> 
> [!example] Windows 下的 ARP 缓存表
> ![[_attachment/02-开发笔记/07-计算机网络/数据链路层/ARP 协议.assets/IMG-ARP 协议-3FEBCD33731D1135DD1F217CB67DEE64.png|442]]
### ARP 表项类型
ARP 表项包括两种:
- **动态 ARP 表项**
- **由 ==ARP 协议==自动生成和维护**,具有**时效限制**,**可被新的 ARP 报文更新**,**也可以被静态 ARP 表项覆盖**。
- **静态 ARP 表项**:
- **==手工输入==的 ARP 条目**,**无时效限制**,**优先级高于动态表项**。
<br><br><br>
# APR 过程分析示例
## 场景一
结论:**==PC4 与 PC5 不能互相 Ping 通==**。
![[05-工具/网络相关工具/思科 Cisco Packet Tracer/Cisco Packet Tracer 工具#组网模拟示例#情况二|Cisco Packet Tracer 工具]]
## 场景二
![[05-工具/网络相关工具/思科 Cisco Packet Tracer/Cisco Packet Tracer 工具#组网模拟示例#场景二:错误配置、但可以互 ping]]
# ♾️参考资料
# Footnotes
[^1]: 《TCP/IP 详解-卷 1》