大家好,又见面了,我是全栈君。
本节书摘来自异步社区《深入解析IPv6(第3版)》一书中的第10章,第10.1节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。
第10章 IPv6路由选择
在完成本章的学习之后,读者应该能够完成以下任务:
- 描述IPv6路由表的内容;
- 解释端到端的IPv6数据包的传输过程;
- 理解IPv6网络中使用的动态路由选择和路由协议;
- 描述Windows中IPv6支持的路由选择协议。
10.1 IPv6中的路由选择
与IPv4类似,典型的IPv6节点也会使用本地IPv6路由表来判断如何转发数据包。在初始化时,IPv6会自动创建默认路由表条目,它会根据静态配置,或者基于接收到的包含链路上前缀及路由的“路由器通告”消息,或者使用IPv6动态主机配置协议(DHCPv6)来添加条目。
运行Windows Server 2012、Windows Server 2008 R2、Windows Server 2008、Windows 8、Windows 7和Windows Vista系统的IPv6协议的所有节点都有一个路由表。路由表中存储了有关IPv6地址前缀和如何到达它们(直接或者间接)的信息。在检查IPv6路由表之前,IPv6会在目的缓存中查找与正在转发的IPv6数据包中目的地址相匹配的条目。如果目的缓存中没有对应目的地址的条目,IPv6就会使用路由表来判断如下信息。
下一跳地址:对于直接传送(即目的地址在本地链路上的情形),下一跳地址就是数据包IPv6头部中的目的地址。对于间接传送(即目的地址不在本地链路上的情形),下一跳地址通常是邻居路由器的链路本地地址。
用于转发的接口(下一跳接口):下一跳接口标识了用于向目的(直接传送)或邻居路由器(间接传送)转发数据包的物理或逻辑接口。
在IPv6确定了下一跳地址和接口之后,就会在目的缓存中添加一个条目。如果路由表的内容没有改变,IPv6就会对去往该目的地址的后续数据包使用目的缓存中的条目进行转发,而不再查看路由表。
10.1.1 IPv6路由表条目类型
IPv6路由表条目通常会存储如下类型的路由。
直连子网或网络路由:直连子网或地址前缀的路由。子网路由的前缀长度是64位。网络路由对一些单播地址空间进行了汇总,其前缀长度小于64位。
远程子网或网络路由:非直连子网或地址前缀,但可以通过邻居路由器到达的路由。远程子网路由的前缀长度是64位。远程网络对一些IPv6地址空间进行了汇总,其前缀长度小于64位。例如远程网络路由fd9c:31f1:2a59::/48,这是聚集了某个机构站点内所有地址空间的唯一本地地址前缀的路由。
主机路由:到达特定IPv6地址的路由。主机路由允许针对每个具体的IPv6地址进行路由转发。对于主机路由,地址前缀是一个128位前缀长度的特定IPv6地址。
默认路由:该路由是对所有IPv6流量的汇总,当无法找到更精确的主机、子网或网络路由时,就会使用这个默认路由。默认路由地址前缀是::/0。
10.1.2 路由判断过程
为了判断使用路由表中的哪个条目来执行转发,IPv6路由器会执行如下过程。
1.对于路由表中的每个条目,将路由地址前缀中的位与目的地址中同样的位作比较,需要比较的位的个数已在路由的前缀长度指定。按照路由前缀长度指定的位数,如果地址前缀的所有位都与目的IPv6地址的所有位匹配,则该路由与目的相匹配。
2.编译匹配路由的列表,选择可用而且有前缀长度最长的路由,即与目的地址匹配了最多位数的路由。这个最长匹配路由就是到达目的的最确切路由。如果存在多个最长匹配路由(例如,到达同一个远程网络前缀的多个路由),则选择度量(metric)最小的路由。如果存在多个最长匹配和度量值最小的可用路由,IPv6则可以选择使用其中任意一个条目。RFC 4191描述了在多个匹配路由并且最小度量相同时,IPv6如何进行选择。
注释
这个过程与IPv4路由器用来判断最近匹配路由是同样的过程。
对任意给定目的地址,这个过程会按下述次序寻找匹配的路由。
1.匹配目的地址的主机路由(所有128位都匹配)。
2.匹配目的地址的子网路由(前64位匹配)。
3.拥有与目的地址最长匹配的前缀的网络路由(前n位匹配,n小于64)。
4.默认路由(地址前缀::/0)。
路由判断过程会在路由表中选择一条路由。选中的路由会产生一个下一跳地址和接口。如果路由判断过程无法在某个路由器上找到路由,IPv6就会向发送方主机发送一条ICMPv6目的不可达-无到达目的的消息,并丢弃该数据包。相反,如果发送方主机的路由判断过程没有找到路由,则IPv6就会声明出现了一个错误。
10.1.3 强主机行为和弱主机行为
在弱主机模式下,IPv6主机可以在没有分配要发送的数据包的源IPv6地址的接口上发送数据包。这就是弱主机发送行为。IPv6主机也可以在没有分配要接收的数据包的目的IP地址的接口上接收包。这就是弱主机接收行为。
在强主机模式下,发送和接收行为是不一样的。在强主机发送中,只有当一个接口上分配了要发送的数据包的源IPv6地址,主机才能在该接口上发送数据包。在强主机接收中,只有当一个接口上分配了要接收的数据包的目的IP地址,主机才能在该接口上接收数据包。
对于准备发送的包,IPv6会首先检查其是否已指定源地址。如果没有,IPv6则会在路由表中对目的地址进行非约束查找。在非约束查找中,路由表中的所有路由都会被考虑在内。接下来,IPv6会根据为该目的地址选中的路由来确定下一跳接口(用于把包放到链路层的接口)和下一跳地址。然后,根据下一跳接口,IPv6会视需要使用(RFC 3484定义的)地址选择过程来判断最佳的源地址。此时,IPv6就具备了发送数据包所需要的一切:源和目的地址、下一跳接口以及下一跳地址。
如果指定了源地址,则也就知道了源接口。源接口分配到了源地址。然后,IPv6会判断该源接口上是否启用了强主机发送。如果禁用了强主机发送,那么IPv6就会在路由表中对数据包的目的地址进行非约束查找。然后,IPv6会根据目的的最佳匹配路由判断出下一跳接口和下一跳地址。这样,IPv6就有了源和目的地址、下一跳接口以及下一跳地址。注意,当源接口上禁用了强主机发送行为时,下一跳接口可能和源接口不同。
如果源接口上启用了强主机发送,IPv6就会在路由表中对数据包的目的地址进行约束查找。在约束查找中,IPv6只会考虑那些拥有源接口的下一跳接口的路由。接下来,IPv6会根据为目的选中的路由判断出下一跳地址。这样,IPv6就有了源和目的地址、下一跳接口和下一跳地址。注意,当源接口上启用了强主机发送行为时,下一跳接口总是和源接口一样。若源地址已指定,则约束查找会选择一个和目的最匹配的、在路由表的众多路由器中有较高度量的路由。
运行Windows Server 2012、Windows Server 2008 R2、Windows Server 2008、Windows 8、Windows 7和Windows Vista的计算机默认为发送IPv6包支持强主机模式。可以使用下述命令为发送IPv6包启用弱主机模式:netsh interface ipv6 set interface Interface NameOrIndex weakhostsend=enabled。对于运行Windows Server 2012或Windows 8的主机,也可以在Windows PowerShell命令行中使用命令Set-NetIPInterface -InterfaceAlias Name -Address Family IPv6 -WeakHostSend来启用弱主机模式。
10.1.4 Windows Server 2008和Windows Vista的IPv6路由表示例
可使用下列命令,来查看运行Window系统的计算机的IPv6路由表:
- Get-NetRoute(Windows Server 2012或Windows 8);
- netsh interface ipv6 show route(命令提示符);
- route print(命令提示符)。
- Get-NetRoute命令
下面是在一台运行Windows Server 2012的计算机上使用命令the Get-NetRoute –AddressFamily__IPv6 之后的显示示例:
ifIndex RouteMetric DestinationPrefix NextHop Store
------- ----------- ----------------- ------- -----
12 256 ff00::/8 :: Active
1 256 ff00::/8 :: Active
12 256 fe80::c51d:624b:b276:6a03/128 :: Active
12 256 fe80::/64 :: Active
12 256 2001:db8::1:82e:9636:809e:2472/128 :: Active
12 256 2001:db8::/64 :: Active
1 256 ::1/128 :: Active
在路由表中通过路由条目判断下一跳地址时,会执行以下行为。
如果路由表条目的下一跳字段为::,那么目的就是一台邻居设备,因而下一跳地址就会被设置为IPv6数据包的目的地址。
如果下一跳字段是一个地址(一台邻居路由器的地址),那么目的设备就在远端,下一跳地址就会被设置为下一跳字段中的那个地址。
无论是哪种情形,下一跳接口都是路由InterfaceAlias(接口别名)或InterfaceIndex(接口索引)字段的接口。
netsh interface ipv6 show route命令
下面是在一台运行Windows 7的计算机上使用命令netsh interface ipv6 show route之后的显示示例。该主机所在的子网有一台默认路由器,正在通告前缀2001:db8:21d0:3f48::/64和fd5e:2aa9: b3e:3f48::/64。
Publish Type Met Prefix Idx Gateway/Interface Name
------- -------- --- ------------------------ --- ------------------------
No Manual 256 ::/0 8 fe80::69ee:7d26:3:fbec
No Manual 256 ::1/128 1 Loopback Pseudo-Interface 1
No Manual 8 2001:db8:21d0:3f48::/64 8 Local Area Connection
No Manual 256 2001:db8:21d0:3f48:1b9:88d1:cf98:fcaf/128
8 Local Area Connection
No Manual 256 2001:db8:21d0:3f48:b500:734b:fe5b:3945/128
8 Local Area Connection
No Manual 8 fd5e:2aa9:b3e:3f48::/64 8 Local Area Connection
No Manual 256 fd5e:2aa9:b3e:3f48:1b9:88d1:cf98:fcaf/128
8 Local Area Connection
No Manual 256 fd5e:2aa9:b3e:3f48:b500:734b:fe5b:3945/128
8 Local Area Connection
No Manual 256 fe80::/64 10 Teredo Tunneling Pseudo-Interface
No Manual 256 fe80::/64 8 Local Area Connection
No Manual 256 fe80::100:7f:fffe/128 10 Teredo Tunneling Pseudo-Interface
No Manual 256 fe80::5efe:10.0.0.2/128 11 isatap.example.com
No Manual 256 fe80::b500:734b:fe5b:3945/128 8 Local Area Connection
No Manual 256 ff00::/8 1 Loopback Pseudo-Interface 1
No Manual 256 ff00::/8 10 Teredo Tunneling Pseudo-Interface
No Manual 256 ff00::/8 8 Local Area Connection
netsh interface ipv6 show route命令显示的IPv6路由表包含以下内容。
Publish(发布):该路由是否已发布(在路由通告消息中通告)。
Type(类型):路由的来源。
Met(度量):路由的优先级。最低度量的路由最优。这是用于在相同前缀的多个路由中进行选择的度量。
Prefix(前缀):路由的地址前缀。 – Idx(索引):路由中的接口索引,表示与地址前缀相匹配的数据包通过该接口可达。管理员可以使用命令netsh interface ipv6 show来查看接口索引。
Gateway/Interface Name(网关/接口名称):下一跳IPv6地址(远程路由)或Idx列表示的接口所对应的接口名称(直连路由)。
表10-1罗列出了上述示例所显示的路由,以及对每个路由的描述。
在路由表中判断从某路由出发的下一跳地址时,会发生下述情形。
如果路由表条目的网关/接口名称列中有接口名称,那么目的就是一台邻居设备,因而下一跳地址就会被设置为IPv6数据包的目的地址。
如果路由表条目的网关/接口名称列中有接口地址(邻居路由器的地址),那么目的设备就在远端,下一跳地址就会设置为网关/接口名称列中的那个地址。
无论是哪种情形,下一跳接口都是路由Idx列的接口。
例如,当此IPv6主机发送一个数据包到2001:db8:21d0:3f48:2aa:ff:fe90:4d3c,最长匹配路由是直连子网路由2001:db8:21d0:3f48::/64。因此下一跳地址就会被设置为目的地址2001:db8:21d0: 3f48:dd48:ab34:d07c:3914(目的),下一跳接口是对应接口索引8(名为Local Area Connection[本地区域连接]以太网网络适配器)的接口。当IPv6主机向地址2001:db8:21d0:a957: 2aa:ff:fe03:21a6发送流量时,最长匹配路由是默认路由(::/0)。下一跳地址设置为路由器地址fe80::69ee: 7d26:3:fbec,下一跳接口是对应接口索引8(本地区域连接)的接口。
route print命令
下面是在同一台运行Windows 7的主机(已删除IPv4的那部分路由表)上输入route print命令所显示的内容。
C:\Windows\system32>route print
===========================================================================
Interface List
8 ...00 12 3f 17 e0 cf ...... Broadcom NetXtreme 57xx Gigabit Controller
1 ........................... Software Loopback Interface 1
11 ...00 00 00 00 00 00 00 e0 isatap.{17940FE6-D6C7-4AF3-8B79-8BC68D192EB4}
10 ...02 00 54 55 4e 01 ...... Teredo Tunneling Pseudo-Interface
===========================================================================
Table
===========================================================================
Active Routes:
If Metric Network Destination Gateway
8 286 ::/0 fe80::69ee:7d26:3:fbec
1 306 ::1/128 On-link
8 38 2001:db8:21d0:3f48::/64 On-link
8 286 2001:db8:21d0:3f48:1b9:88d1:cf98:fcaf/128
On-link
8 286 2001:db8:21d0:3f48:b500:734b:fe5b:3945/128
On-link
8 38 fd5e:2aa9:b3e:3f48::/64 On-link
8 286 fd5e:2aa9:b3e:3f48:1b9:88d1:cf98:fcaf/128
On-link
8 286 fd5e:2aa9:b3e:3f48:b500:734b:fe5b:3945/128
On-link
8 286 fe80::/64 On-link
11 296 fe80::5efe:10.0.0.2/128 On-link
8 286 fe80::b500:734b:fe5b:3945/128
On-link
1 306 ff00::/8 On-link
8 286 ff00::/8 On-link
===========================================================================
Persistent Routes:
None
rouet print命令显示的IPv6路由表包含以下内容。
If:路由的接口索引:命令route print显示的Interface List(接口列表)部分中会列出接口索引。
Metric(度量):路由的优先级。最低度量的路由最优。这是用于在相同前缀的多个路由中进行选择的度量。
Network Destination(网络目的):路由的地址前缀。
Gateway(网关):下一跳IPv6地址(远程路由)或表示目的在链路上(直连路由)。
表10-2罗列出了上述示例所显示的路由,以及对每个路由的描述。
https://yqfile.alicdn.com/f85555562846ee2f007f9452902b37478f24eca3.png” >
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108533.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...