《深入解析IPv6(第3版)》——10.2 IPv6端到端的传输过程

本节书摘来自异步社区《深入解析IPv6(第3版)》一书中的第10章,第10.2节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。

10.2 IPv6端到端的传输过程

在下面这一节中,我们将描述发送主机发出IPv6包,经过一个或多个IPv6路由器,并由最终目的接收的过程。在这个示例中,我们假设数据没有出现“逐跳可选项”、“目的可选项”和“路由”扩展头部。

10.2.1 发送方主机的IPv6
当IPv6主机向任意单播目的地址发送数据包时,会使用如下算法。

1.将跳数限制字段值设置为默认值或应用指定值。

2.在目的缓存中查找匹配目的地址的条目。对运行Windows Server 2012、Windows Server 2008 R2、Windows Server 2008、Windows 8、Windows 7和Windows Vista的计算机,可以使用命令netsh interface ipv6 show destinationcache来查看目的缓存。

3.如果在目的缓存中找到了匹配目的地址的一个条目,则在目的缓存中获取下一跳地址和接口。跳到第9步。

4.如果没有数据包的源地址,则执行非约束路由查找。

5.如果有数据包的源地址,且源接口启用了强主机发送行为,则执行约束路由查找。

6.如果有数据包的源地址,且源接口禁用了强主机发送行为,则执行非约束路由查找。

7.如果有最长匹配的可用路由,则通过该路由判断转发数据包的下一跳接口和地址。

如果没有最长匹配的可用路由,提示错误。

8.更新目的缓存。

9.在邻居节点缓存中检查与下一跳地址匹配的条目。对运行Windows Server 2012、Windows Server 2008 R2、Windows Server 2008、Windows 8、Windows 7和Windows Vista的服务器,可以使用netsh interface ipv6 show neighbors命令查看邻居节点缓存。对于运行Windows Server 2012和Windows 8系统的计算机,也可以使用Windows PowerShell命令Get-NetNeighbor来查看邻居节点缓存。

10.如果在邻居节点缓存中找到与下一跳地址匹配的条目,则获得链路层地址。转到第12步。

11.如果在邻居节点缓存中没有找到与下一跳地址匹配的条目,则使用地址解析以获得下一跳地址的链路层地址,并在目的缓存中添加条目。

如果地址解析不成功,提示错误。

12.使用邻居节点缓存条目的链路层地址来发送数据包。

注释

对于分配给发送方主机的单播目的地址,IPv6会跳过第9步到第11步之间的过程。
图10-1所示为发送主机过程。

10.2.2 路由器的IPv6
当接收并转发数据包到任意单播或任播目的地址时,IPv6路由器会执行如下算法。

1.执行可选的头部错误检查,例如确保版本字段设置为6以及源地址不是环回地址(::1)或组播地址。

2.验证IPv6数据包中的目的地址是否对应于分配给路由器接口的地址。

如果是,则将IPv6数据包作为目的主机处理(参阅本章“目的主机的IPv6”小节的第3步)。

3.将跳数限制字段的值减1。

如果跳数限制字段的值小于1,则向发送者发送“ICMPv6超时-超过传输消息中的跳数限制”消息,并丢弃这个数据包。

4.如果跳数限制字段的值大于0,则更新数据包中IPv6头部的跳数限制字段。

5.在目的缓存中查找与目的地址匹配的条目。


《深入解析IPv6(第3版)》——10.2 IPv6端到端的传输过程https://yqfile.alicdn.com/d086ccc585ddc4026737d4a683592658bc6014f1.png" >

如果在目的缓存中找到与目的地址匹配的条目,则从目的缓存条目中获得下一跳接口和地址。转到第9步。

6.检查本地IPv6路由表,选择到达目的IPv6地址最长匹配而又度量最小的可用路由。

7.根据选中的路由确定下一跳地址和用于转发数据包的地址。

如果没有找到路由,则向发送主机发送“ICMPv6目的不可达-没有到达目的地址的路由”消息,并丢弃这个数据包。

8.更新目的缓存。

