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 MACSrc MACframe typehardware typeProtocol typehardware addr lenprotocol addr lenopsend mac addrsend ip addrdest mac addrdest ip addr
662221126464

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 addrip addr
ethaddrmac addr
ctimecleanup time
stateEMPTY(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_TABLE_SIZE? state==empty? empty=i 遍历完成 返回索引i 函数未返回? flag=TRY_HARD? 创建新表项(empty) pending代替old_peding为新表项 stable代替stable为新表项 End state==pending? no match_arp_stable? old_pending = i state==stable? no match_arp_stable? old_stable = i yes yes no yes no yes no yes no yes no yes yes no
定时更新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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值