卷2 第21章 ARP:地址解析协议
21.1 介绍
ARP实现IP地址到硬件地址的映射,与路由表紧密关联。
21.2 ARP和路由表
关键数据结构
- llinfo_arp:ARP结点信息
- rtentry:路由表项
- sockaddr_dl:链路层地址
关系
llinfo_arp ↔ rtentry ↔ sockaddr_dl
text
21.3 代码介绍
net/if_arp.h:ARP首部netinet/if_ether.h:结构定义netinet/if_ether.c:ARP函数
21.4 ARP结构
arphdr结构
struct arphdr {
u_short ar_hrd; // 硬件类型
u_short ar_pro; // 协议类型
u_char ar_hln; // 硬件地址长度
u_char ar_pln; // 协议地址长度
u_short ar_op; // 操作码
};ether_arp结构
struct ether_arp {
struct arphdr ea_hdr;
u_char arp_sha[6]; // 发送端硬件地址
u_char arp_spa[4]; // 发送端IP地址
u_char arp_tha[6]; // 目标硬件地址
u_char arp_tpa[4]; // 目标IP地址
};llinfo_arp结构
成员 说明 la_rt 路由表项 la_hold 待发送数据报 la_asked 请求计数
21.5 arpwhohas函数
广播ARP请求
发送免费ARP
21.6 arprequest函数
构造ARP请求
调用ether_output发送
21.7 arpintr函数
处理ARP输入队列
调用in_arpinput
21.8 in_arpinput函数
处理逻辑 验证请求
查找匹配接口
检查地址冲突
创建/更新ARP结点
发送ARP应答
ARP代理 检查SIN_PROXY标志
代其他主机应答
21.9 ARP定时器函数
arptimer函数 每5分钟调用
检查超时ARP结点
arptfree函数 删除超时ARP结点
释放保持的数据报
21.10 arpresolve函数
处理流程 广播/多播:直接映射
查找ARP结点
有效:返回硬件地址
无效:发送ARP请求
避免ARP洪泛
ARP洪泛避免 每秒最多1个请求
5次失败后暂停20秒
21.11 arplookup函数
查找ARP结点
支持代理ARP查找
21.12 代理ARP
两种类型:直接代理和路由代理
使用SIN_PROXY标志
21.13 arp_rtrequest函数
RTM_ADD处理 初始化ARP定时器
设置克隆标志
发送免费ARP
RTM_RESOLVE处理 分配llinfo_arp结构
初始化ARP结点
RTM_DELETE处理 释放llinfo_arp
释放保持的数据报
21.14 ARP和多播
多播组使用以太网多播地址
不通过ARP解析
21.15 小结
ARP在路由表中存储地址映射。llinfo_arp管理ARP结点状态。