NA消息用单播还是多播的判断理由
- 单播回复(Unicast):
- 如果客户端发送 RS 消息时,使用的是一个全局地址或链路本地地址作为源地址,则 RA 消息会单播回复到客户端的源地址。
- 这种方式减少了网络中的广播流量,仅回复给请求的客户端。
- 多播回复(Multicast):
- 如果 RS 消息的源地址为未指定地址(::,通常出现在刚启动或接口初始化时),则 RA 消息会通过多播发送到所有节点多播组地址(ff02::1)。
- 这是因为路由器不知道具体哪个客户端发送了 RS 消息,或者 RS 可能针对多个客户端需求。
- 相关说明在RFC4861
NA消息 RTR,SOL,OVR标志位
RTR 标志位(Router Flag)
表示发送 NA 消息的节点是否是一个路由器。
- 取值:
- 1:发送此 NA 消息的节点是路由器。
- 0:发送此 NA 消息的节点不是路由器。
- 作用:
- 如果 RTR=1,接收方可能将其记录为路由器,用于默认网关等功能。
- 如果 RTR=0,接收方会认为发送方只是一个普通主机。
- 设置规则:
- 路由器在发送 NA 消息时,通常会将 RTR 设置为 1。
- 普通主机在发送 NA 消息时,RTR 应设置为 0。
- 配置影响:
- 需要在路由器启用 IPv6 转发功能(net.ipv6.conf.all.forwarding=1)并通过邻居发现协议正确声明自己为路由器。
SOL 标志位(Solicited Flag)
表示该 NA 消息是否是对特定的 Neighbor Solicitation (NS) 消息的响应。
- 取值:
- 1:该 NA 消息是响应一个特定的 NS 消息(即 solicited NA)。
- 0:该 NA 消息是一个 unsolicited NA 消息。
- 作用:
- Solicited NA 消息: 用于更新邻居缓存表。
- Unsolicited NA 消息: 用于广播特定地址的所有权声明,防止地址冲突。
- 典型场景:
- 如果节点接收到对自己地址的 NS 消息,会发送带 SOL=1 的 NA 消息作为响应。
- 如果节点主动通知网络其地址的变化,会发送带 SOL=0 的 NA 消息。
- 如果是对 NS 消息的直接响应,SOL=1。如果是广播性质的地址声明,SOL=0。
OVR 标志位(Override Flag)
决定接收节点是否应该覆盖其现有的邻居缓存表条目。
- 取值:
- 1:接收节点应更新现有的邻居缓存条目。
- 0:接收节点不应覆盖现有的缓存条目。
- 作用:
控制邻居缓存表的更新策略:- OVR=1:表示发送方地址信息应被接收方用于更新邻居缓存表。
- OVR=0:接收方仅在当前条目为 "stale" 状态时更新缓存表。
- 设置规则:
一般情况下,节点会在以下场景下设置 OVR 标志:- 地址信息确实发生变化,需要通知邻居更新。
- 确保邻居缓存条目不会因为错误的消息覆盖有效条目。
ndppd代理和linux kernel发送na
- 如果 net.ipv6.conf.all.forwarding=1,系统内核会自动为启用的接口处理 NS 消息,并发送 NA 消息。
- ndppd 的目的是接管系统内核的部分 NDP 功能,特别是在 Proxy NDP 场景下。如果未正确配置,ndppd 和系统内核可能同时响应同一个 NS 消息,导致发送两条 NA 消息。网络抓包时,可以看到同一接口上对一个 NS 消息发出两条 NA 消息,可能来自内核和 ndppd。两条 NA 消息可能携带不一致的标志(如 Rtr 或 Ovr),或声明的链路层地址不同。
ndppd和linux kernel设置是否发送na
linux kernel控制发送na的参数,比如设置为1的demo如下:
shell
sysctl -w net.ipv6.conf.<interface>.proxy_ndp=1
ndppd的demo:
shell
interface eth1 {
proxy eth0 {
router yes
}
}