9.如果接收到数据包的接口与数据包正在被转发的接口相同,同时接口是点到点链路,并且目的地址字段与接口分配的前缀匹配,则向发送主机发送“ICMPv6目的不可达-地址不可达”消息并丢弃这个数据包。这避免了在点到点链路上的两个接口之间毫无意义地来回转发IPv6数据包,这个数据包目的地址与点到点链路的前缀匹配,但是并不匹配其中任何一个接口的地址。

10.如果接收到数据包的接口和数据包正在被转发的接口一样,并且源地址字段与接口分配的前缀匹配,则向发送方主机发送重定向消息。

11.将下一跳接口的链路最大传输单元(MTU)和正在被转发的IPv6数据包的尺寸进行比较。

如果链路MTU小于数据包长度,则向发送主机发送“ICMPv6数据包过大”消息并丢弃数据包。

12.在邻居节点缓存中查找与下一跳地址匹配的条目。

13.如果在邻居节点缓存中找到了与下一跳地址相匹配的条目,则获得链路层地址。转到第15步。

14.如果在邻居节点缓存中没有找到与下一跳地址匹配的条目,则通过地址解析来获得下一跳地址的链路层地址并向邻居节点缓存中添加条目。

如果地址解析失败,则向发送主机发送“ICMPv6目的不可达-地址不可达”消息并丢弃这个数据包。

15.使用邻居节点缓存条目的链路层地址发送数据包。

图10-2和图10-3所示为路由器转发过程。

在源和目的主机之间的每台路由器上都会重复这整个过程。

10.2.3 目的主机的IPv6
当接收到IPv6数据包时,IPv6主机会执行如下算法。

1.执行可选的头部错误检查,例如确保版本字段设置为6以及源地址不是环回地址(::1)或组播地址。

2.验证IPv6数据包中的目的地址是否对应于分配给本地主机接口的IPv6地址。

如果该目的地址没有分配给本地主机接口,则丢弃这个IPv6数据包。

3.如果对于接收的数据包支持强主机模式,则验证接收数据包的接口是否分配了IPv6数据包中的目的地址。如果IPv6数据包中的目的地址没有分配给接收到它的接口,则丢弃这个数据包。

运行Windows Server 2012、Windows Server 2008 R2、Windows Server 2008、Windows 8、Windows 7和Windows Vista的计算机默认支持对于接收IPv6数据包的强主机模型。可以使用netsh interface ipv6 set interface InterfaceNameOrIndex weakhostreceive= enabled命令以启用对于接收IPv6数据包的弱主机模型。对于运行Windows Server 2012或Windows 8系统的计算机,也可以使用Windows PowerShell中的命令Set-NetIPInterface -InterfaceAlias Name -AddressFamily IPv6 -WeakHostReceive enabled来实现这一功能。

4.根据下一个头部字段,来处理扩展头部(如果该数据包带有扩展头部的话)。

5.验证下一个头部字段值的协议是否存在。

如果协议不存在,则向发送者发送回“ICMPv6参数问题-下一个头部类型无法识别”消息并丢弃这个数据包。

6.如果上层协议数据单元(PDU)不是传输控制协议(TCP)段或用户数据报协议(UDP)消息,则将上层PDU传送给相应的协议。

7.如果上层PDU是TCP段或UDP消息,则检查目的端口。

如果该UDP端口号没有对应的应用,则向发送方发送回“ICMPv6目的不可达-端口不可达”消息并丢弃数据包。如果该TCP端口号上没有对应的应用,则向发送方发送TCP连接重置,并丢弃这个数据包。

8.如果在该UDP或TCP目的端口上存在应用,则处理TCP段或UDP消息的内容。


《深入解析IPv6(第3版)》——10.2 IPv6端到端的传输过程


《深入解析IPv6(第3版)》——10.2 IPv6端到端的传输过程


《深入解析IPv6(第3版)》——10.2 IPv6端到端的传输过程
上一篇:UWP-消息提示(仿Android)


下一篇:Synaptics研发端到端加密的指纹传感器