卷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结点状态。