ARP协议简介
ARP所实现的功能就是通过IP地址获取到MAC地址,并且将IP和MAC映射到一起,保存到ARP表中.
ARP数据包格式
Dest MAC | Src MAC | frame type | hardware type | Protocol type | hardware addr len | protocol addr len | op | send mac addr | send ip addr | dest mac addr | dest ip addr |
---|---|---|---|---|---|---|---|---|---|---|---|
6 | 6 | 2 | 2 | 2 | 1 | 1 | 2 | 6 | 4 | 6 | 4 |
ARP层工作流程
LWIP中ARP层数据包输入处理流程
LWIP中ARP层处理数据包输出流程
ARP缓存表
ARP表组成
ARP缓存表是ARP协议的核心.发送数据包时,需要查找ARP表得到目的地址的MAC地址;ARP还需要不断的处理ARP请求包和应答包,以保证ARP表中的有效性.
ARP缓存表实质上就是对缓存表的建立,更新,查询等操作.
struct etharp_entry | |
---|---|
struct etharp_q_entry *q | 需使能ARP_QUEUEING,做成链表形式 |
struct pbuf *q | 不使能ARP_QUEUEING时,单个缓存包 |
ip addr | ip addr |
ethaddr | mac addr |
ctime | cleanup time |
state | EMPTY(0),PENDING(1),STABLE(2) |
ARP表的更新
在lwip中的ARP缓存表的大小为10个表项,在opt.h中配置.
那么问题来了,如果ARP缓存表满了,这时候又有新的IP地址发来新的ARP请求,那么lwip是如何处理这种情况的呢?
关于ARP缓存表的更新,有两个重要的函数:etharp_update_arp_entry
和etharp_find_entry
.这两个函数负责的是ARP缓存表的查找和更新操作.无论是发送数据包还是接受数据包,都需要经过这两个函数.
收发数据时查找/更新ARP表
ARP表的操作过程如下图所示.
关键操作如下:
1.有匹配的arp表项不需要创建直接返回
2.无匹配表项时,先使用empty状态的表项
3.无empty时,先替换最老pending无数据缓存的表项.再替换最老pending有数据缓存的表项
4.最后才替换最老stable的表项
定时更新ARP表
除了收发数据时,查找或更新ARP缓存表外,ARP协议还需要定时检测ARP缓存表的表项,是否需要更新.这是为了保证ARP表中的地址的有效性,这是因为网络硬件状态随时发生变化,可能设备已经不在此网络中,就没必要占着茅坑不拉屎了.lwip中使用etharp_tmr
来定时检测ARP缓存表,当表项的ctime
大于ARP_MAXAGE
时,就清空该表项