IPv6的邻居发现技术Word文档下载推荐.docx
《IPv6的邻居发现技术Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《IPv6的邻居发现技术Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
对于特定的目的地址,如果不是最佳的路由,则通知主机到达目的地的最佳下一跳。
3、主机的数据结构
IPv6的一个设计要求是:
即使在一个有限的网络内,主机也必须正确工作,而不像路由器不能储存路由表,不能有永久的配置,因此主机必须能自动配置,必须能学到交换数据的有关目的地的最小信息。
这些信息储存的存储器叫做缓存,这些数据结构是一系列记录的排列,称作表项。
每个表项储存的信息有一定的有效期,需要周期性地清除缓存中的表项,以保证缓存的空间大小。
主机需要为每一接口维护以下信息。
·
邻居缓存:
一组有关单个邻居的表项,这些邻居接收到了最新的数据流。
表项是连接单播地址的关键,它包括的信息有:
其链路层地址、指示邻居是路由器还是主机的标志、指向任何排队等待完成地址解析数据包的指针等。
邻居缓存表项还包括由邻居不达检测算法所使用的信息,如可达状态、探测无应答的次数以及下一次邻居不达检测发生的时间。
目的地缓存:
一组有关最近收到数据流的目的地节点表项。
目的地缓存包括“在连接(on-link)”和“非连接(off-link)”目的地,并在其中提供一定程度的间接寻址。
目的地缓存能把目的地IP地址映射成下一跳邻居的IP地址,该缓存通过重定向消息进行信息更新。
如果在目的地缓存表项中存储与邻居发现没有直接关系的附加信息,例如路径MTU(PMTU)以及由传输协议设定的往返时间,则执行时会更加方便
·
前缀列表:
规定一组“在连接(on-link)”地址的前缀组成的列表。
前缀列表表项产生于路由器通告接收到的信息。
每一个表项都有一个相关的失效计时器值(由通告信息确定),它用于在前缀失效时废弃这些前缀。
除非在后续通告中收到了一个新的(有限)值,否则特殊的“无限”计时器值规定前缀永久有效。
本地链路(1ink-local)前缀位于带有无限失效计时器的前缀列表,而不管路由器是否正在向其通告前缀。
接收的路由器通告不应该修改本地链路前缀的失效计时器。
缺省路由器列表:
接收数据包的路由器列表。
路由器列表的表项指向邻居缓存中的相应的表项。
缺省路由器的选择算法是:
选择那些已知可达的路由器,而不选择可达性还不确定的路由器。
每一个表项还有一个相关的失效计时器值(从路由器通告信息中得到),它的作用是删除不再通告的表项。
上述数据结构可以用不同的方法实现。
其中一种实现方法是对所有数据结构使用单个最长匹配路由表。
不管采用哪种特定的实现方法,为了防止重复性的邻居不可达检测,路由器的邻居缓存表项可以由使用该路由器的所有目的地缓存表项共享。
邻居缓存包含有邻居不可达检测算法维护的信息。
邻居可达性状态是最关键的信息,它的取值是下列的5个值之一。
不完整性(INCOMPLETE):
正在进行地址解析,邻居的链路层地址还没确定。
可达性(REACHABLE):
邻居在最近处于可达状态(在小于10s以前)。
失效性(STALE):
在数据流发送给该邻居以前邻居是不可达的,并无法验证其可达性。
延迟(DELAY):
邻居不再是可达的,同时数据流在最近已经发送给邻居,但不立即对该邻居进行探测,而在一个短时延后发送探测信息,这样就可以为上层协议提供可达性确认。
探测(PROBE):
邻居不再是可达的,同时发送单播邻居请求探测以验证可达性。
4、数据包的发送算法
节点向目的地发送数据包时,使用目的地缓存、前缀列表、默认路由器列表确定合适的下一跳的IP地址,然后路由器查询邻居缓存确定邻居的链路层地址。
IPv6单播地址的下一跳确定操作如下:
发送者使用前缀列表中的前缀进行最长前缀匹配,确定包的目的地是在连接的还是非连接的。
如果下一跳是在连接的,下一跳地址就和目的地地址相同,否则发送者从默认路由器列表中选择下一跳。
如果默认路由器列表为空,则发送者认为目的地是在连接的。
下一跳确定的信息存储在目的地缓存中,下一个包可以使用这些信息。
当路由器发送包时,首先检查目的地缓存,如果目的地缓存没有相关信息存在,就激活下一跳确定过程。
在学习到下一跳路由器的IPv6地址后,发送者检查邻居缓存以决定链路层地址。
如果没有下一跳IPv6地址的表项存在,路由器的工作如下:
创建一个新表项,并设置其状态为不完全。
开始进行地址解析。
对传送的包进行排队。
当地址解析结束时,获得链路层地址,存储在邻居缓存中。
此时表项到达新的可达状态,排队的包能够传送。
对于组播包,下一跳总是认为在连接,确定组播IPv6地址的链路层地址取决于链路类型。
当邻居缓存开始传送单播包时,发送者根据邻居不可达检测算法检测相关的可达性信息,验证邻居的可达性。
当邻居不可达时,再次执行下一跳确定,验证到达目的地的另一条路径是否是可达的。
如果知道了下一跳节点的IP地址,发送方就检查邻居缓存中有关邻居的链路层信息。
如果没有表项存在,发送方就创建一条,并设置其状态为“不完整性”,同时启动地址解析,然后对没有完成地址解析的数据包进行排队。
对具有组播功能的接口来说,地址解析的过程是发送一个邻居请求信息,以及等待一个邻居通告。
当收到一个邻居通告应答时,链路层地址被表项在邻居缓存中,同时发送排队的数据包。
在传输单播数据包期间每次读取邻居发现缓存的表项,发送方根据邻居不可达性检测的算法检查邻居不可达性检测的相关信息,但不可达性检测会使发送方发出单播邻居请求,以验证该邻居还是可达的。
数据流第一次送往目的地时就执行下一跳确定的操作,随后该目的地如果仍能正常通信,目的地缓存的表项就可以继续使用。
如果邻居不可达算法决定在某一点终止通信,则需要重新执行下一跳确定,例如故障路由器的流量应该切换到正常工作的路由器,流向移动节点的数据流可能要重新路由到“移动代理”。
当节点重做下一跳确定时,不需要丢弃整个目的地缓存的表项,其中PMTU和往返计时器值的信息是很有用的。
5、邻居发现协议的功能
(1)路由器和前缀发现
路由器必须无条件丢弃不满足有效性检查的路由器请求和路由器通告消息。
路由器发现功能用来标识与给定链路相连的路由器,并获取与地址自动配置相关的前缀和配置参数。
作为对请求消息的响应,路由器应周期地发送组播路由器通告消息,来通告链路上节点的可达性。
每个主机从链路上相连的路由器上接收路由器通告消息,并建立默认路由器列表(当到达目的地的路径不可知时所使用的路由器)。
如果路由器很频繁地产生路由器通告消息,那么主机就能在几分钟内学习到路由器的存在,否则就要使用邻居不可达检测。
路由器通告消息应包含用来确定在连接可达性的前缀列表。
主机通过使用从路由器通告消息中提取的前缀,来确定目的地是否在连接,能否直接可达,或者是否非连接,还是仅通过一个路由器就可达。
目的地是在连接的,但这个目的地没有被路由器通告消息学到的前缀覆盖,在这种情况下,主机认为目的地是非连接的,路由器发送重定向消息给发送者。
路由器通告消息应包含一些标志位,这些标志位通知主机怎样执行地址的自动配置,例如路由器能指定主机是使用有状态地址配置还是无状态地址配置。
另外,路由器通告消息中还应包含简化网络集中管理的参数,例如主机产生的数据包中使用的跳数限制参数的缺省值,或链路MTU值。
当主机向路由器发出路由器请求消息时,路由器应立刻发送路由器通告消息,通过这种方式能加速节点的配置过程。
(2)地址解析
IPv6节点通过邻居请求和邻居通告消息将IPv6地址解析成链路层地址,对组播地址不执行地址解析。
节点通过组播邻居请求消息来激活地址解析过程,邻居请求消息用来请求目标路由器返回它的链路层地址。
源路由器在邻居请求消息中包含了它的链路层地址,并将邻居请求消息组播到与目标地址相关的请求节点组播地址,目标路由器在单播的邻居通告消息中返回它的链路层地址。
这一对消息使源和目标路由器能解析出相互的链路层地址。
(3)重定向功能
当包必须发送到一个非连接的目的地时,需要选择转发包的路由器。
当选择的路由器作为消息传送的下一跳并不是最好的下一跳时,路由器需产生重定向消息,通知源节点到达目的地存在一个更佳的下一跳路由器。
路由器必须能够确定每个邻居路由器的本地链路(1ink-local)地址,以保证重定向消息里的目标地址根据本地链路地址来识别邻居路由器。
在源端没有正确应答重定向消息,或者源端选择忽略没有被验证的重定向消息的情况下,为了节省频带和处理的费用,路由器必须限定发送重定向消息的速率。
在收到重定向消息时,路由器不能更新路由表。
(4)邻居不可达检测
任何时候通过邻居或到达邻居的通信,会因各种原因而中断,包括硬件故障、接口卡的热插入等。
如果目的地失效,则恢复是不可能的,通信失败;
如果路径失效,则恢复是可能的。
因此节点应该主动跟踪数据包发向邻居的可达性状态。
主机与邻居节点之间所有路径都应进行邻居不可达性检测,包括主机到主机、主机到路由器以及路由器到主机之间的通信,也可用于路由器之间,以检测邻居或邻居前向路径发生的故障。
如果路由器最近收到确认,邻居的IP层已经收到最近发送到它的数据包,那么该邻居是可达的。
邻居不可达检测使用两种方法进行确认:
一种是从上层协议来的提示,提供“连接正在处理”的确认;
另一种是路由器发送单播邻居请求消息,收到了应答的邻居通告消息。
为了减少不必要的网络流量,探测消息仅发送到邻居。
邻居不可达性检测与向邻居发送数据包同时进行。
在邻居可达性确认期间,路由器继续向缓存链路层地址的邻居发送数据包;
如果没有数据包发向邻居,则不发送检测。
6、邻居发现协议与ARP的比较
邻居发现协议比IPv4协议的相应部分在许多方面有了更大的改善。
在IPv4中,由IP层到链路层地址的解析(ARP)是基于链路层的广播机制来实现的,数据包由LLC网桥进行转发,在一个比较大的站点范围内会占用大量的带宽,有时还会引起“广播风暴”。
而在IPv6中,这一过程是基于IP层的组播机制实现的,这样,在地址解析的过程中受到地址解析发送包影响的节点数大大减少,而且非IPv6节点根本不受影响。
另外,IPv6的邻居发现协议中路由器通告消息会带着自己的链路层地址,还会带着本地链路的前缀,从而避免了每个节点配置自己的子网掩码。
IPv4的ARP是不安全的,无法保证回应ARP探测消息的节点是需要的节点,这样会导致发往一个节点的数据包被另一个节点窃听到。
而邻居发现协议运行在IPv6之上,它属于网络层协议,它的安全性可由IPv6的安全性来保证。
IPv4的ARP运行在数据链路层,不同的网络介质需要有不同的ARP协议,例如Ethernet
ARP与FDDI
ARP就不完全相同。
而邻居发现协议运行在网络层,与介质无关,任何网络媒介都可以运行相同的邻居发现协议。
与IPv4协议不同,通过邻居发现协议得到的各种地址信息都有一定的生存期,这些生存期由这些信息的发送者规定。
路由器能够通知主机如何执行地址配置,例如路由器能指示主机是使用状态地址配置还是使用无状态地址配置。
路由器能够通告链路的最大传输单元信息(MTU),以使同一链路上的所有节点使用相同的MTU值。
对于无状态地址自动配置来说,邻居发现协议能够提供主机进行无状态地址自动配置所需要的全部信息。
在IPv4到IPv6的早期过渡阶段,所有实现IPv6的节点都应该被配制成一种双栈结构。
双栈结构使节点能够与IPv4保持兼容,因此现存的IPv4协议层应该被一种既支持IPv4又支持IPv6的协议层所取代,而且TCP和UDP层应该被升级支持IPv6。
支持两个版本的IP协议的最大困难在于同时处理两种不同结构的地址,邻居发现中的邻居自动发现功能可以很容易地处理这种功能。
7、结束语
自从IETF在1998年12月制定了邻居发现协议的标准文本RFC2461后,邻居发现就成为IPv6节点使用的重要协议,它解决了连接在同一条链路上的所有节点之间的互操作问题。
虽然目前IPv6的标准已经比较稳定,国内外厂商研制的相关产品和设备也已经成熟,但由于IPv6技术在我国的市场需求还不是很明朗,因此IPv6技术在我国还处于试验网的实践和运行阶段。
随着IPv6网络应用商业化进程的加快,邻居发现协议的使用将会越来越广泛。
IPv6Link-localAddress的作用
链路本地地址是IPv6新有的概念,IPv4中没有相应功能的地址,这类地址以1111111010开头,即前缀为FE80:
:
/10,后面54位元目前全部置0,因此此类地址的实际前缀是FE80:
/64。
链路本地地址的使用范围与以太网MAC地址类似,只能在链路范围内通信使用,任何3层设备不得转发含有该地址的IPv6包。
虽然链路本地地址的使用范围与MAC相同,但是它是一个IPv6地址,是一个3层的概念,而MAC是2层的概念,这是链路本地地址与以太网MAC地址的最大区别。
链路本地地址的作用主要是在链路范围内对节点进行网络管理(保证管理信息不会泄漏到别的链路),IGP路由协议也大量使用该类地址(路由信息也是逐链路传递的)。
在RFC2460规定,此类位址不需要手工配置,只需要安装IPv6协议,就可以自动生成一个链路本地地址。
可以预见链路本地地址在实现IPv6的即插即用过程中将大有所用。
IPv6link-localaddress计算方法
每个执行IPv6的接口都会有一个地址称为link-local地址,也就是您常常看到以FE80开头的那个IPv6地址。
这个地址其实是由两个部分所组成的:
a.FE80:
/64(Prefix)b.IPv6interfaceidentifier
接下来让我们先来看看怎么将48位(6bytes)的EthernetMAC地址转成64位的IPv6interfaceidentifier。
[Step1]
将十六进制值0xFF-FE插入以太网络MAC地址的中间,也就是第三字节与第四字节中间。
[Step2]
将原来以太网络MAC地址用来识别Universal或Local的那个位做补码(complement)的动作,也就是将从左边数过来第一个byte的倒数第二个bit的值complement,原来的值如果是一的则变成零,原来是零的则变成一。
有看没有懂吗?
?
举个例子来说好了。
假设有一个Ethernet的MACAddress是00-58-07-48-F5-D6。
将"
FF-FE"
插入第三和第四个byte中间,也就是插入"
07"
和"
48"
的中间,结果会变成"
00-58-07-FF-FE-48-F5-D6"
。
将第一个Byte的倒数第二个bitcomplement,也就是将"
00"
这个byte由左到右的倒数第二个bit从原来的"
0"
转成"
1"
,再转回原来的十六进制制,则原来的"
此时会变为"
02"
。
所以
7654321(x)0
将x的地方做complement
所以原来的MAC地址00-58-07-48-F5-D6经过我们的处理后会变成02-58-07-FF-FE-48-F5-D6的IPv6interfaceidentifier。
最后,我们只需要把FE80:
/64的prefix加在我们所算出来的IPv6interfaceidentifier前面即可。
所以该以太网络适配器的IPv6link-local地址FE80:
258:
07FF:
FE48:
F5D6。
IPv6地址类型
在RFC2373中指定了几种IPv6类型的寻址方案(IPv6寻址结构)。
IPv6地址是接口和接口集的128位标识符。
RFC2373为IPv6定义了多种地址格式,IPv6地址大致分为以下几类:
表
H-1
单播
单一接口的地址。
发送到单播地址的数据包被送到由该地址标识的接口。
任意播送
一组接口的地址。
大多数情况下,这些接口属于不同的节点。
发送到任意播送地址的数据包被送到由该地址标识的其中一个接口。
由于使用任意播送地址的标准尚在不断完善中,所以目前HP-UX不支持任意播送。
多播
一组接口的地址(通常分属不同节点)。
发送到多播地址的数据包被送到由该地址标识的每个接口。
与IPv4不同,在IPv6中没有广播地址,因为这一功能已被多播功能代替。
IPv6地址的文本表示
有三种常规格式可用于以文本字符串形式表示IPv6地址:
∙第一种形式是x:
x:
x,其中,“x”是十六进制数值,分别对应于128位地址中的八个16位区段。
例如:
2001:
fecd:
ba23:
cd1f:
dcb1:
1010:
9234:
4088
∙一些IPv6地址可能包含一长串零位。
为了便于以文本方式描述这种地址,制定了一种特殊的语法。
“:
”的使用表示有多组16位零。
”只能在一个地址中出现一次,可用于压缩一个地址中的前导、末尾或相邻的16位零。
fec0:
1:
0:
1234可以表示为fec0:
1234
∙当处理拥有IPv4和IPv6节点的混合环境时,可以使用IPv6地址的另一种形式。
即x:
d.d.d.d,其中,“x”是IPv6地址的96位高位顺序字节的十六进制值,“d”是32位低位顺序字节的十进制值。
通常,“映射IPv4的IPv6地址”以及“兼容IPv4的IPv6地址”可以采用这种表示法表示。
这两种地址将在后面的章节中讨论。
10.1.2.3
以及
10.11.3.123
IPv6地址前缀
IPv6地址前缀与IPv4中的CIDR相似,并写入CIDR表示法中。
IPv6地址前缀由该表示法表示为:
IPv6地址/前缀长度其中,“IPv6地址”是用上面任意一种表示法表示的IPv6地址,“前缀长度”是一个十进制值,表示前缀由多少个最左侧相邻位构成。
1234/64。
地址的前64位“fec0:
1”构成了地址的前缀。
在IPv6地址中,地址前缀用于表示IPv6地址中有多少位表示子网。
单播地址
IPv6单播地址分为多种类型,分别是全局可聚集单播地址、站点本地地址以及链路本地地址。
通常,单播地址在逻辑上分为如下几种:
H-2
无标题
(单播地址)
n位
128-n位
子网前缀
接口ID
IPv6单播地址中的接口标识符用于在链路中标识接口。
接口标识符在该链路中必须是唯一的。
链路通常由子网前缀标识。
如果一个单播地址的所有位均为零,那么该地址称为未指定的地址。
以文本形式表示为“:
”。
单播地址“:
1”或“0:
1”称为环回地址。
节点向自己发送数据包时采用环回地址。
IPv4和IPv6的兼容性
可以通过很多技术在IPv6地址框架内使用IPv4地址。
兼容IPv4的IPv6地址
IPv6转换机制使用一项技术以隧道操作方式在现有的IPv4结构上传输IPv6数据包。
支持这种机制的IPv6节点使用一种特殊的IPv6地址,这种地址通过其低位顺序的32位携带IPv4地址。
因此,这种地址称为“兼容IPv4的IPv6地址”,表示如下:
H-3
(兼容IPv4的IPv6地址)
80位
16位
32位
零
0000
IPv4地址
192.168.0.1
映射IPv4的IPv6地址
有一种特殊类型的IPv6地址,其中包含嵌入的IPv4地址。
可以采用这种地址将只支持IPv4的节点的地址表示为IPv6地址。
该地址特别适用于既支持IPv6又支持IPv4的应用程序。
因此,这种地址称为“映射IPv4的IPv6地址”,表示如下:
H-4
无标