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
- 该状态一般通过应用层命令设置,邻居项的硬件地址已静态配置,也无需将三层协议地址映射到二层地址协议的支持,也不会被垃圾回收
三大类状态
|
|
|
|
|
- NUD_IN_TIMER
- 定时器状态,标识邻居项在此类状态下设置了一个定时器
- NUD_VALID
- 有效状态,表示在这些状态下该邻居项是有效的
- NUD_CONNECTED
- 连接状态,在这些状态下可以直接发送数据包给该邻居