第五章 协议标准
节点必须允许系统管理为每个有多播能力的接口配置下面这个与自动配置有关的变量:
节点配置变量 --> DupAddrDetectTransmits
当在临时地址上执行 Duplicate Address Detection 时, 发送的连续 Neighbor Solicitation 消息数目. 值为 0 表示没有在临时地址上执行 Duplicate Address Detection. 值为 1 表示仅发送一次, 没有后续重复发送.
默认值: 1, 但是可由介绍在特定链路类型上 IP 发送相关问题的文件 ([RFC-2464]) 中规定的链路类型特定值取代.
自动配置也假设存在如 [RFC-4861] 定义的变量 RetransTimer. 出于自动配置考虑, RetransTimer 规定在 Duplicate Address Detection 期间执行的连续 Neighbor Solicitation 发送间的延迟(如果 DupAddrDetectTransmits 大于 1), 以及发送最后一个 NeighborSolicitation 之后, 结束 Duplicate Address Detection 处理之前, 节点等待时间.
与自动配置有关的结构
主机将地址列表和这些地址对应的生存期放在一起维护. 地址列表既包括自动配置的地址, 也包括手工配置的地址.
链路本地地址生成
一旦开启接口, 节点就形成链路本地地址. 接口在下述任何事件之后可以变为开启状态:
-- 系统启动时接口被初始化.
-- 接口暂时出故障后或接口被系统管理临时关闭后接口被重新初始化.
-- 接口第一次附着到链路. 包括由于无线网络访问点的改变导致动态改变节点所附着的链路.
-- 在被管理上关闭之后系统管理又开启接口.
链路本地地址由 (适当长度的) 熟知链路本地前缀 (well-known link-local prefix)FE80::0[RFC-4291]和下述接口标识符的组合形成:
-- 地址最左边那些 "前缀长度" 比特是链路本地前缀比特.
-- 地址中到链路本地前缀右边的比特被设置为全 0.
-- 如果接口标识符长度为 N 比特, 地址最右边 N 比特被接口标识符取代.
注意, 链路本地地址有无限的优先生存期和合法生存期; 它绝不会超时.
重复地址检测
重复地址检测 (Duplicate Address Detection) 必须在所有单播地址上执行, 是在这些地址被分配到接口前执行, 无论这些地址是通过无状态自动配置, DHCPv6, 或手工配置获得的, 但有下述例外:
-- 如果接口的 DupAddrDetectTransmits 变量被设置为 0, 不执行 Duplicate Address Detection.
-- 必须不在任播地址上执行 Duplicate Address Detection (注意, 在语义上任播地址与单播地
址区分不开).
检测重复地址的程序使用 Neighbor Solicitation 和 Neighbor Advertisement 消息, 如下面所述. 如果在程序执行过程中发现重复地址, 不能分配该地址给接口. 如果地址是从接口标识符推演出的, 需要分配新的标识符给那个地址, 或者那个接口的所有 IP 地址需要手工配置. 注意, 检测重复的方法不完全可靠, 可能仍然存在重复地址(例如, 如果在执行 Duplicate Address Detection 时链路被分割).
在其上运行 Duplicate Address Detection 程序的地址被认为是临时的, 直到检测程序成功完成. 传统观念不考虑将临时地址 "分配给接口". 即, 接口必须接收 Neighbor Solicitation 和 Neighbor Advertisement 消息, 这些消息包括 Target Address 字段中的临时地址, 但是处理这样的分组不同于处理其 Target Address 匹配分配给接口的地址的分组. 其他寻址到临时地址的分组应当被静默抛弃. 注意,"其他分组" 包括这样的 Neighbor Solicitation 和 Neighbor Advertisement 消息, 这些消息用临时 (即, 单播) 地址作 IP 目的地地址, 以及在 Target Address
字段包含临时地址. 正常运行中这种情况不应发生, 因为在 Duplicate Address Detection 程序
中这些消息是多播发送的.
Duplicate Address Detection 必须在分配地址到接口之前进行, 以便阻止多个节点同时使用相同地址. 如果节点在执行 Duplicate Address Detection 的同时, 同步开始使用地址, 并且另一个节点已经在使用该地址, 执行 Duplicate Address Detection 的节点将错误地处理预定给其他节点的流量.
如 果 在 已 经 发 送 DupAddrDetectTransmits Neighbor Solicitations 后的 RetransTimer 毫秒内, 这些测试中没有
一个指出存在重复地址, 认为地址是唯一的. 一旦认定地址是唯一的, 该地址可以分配给接口.
消息合法性
节点必须静默抛弃任何没有通过 RFC4681 中规定的合法性检验的 NS,NA 消息. 通过这些合法性校验的 NS 或 NA 消息分别称为合法请求或合法通告.
发送邻居请求消息 NS
在发送 ns 消息前, 接口必须加入 all-nodes 多播地址和临时地址的 solicited-node 多播地址. 前者用来保证能接收到已经使用该地址的其他节点的 NA 消息; 后者保证企图使用同一地址的两个节点能够检测到彼此的存在.
为了检测地址, 节点发送 DupAddrDetectTransmits NS 消息, 每次发送相隔 RetransTimer 毫秒. 该请求的 Target Address 被设置为正在被检测的地址, IP 源地址被设置为未指定地址, IP 目的地址被设置为目标地址的 solicited-nodes 多播地址.
如果 Neighbor Solicitation 是接口 (重新) 初始化后将要从该接口发出的第一个消息, 节点应当延迟一个随机时间加入 solicited-nodes 多播地址, 延迟时间范围按照 [RFC-4861] 规定, 在 0 和 MAX_RTR_SOLICITATION_DELAY 之间. 当链路上同一时刻有许多节点启动时, 例如电源故障之后, 这一举措有助于缓和拥塞. 并且当同一时刻不止一个节点尝试请求相同地址时这一举措有助于避免出现竞争.
即使 Neighbor Solicitation 不是将要发出的第一个消息, 如果正在被检测的地址由发送到多播地址的路由器通告消息配置, 节点也应当延迟一个随机时间加入 solicited-nodes 多播地址, 延迟时间范围在 0 和 MAX_RTR_SOLICITATION_DELAY 之间. 当多个节点将要通过接收相同单个多播路由器通告来配置地址时, 此延迟将避免类似拥塞.
与 Multicast Listener Discovery (MLD)汇报消息相关, 暂不研究.(以后再研究参考 RFC 2710 3810).
接收邻居请求消息 NS
一旦在接口上收到合法邻居请求 (Neighbor Solicitation) 消息, 节点行为取决于在任何情况下目标地址是 tentative 临时地址. 如果目标地址不是临时地址(即, 目标地址被分配给接收接口), 按照 RFC-4861 的规定对请求进行处理. 如果目标地址是临时地址, 并且源地址是单播地址, 该请求应当被静默忽略(这是请求发送者在对目标执行地址解析). 否则, 做如下处理. 在所有情况, 节点必须不响应临时地址的 NS 消息.
来源: http://www.bubuko.com/infodetail-2559264.html