加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核分析 - 网络[九]:邻居表

发布时间:2016-01-23 17:24:38 所属栏目:Linux 来源:网络整理
导读:内核版本:2.6.34 这部分的重点是三个核心的数据结构-邻居表、邻居缓存、代理邻居表,以及NUD状态转移图。 总的来说,要成功添加一条邻居表项,需要满足两个条

当neigh处于NUD_PROBE或NUD_INCOMPLETE状态时,记录下次检查时间到next,因为这两种状态需要发送ARP解析报文,它们过 程的迁移依赖于ARP解析的进程。

else {     
 /* NUD_PROBE|NUD_INCOMPLETE */ 
 next = now + neigh->parms->retrans_time;     
}

经过定时器超时后的状态转移,如果neigh处于NUD_PROBE或NUD_INCOMPLETE,则会发送ARP报文,先会检查报文发送 的次数,如果超过了限度,表明对方主机没有回应,则neigh进入NUD_FAILED,被释放掉。

if ((neigh->nud_state 

& (NUD_INCOMPLETE | NUD_PROBE)) &&     
 atomic_read(&neigh->probes) >= neigh_max_probes(neigh)) {     
 neigh->nud_state = NUD_FAILED;     
 notify = 1;     
 neigh_invalidate(neigh);     
}

检查完后,如果还未超过限度,则会发送ARP报文,neigh->ops->solicit在创建表项neigh时被赋值,一般是 arp_solicit,并且增加探测计算neigh->probes。

if (neigh->nud_state & (NUD_INCOMPLETE | 

NUD_PROBE)) {     
 struct sk_buff *skb = skb_peek(&neigh->arp_queue);     
 /* keep skb alive even if arp_queue overflows */ 
 if (skb)     
  skb = skb_copy(skb, GFP_ATOMIC);     
 write_unlock(&neigh->lock);     
 neigh->ops->solicit(neigh, skb);     
 atomic_inc(&neigh->probes);     
 kfree_skb(skb);     
}

实际上,neigh_timer_handler处理启用了定时器状态超时的情况,下图反映了neigh_timer_handler中所涉及的状态 转移,值得注意的是NUD_DELAY -> NUD_REACHABLE的状态转移,在arp_process中也提到过,收到arp reply时会有表项状态 NUD_DELAY -> NUD_REACHABLE。它们两者的区别在于arp_process处理的是arp的确认报文,而neigh_timer_handler处理的是 4层的确认报文。

Linux内核分析 - 网络[九]:邻居表

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读