linux内核中邻居项状态机

邻居项状态机

  •  

  • NUD_NONE
    • 邻居项刚建立时处于的初始状态
    • 在此状态下,还没有硬件地址可使用,因此还不能发送请求报文.此时,一旦有报文要输出到该邻居,便会触发对该邻居硬件地址的请求,进入NUD_INCOMPLETE状态,并缓存发送的报文.
    • 参见neigh_alloc和neigh_resolve_output
  • NUD_INCOMPLETE
    • 请求报文已经发送,但尚未收到应答的状态
    • 在此状态下,还没有解析到硬件地址,因此尚无可用的硬件地址,如果有报文要输出到此邻居,会将其先缓存起来.当进入此状态时,会启动一个定时器,如果在定时器到期时还未接收到邻居的回应,则会重复发送请求报文,直至解析成功或者尝试发送请求报文的次数达到上限,解析成功进入NUD_REACHABLE状态,否则如果尝试发送请求报文的次数达到上限,便进入NUD_FAILED状态
  • NUD_REACHABLE
    • 可达状态,已经得到并缓存了邻居的硬件地址
    • 进入该状态时,首先设置邻居项相关的output函数指针(该状态下使用neigh_ops结构的connected_output),然后查看是否存在要发送给邻居的报文,如果有,则将其发送出去.如果在该状态下闲置时间达到指定上限时,便会进入NUD_STALE状态
  • NUD_STALE
    • 过期状态
    • 在该状态下一旦有报文要输出到该邻居,则会进入NUD_DELAY状态并将该报文输出;如果在该状态闲置时间达到指定上限,且此时的引用计数为1,则通过垃圾回收机制将其删除
  • NUD_DELAY
    • 报文已发出,需要得到邻居的可达性确认的状态
    • 在该状态在延迟的指定时间内未收到确认,便会进入NUD_PROBE状态,否则进入NUD_REACHABLE状态.在该状态下,报文的输出不受限制,使用慢速发送过程
  • NUD_PROBE
    • 过度状态,类似NUD_INCOMPLETE状态
    • 在未接收到邻居的应答或确认时也会定时地重发请求,直到收到邻居的应答,确认或尝试发送请求报文的次数达到上限,如果收到邻居的应答或确认,则进入NUD_REACHABLE状态;如果尝试发送请求报文的次数达到上限,则进入NUD_FAILED状态.在该状态下,报文的输出也不受限制,使用慢速发送过程
  • NUD_FAILED
    • 由于没有接收到应答而无法访问状态
    • 从状态变迁图中可以看到,有两种情况下邻居项会进入NUD_FAILED状态,一是在刚创建时有报文要发送,但解析地址不成功,二是邻居项处于NUD_PROBE装填是有报文要发送,却没有收到应答或确认
  • NUD_NOARP
    • 标识邻居无需将三层协议地址映射到二层地址协议的支持
  • NUD_PERMANENT
    • 该状态一般通过应用层命令设置,邻居项的硬件地址已静态配置,也无需将三层协议地址映射到二层地址协议的支持,也不会被垃圾回收

三大类状态

 
 

#define NUD_IN_TIMER (NUD_INCOMPLETE|NUD_REACHABLE|NUD_DELAY|NUD_PROBE)

 

#define NUD_VALID (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_PROBE|NUD_DELAY)

 

#define NUD_CONNECTED (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE)

  • NUD_IN_TIMER
    • 定时器状态,标识邻居项在此类状态下设置了一个定时器
  • NUD_VALID
    • 有效状态,表示在这些状态下该邻居项是有效的
  • NUD_CONNECTED
    • 连接状态,在这些状态下可以直接发送数据包给该邻居

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值