IPv6的邻居发现技术( 二 )


纺康牡鼗捍妫阂蛔橛泄刈罱盏绞萘鞯哪康牡亟诘惚硐睢D康牡鼗捍姘ā霸诹?on-link)和“非连接(off-link)目的地,并在其中提供一定程度的间接寻址 。目的地缓存能把目的地IP地址映射成下一跳邻居的IP地址,该缓存通过重定向消息进行信息更新 。如果在目的地缓存表项中存储与邻居发现没有直接关系的附加信息,例如路径MTU(PMTU)以及由传输协议设定的往返时间,则执行时会更加方便 。
非白毫斜恚汗娑ㄒ蛔椤霸诹?on-link)地址的前缀组成的列表 。前缀列表表项产生于路由器通告接收到的信息 。每一个表项都有一个相关的失效计时器值(由通告信息确定),它用于在前缀失效时废弃这些前缀 。除非在后续通告中收到了一个新的(有限)值,否则特殊的“无限计时器值规定前缀永久有效 。本地链路(1ink-local)前缀位于带有无限失效计时器的前缀列表,而不管路由器是否正在向其通告前缀 。接收的路由器通告不应该修改本地链路前缀的失效计时器 。
啡笔÷酚善髁斜恚航邮帐莅穆酚善髁斜怼B酚善髁斜淼谋硐钪赶蛄诰踊捍嬷械南嘤Φ谋硐睢H笔÷酚善鞯难≡袼惴ㄊ牵貉≡衲切┮阎纱锏穆酚善鳎谎≡窨纱镄曰共蝗范ǖ穆酚善鳌C恳桓霰硐罨褂幸桓鱿喙氐氖Ъ剖逼髦?从路由器通告信息中得到),它的作用是删除不再通告的表项 。
上述数据结构可以用不同的方法实现 。其中一种实现方法是对所有数据结构使用单个最长匹配路由表 。不管采用哪种特定的实现方法,为了防止重复性的邻居不可达检测,路由器的邻居缓存表项可以由使用该路由器的所有目的地缓存表项共享 。
邻居缓存包含有邻居不可达检测算法维护的信息 。邻居可达性状态是最关键的信息,它的取值是下列的5个值之一 。
凡煌暾?INCOMPLETE):正在进行地址解析,邻居的链路层地址还没确定 。
房纱镄?REACHABLE):邻居在最近处于可达状态(在小于10s以前) 。
肥?STALE):在数据流发送给该邻居以前邻居是不可达的,并无法验证其可达性 。
费映?DELAY):邻居不再是可达的,同时数据流在最近已经发送给邻居,但不立即对该邻居进行探测,而在一个短时延后发送探测信息,这样就可以为上层协议提供可达性确认 。
诽讲?PROBE):邻居不再是可达的,同时发送单播邻居请求探测以验证可达性 。
4、数据包的发送算法
节点向目的地发送数据包时,使用目的地缓存、前缀列表、默认路由器列表确定合适的下一跳的IP地址,然后路由器查询邻居缓存确定邻居的链路层地址 。
IPv6单播地址的下一跳确定操作如下:发送者使用前缀列表中的前缀进行最长前缀匹配,确定包的目的地是在连接的还是非连接的 。如果下一跳是在连接的,下一跳地址就和目的地地址相同,否则发送者从默认路由器列表中选择下一跳 。如果默认路由器列表为空,则发送者认为目的地是在连接的 。
下一跳确定的信息存储在目的地缓存中,下一个包可以使用这些信息 。当路由器发送包时,首先检查目的地缓存,如果目的地缓存没有相关信息存在,就激活下一跳确定过程 。
在学习到下一跳路由器的IPv6地址后,发送者检查邻居缓存以决定链路层地址 。如果没有下一跳IPv6地址的表项存在,路由器的工作如下:
反唇ㄒ桓鲂卤硐睿⑸柚闷渥刺煌耆?
房冀械刂方馕觥?
范源偷陌信哦印?
当地址解析结束时,获得链路层地址,存储在邻居缓存中 。此时表项到达新的可达状态,排队的包能够传送 。
对于组播包,下一跳总是认为在连接,确定组播IPv6地址的链路层地址取决于链路类型 。当邻居缓存开始传送单播包时,发送者根据邻居不可达检测算法检测相关的可达性信息,验证邻居的可达性 。当邻居不可达时,再次执行下一跳确定,验证到达目的地的另一条路径是否是可达的 。

推荐阅读