ARP表项的创建与更新

今天上课讲到ARP协议,但是对一些APR表项的更新有一些疑问,所以查询了有关资料。

依据ARP协议描述,几乎所有的以太网通信都以ARP开始,所以任何以太网主机设备都支持这个协议,而且IP地址到以太网MAC地址的解析主要也是动态生成,无须网络管理员手工处理。
一般实现中,如果收到的ARP报文满足以下条件中的任何一条,系统将创建或更新ARP表项:

ARP报文的源IP地址与入接口IP地址在同一网段,且不是广播地址,目的IP地址是本接口IP地址。

ARP报文的源IP地址与入接口IP地址在同一网段,且不是广播地址,目的IP地址是本接口的VRRP(Virtual Router Redundancy Protocol)虚拟IP地址。
如果收到的ARP报文的源IP地址在入接口的ARP表中已经存在对应表项,也将对ARP表项进行更新。

文章出自ARP

有这么广泛流传的一段话,如果ARP报文的目的IP地址与本机的相同,则将报文中的IP地址和MAC地址添加到ARP缓存表项中,假如已经存在该IP的表项,则进行更新;然后,回复一个应答包。如果IP地址和本机的IP地址不符合,则丢弃报文。
那么问题来了,在IP地址和本机IP地址不符合的情况下,是否要进行ARP缓存表项的更新?
如果不进行更新,那么免费ARP(也是ARP请求,op字段为1)又怎么会实现他的作用呢,这里我们将免费ARP简单介绍一下。
免费ARP是一个目的IP地址是本机IP地址的ARP。发送一个免费ARP,我们可以判断局域网内是否有重复IP地址的主机(显然我们不希望有),我们也可以在更新mac地址(例如换网卡)后发送免费ARP来更新其他主机的ARP缓存表项,当其他电脑收到这个arp 广播时会和ARP缓存做对比,并更新ARP缓存,如果ARP缓存中没有这个IP的记录则直接忽视这个广播包。
现在我们可以假设,当ARP请求包的目的IP地址与本机IP地址不同时,本机会在ARP缓存表项中查找是否有该IP地址,如果有,则更新,如果没有,则不做动作,最后本机都会丢弃该数据包。

Created with Raphaël 2.2.0 开始 ARP请求包 目的IP和本机IP相同? 添加或更新该IP的缓存表项,返回一个请求包 ARP缓存表项中有该IP地址? 更新该IP地址的表项 丢弃该数据包 不做处理 yes no yes no

按照图中的步骤可以解释以上谈到的情况,如有错误,还请指出。
还有一种情况是:
当主机接收到ARP应答数据包的时候,就会对本地的ARP缓存进行更新,将应答中的IP和MAC地址存储在ARP缓存中。

总结:只要主机中有发送端IP的ARP表项,收到它的ARP数据包时就会对ARP表项进行更新。

附上一篇免费ARP的文章 免费ARP简析

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ARP表项老化是指在一定时间内没有通信时,ARP表中的条目将被删除。这是为了防止ARP缓存表中的旧数据影响网络性能而采取的一种措施。以下是ARP表项老化的源码示例: ```c #define ARP_TIMEOUT 300 // ARP表项超时时间,单位为秒 struct arp_entry { uint32_t ip; uint8_t mac[6]; time_t timestamp; // 最后一次更新的时间戳 }; struct arp_entry arp_table[ARP_MAX_ENTRIES]; int arp_entry_count = 0; void arp_add_entry(uint32_t ip, uint8_t *mac) { // 添加ARP表项 if (arp_entry_count < ARP_MAX_ENTRIES) { arp_table[arp_entry_count].ip = ip; memcpy(arp_table[arp_entry_count].mac, mac, 6); arp_table[arp_entry_count].timestamp = time(NULL); arp_entry_count++; } } void arp_delete_entry(int index) { // 删除ARP表项 if (index >= 0 && index < arp_entry_count) { arp_entry_count--; for (int i = index; i < arp_entry_count; i++) { arp_table[i] = arp_table[i+1]; } } } void arp_update_entries() { // 更新ARP表项 time_t now = time(NULL); for (int i = 0; i < arp_entry_count; i++) { if (now - arp_table[i].timestamp > ARP_TIMEOUT) { arp_delete_entry(i); i--; // 因为删除了一个元素,需要重新检查当前位置 } } } ``` 在上述代码中,我们定义了一个结构体`arp_entry`来存储ARP表项IP地址、MAC地址和时间戳。我们还定义了一个`arp_table`数组来存储所有ARP表项,以及一个`arp_entry_count`变量来记录当前ARP表中的条目数。 `arp_add_entry()`函数用于添加ARP表项,它将IP地址、MAC地址和时间戳保存到`arp_table`数组中。如果`arp_entry_count`已经达到了最大值`ARP_MAX_ENTRIES`,则无法添加新的ARP表项。 `arp_delete_entry()`函数用于删除ARP表项,它将指定位置的ARP表项删除,并将后面的所有ARP表项向前移动一个位置。 `arp_update_entries()`函数用于更新ARP表项,它遍历所有ARP表项,检查它们是否已经超时。如果一个ARP表项的时间戳与当前时间的差值大于`ARP_TIMEOUT`,则将其删除。 通过这些函数,我们可以实现ARP表项的添加、删除和更新。在使用ARP协议时,我们应该定期调用`arp_update_entries()`函数来清理过期的ARP表项,以提高网络性能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值