arp表老化时间及其修改

ARP表包含ip地址、mac地址的映射关系
老化:arp表和mac表,当达到配置的表项老化时间后,根据探测次数每隔5s发送一个探测报文,如果一直没有收到应答消息则表项被删除。

默认
ARP表项的老化超时时间:缺省值是1200秒;
MAC表的老化超时时间:缺省值是300秒 ;

修改命令
arp expire-time命令用来设置动态ARP表项的老化超时时间。
mac-address aging-time命令用来设置动态MAC地址表项的老化时间
arp detect-times命令修改arp探测次数。默认探测次数是3次

不可修改的老化时间
除原有的老化时间探测,交换机新增加了1/2探测时间点和3/4探测时间点,这两个探测时间点的探测次数都为3次,不能修改。
比如,expire-time为20分钟(1200s),detect-times为6,当到达10分钟时,每隔5s发一个arp探测报文,连续发3次;到达15分钟时,同样发3次arp探测;当到达20分钟时,发6次arp探测,若一直没有收到回应报文,则表项删除。

比如: 配置expire-time为60s, detect-times为6。
那么当到达60s时,每隔5s发送一个arp探测报文,若一直没有收到回应报文,则表项删除,那么实际表项老化所需要的时间为:(60+6*5)=90s

ARP协议工作原理
每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。
主机(网络接口)新加入网络时(也可能只是mac地址发生变化,接口重启等), 会发送免费ARP报文把自己IP地址与Mac地址的映射关系广播给其他主机。
网络上的主机接收到免费ARP报文时,会更新自己的ARP缓冲区。将新的映射关系更新到自己的ARP表中。
某个主机需要发送报文时,首先检查 ARP 列表中是否有对应 IP 地址的目的主机的 MAC 地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 数据包,该数据包包括的内容有:源主机 IP 地址,源主机 MAC 地址,目的主机的 IP 地址等。
当本网络的所有主机收到该 ARP 数据包时:
(A)首先检查数据包中的 IP 地址是否是自己的 IP 地址,如果不是,则忽略该数据包。
(B)如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖。
(C) 然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。
6.源主机收到 ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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项,以提高网络性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值