LWIP协议栈学习(一):ARP协议

ARP协议简介

ARP所实现的功能就是通过IP地址获取到MAC地址,并且将IP和MAC映射到一起,保存到ARP表中.

电脑1 电脑2 ARP Request Who is 10.8.0.45? Tell 10.10.0.13 验证数据包+查找或更新ARP表 ARP Reply 10.8.0.45,MAC ADDR is xx:xx:xx:xx:xx:xx 将返回MAC放入ARP表 电脑1 电脑2

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 Ethernet_input etharp_arp_input update_arp_entry ip_input ARP Request low_level_input frame_type frame_type=800 frame_type=806 find or update opcode opcode=1 ARP Reply IP层 电脑 lwip Ethernet_input etharp_arp_input update_arp_entry ip_input

LWIP中ARP层处理数据包输出流程

lwip etharp_output etharp_query update_etharp_entry etharp_request 电脑 发送数据包 广播?组播?单播? 广播/组播 发送数据 单播+存在ARP记录 发送数据 没有ARP记录 查找ARP表 ARP表中无记录 数据保存在缓冲区 ARP Request ethernet_output 查找或更新ARP表 ARP Reply ethernet_Input 更新ARP表 发送数据 lwip etharp_output etharp_query update_etharp_entry etharp_request 电脑

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_entryetharp_find_entry.这两个函数负责的是ARP缓存表的查找和更新操作.无论是发送数据包还是接受数据包,都需要经过这两个函数.

收发数据时查找/更新ARP表

ARP表的操作过程如下图所示.

关键操作如下:

1.有匹配的arp表项不需要创建直接返回

2.无匹配表项时,先使用empty状态的表项

3.无empty时,先替换最老pending无数据缓存的表项.再替换最老pending有数据缓存的表项

4.最后才替换最老stable的表项

Created with Raphaël 2.2.0 etharp_find_entry(ipaddr, flag) i

定时更新ARP表

除了收发数据时,查找或更新ARP缓存表外,ARP协议还需要定时检测ARP缓存表的表项,是否需要更新.这是为了保证ARP表中的地址的有效性,这是因为网络硬件状态随时发生变化,可能设备已经不在此网络中,就没必要占着茅坑不拉屎了.lwip中使用etharp_tmr来定时检测ARP缓存表,当表项的ctime大于ARP_MAXAGE时,就清空该表项

Created with Raphaël 2.2.0 etharp_tmr() state!=empty? ctime++ ctime>ARP_MAXAGE? etharp_free_entry(表项索引i) End state==pending && ctime>2? etharp_request yes yes no yes no

你可能感兴趣的:(网络)