diff --git a/计算机网络实验/IPv6-ICMPv6.md b/计算机网络实验/IPv6-ICMPv6.md index daa2a353..45891a94 100644 --- a/计算机网络实验/IPv6-ICMPv6.md +++ b/计算机网络实验/IPv6-ICMPv6.md @@ -6,6 +6,9 @@ ICMPv6(Internet Control Message Protocol for the IPv6)是IPv6的基础协议 在IPv4中,Internet控制报文协议ICMP(Internet Control Message Protocol)向源节点报告关于向目的地传输IP数据包过程中的错误和信息。它为诊断、信息和管理目的定义了一些消息,如:目的不可达、数据包超长、超时、回应请求和回应应答等。在IPv6中,ICMPv6除了提供ICMPv4常用的功能之外,还是其它一些功能的基础,如邻接点发现、无状态地址配置(包括重复地址检测)、PMTU发现等。 +### 分类 +* 差错报文:报告转发ICMPv6数据报过程中出现差的差错,包括目的不可达、数据报超长、超时、参数问题等。 +* 信息报文:提供诊断功能和附加功能。诊断报文主要包括回送请求报文和回送应答报文。附加功能包括多播侦听发现MLD和邻居发现ND中的使用。 ## 2 ICMPv6报文格式 ICMPv6的协议类型号(即IPv6报文中的Next Header字段的值)为58。ICMPv6的报文格式下图所示: @@ -74,15 +77,54 @@ ICMPv6错误报文用于报告在转发IPv6数据包过程中出现的错误。I * 邻居发现ND: - Type=133 路由器请求 RS(Router Solicitation) - Type=134 路由器公告 RA(Router Advertisement) - Type=135 邻居请求 NS(Neighbor Solicitation) - Type=136 邻居通告 NA(Neighbor Advertisement) - Type=137 重定向(Redirect) + * Type=133 路由器请求 RS(Router Solicitation) + * Type=134 路由器公告 RA(Router Advertisement) + * Type=135 邻居请求 NS(Neighbor Solicitation) + * Type=136 邻居通告 NA(Neighbor Advertisement) + * Type=137 重定向(Redirect) * 多播侦听发现协议MLD: - Type=130 多播听众查询 - Type-131 多播听众报告 - Type=132 多播听众退出 + * Type=130 多播听众查询 + * Type-131 多播听众报告 + * Type=132 多播听众退出 + +## 6 邻居发现ND中的ICMPv6报文 + +### 路由器请求报文RS +路由器不愿意等待下一次周期性的路由器宣告,立即向周围发送路由器请求报文,可以马上得到链路上路由器的配置参数。 + +类型133,Code=0,原地址是发送主机的地址或者未指定地址,目的地址是所有路由器的多播地址FF02::2。字段包括Type、Code、Checksum、Reserved、Options。 + +### 路由器公告报文RA + +路由器周期性地通告它的存在以及配置的链路和网络参数,或者对路由器请求消息做出响应的报文。,包含连接确定、地址配置的前缀、跳数限制等内容。 + +类型134,Code=0,源地址是路由器本地链路地址,目的地址是发送路由器请求节点的地址,或者链路范围内的所有节点多薄地址。 + +* Cur Hop Limit:主机发送普通报文时,使用的默认跳数限制。接受节点只认为跳数限制为255的路由器通告为有效通告。 +* Router LifeTime:发送RA报文的路由器作为默认路由器的生命周期,默认30分钟。 +* Reacheble Time:路由器在接口上通过发送RA报文,让同一链路上的所有节点使用相同的可达保持状态。 +* Retrans Timer:重传NS报文的时间间隔,用于邻居不可达检测和地址解析。 +* Options:含有链路层地址选项、MTU、前缀信息选项、通告间隔选项。8 + +### 邻居请求报文NS + +节点发送邻居请求报文,请求邻居的链路层地址,验证起先前所获得的并保存在缓存中的邻居链路层地址的可达性。或者验证其地址在本地上是否唯一。 + +类型135,Code=0,源地址上发送请求的节点的单播地址,目的地址是被请求节点的多播地址,或者是被确认可达性的节点的单薄地址。 + + +### 邻居通告报文NA + +邻居请求报文的响应。可以主动发出,指示链路层地址的变化。 + +类型136,Code=0,源地址是发送接口的单播地址,目的地址是请求报文的源地址或者所有节点的组播地址FF02::1。 + +* FLAG:R 路由器标记,表示发送者的角色。值为1。 +* FLAG:S 值为1表示对NS的响应 +* FLAG:O 值为1表示对邻居的链路层地址进行覆盖。 + +### 重定向报文 +路由器通过重定向消息,通知主机。对于特定的目的地址,如果不是最佳路由,则通知主机到达目的地址的最佳下一跳。 \ No newline at end of file diff --git a/计算机网络实验/IPv6-OSPFv3.md b/计算机网络实验/IPv6-OSPFv3.md index e69de29b..12c8fd24 100644 --- a/计算机网络实验/IPv6-OSPFv3.md +++ b/计算机网络实验/IPv6-OSPFv3.md @@ -0,0 +1,145 @@ + # IPv6-OSPFv3 + +> 参考文献 +> * [IPV6 OSPFv3](https://blog.csdn.net/weixin_33819479/article/details/85179864) +> * [华为技术文档](https://support.huawei.com/enterprise/zh/doc/EDOC1100055548/4c1815c9) +> * [H3C技术文档](http://www.h3c.com/CN/D_200911/922190_30005_0.htm) + + +## 1 概述 + +OSPFv3主要用于在IPv6网络中提供路由功能,OSPFv3是基于OSPFv2上开发用于IPv6网络的路由协议。而无论是OSPFv2还是OSPFv3在工作机制上基本相同;但为了支持IPv6地址格式,OSPFv3对OSPFv2做了一些改动,下面将介绍OSPFv3与OSPFv2的异同点。 + +OSPFv3与OSPFv2类似也使用组播进行工作,OSPFv3的DR路由器使用众所周知的IPv6组播地址FF02::6这个地址,它类似于IPv4环境中的224.0.0.6;其他的OSPFv3的路由器使用FF02::5这个组播地址,它类似于IPv4环境中的224.0.0.5 + + + +### OSPFv3与OSPFv2相同点: + +OSPFv3协议设计思路和工作机制与OSPFv2基本一致,相同点如下所示: + +* 数据包类型相同:其中包括Hello、DBD(数据库描述)、LSR(链路状态请求)、LSU(链路状态更新)和LSAck(链路状态确定包)。 + +* 区域划分相同:包括骨干区域、一般区域、末节区域、NSSA(次末节区域)和完全末节区域。 + +* 路由器类型相同:包括内部路由器(internalrouter)、骨干路由器(backbone router)、区域边界路由器(area border router)和自治系统边界路由器(autonomoussystem boundary router)。 + +* 使用网络类型相同:包括点到点络网、点到多点网络、多路访问网络、NBMA网络。 + +* 邻居发现和邻接关系形成机制相同:OSPF 路由器启动后,便会通过 OSPF接口向外发送 Hello报文,收到 Hello报文的 OSPF路由器会检查报文中所定义的参数,如果双方一致就会形成邻居关系。 + +* LSA泛洪和同步机制相同:为了保证 LSDB内容的正确性,需要保证 LSA的可靠泛洪和同步。 + +* DR选举机制相同:在 NBMA网络和广播网络中DR和BDR的选举过程相同。 + +* 路由计算方法相同:采用最短路径优先算法(SPF)计算路由。 + + + +### OSPFv3与OSPFv2不同点 + +为适应IPv6运行环境,支持IPv6报文的转发,OSPFv3相对OSPFv2做出相关的改进,使得OSPFv3可以独立于网络层协议,并且其扩展性加强,可以满足未来的需求。其与OSPFv2不同点如下所示: + +* 基于链路的运行 + +* 使用IPv6链路本地地址 + +* 链路支持多实例复用 + +* 通过RouterID唯一标识邻居 + +* 认证的变化 + +* OPSFv3更灵活的处理未知LSA类型 + +* OSPFv3增加了本地链路洪泛扩散的范围 + +* OSPFv3取消了寻址的概念 + + + +### 理解基于链路的运行: + +OSPFv2是基于网络运行的,也就是说两台路由器要形成邻居关系,它们必须在同一个子网。OSPFv3是基于链路运行的,一个链路可以划分为多个IPv6前缀(类似于子网的概念),节点即使不在同一个前缀范围,只要在同一链路上也可以形成邻居关系,这与OSPFv2完全不同,因为在IPv6中一条链路可以属于多个子网。 + + + +### 理解使用IPv6链路本地地址: + +OSPFv3将使用本地链路地址作为报文发送的源地址。一台路由器可以学习到同一链路上相连的所有路由器的本地链路地址,并使用这些本地链路地址作为下一跳来转发报文。但是在虚拟链路连接上,必须使用全球范围地址或者本地站点地址作为OSPFv3协议报文发送的源地址。本地链路地址只在本地链路上有意义且只能在本地链路上泛洪。 + +### 理解链路支持多实例复用: + +在OSPFv3中支持链路多实例复用,所谓链路多实例复用是指:在一条共享型广播链路上可以运行多个OSPF实例(Instance)。比如:如图12.121所示,路由器R1与R2属于同一个OSPF路由域;路由器R3和R4属于另一个OSPF路由域,但是它们连接到同一个广播网络中,共享同一条链路且都能相互建立邻居关系,正常的行为应该让路由器R1与R2建立邻居关系;路由器R3与R4建立邻居关系,因为您总不能让路由器R1和R3或者路由器R2和R4建立邻居吧?因为它们不处于同一个OSPF路由域。当然,在OSPFv2中可以使用OSPF的认证功能来隔离这两个OSPF的路由域,但这并不是一种完美的解决方案,因为OPSF路由器将不断的记录被其他邻居拒绝的OSPF认证失败的数据包。而在OSPFv3链路支持多实例复用是因为在OSPFv3报文头中添加Instance ID字段。如果接口配置的Instance ID与接收的OSPFv3报文的Instance ID不匹配,则丢弃该报文,从而无法建立起邻居关系。 + +### 理解通过Router ID唯一标识邻居: + +   在OPSFv2中,当OSPF运行在广播网络或者NBMA网络上时,OSPFv2的邻居是通过路由器的接口地址进行标识,而其他链路的 OSPFv2的邻居则是通过路由器ID(RID)来表示。在OSPFv3中取消了这种不一致性,所有类型的链路全部通过RID来标识邻居,而且OPSFv3的RID将会作为配置的必须项,在OPSFv2中RID的配置是可选项,在OSPFv3中如果不为路由器配置RID那么OSPFv3将无法启动,会出现如图12.122所示的提示: + + +### 理解认证的变化: + +在OSPFv2中OSPF拥有自己特有的认证方式,这些认证消息被包含在OSPFv2的数据包中。OSPFv3自身不再提供认证功能,而是通过使用IPv6提供的安全机制来保证自身报文的合法性。所以,OSPFv2报文中的认证字段,在OSPFv3报文头中被取消。 + +### 理解OPSFv3更灵活的处理未知LSA类型: + +在OSPFv2上会对未知的LSA作丢弃,在OSPFv3中可以把这些未知的LSA当作本地链路洪泛扩散范围,这类似于这些未知的LSA被识别一样,但是在它们自己的SPF算法中将被忽略,这样做的结果是OSPFv3处理网络的变化比v2更容易。 + +### 理解OSPFv3增加了本地链路洪泛扩散的范围: + +  因为IPv6的本地链路地址有广泛的用途,所以OSPFv3增加了一个本地链路洪泛扩散的范围,新增加的LSA叫做链路LSA,它用来携带单个链路上邻居相关联的信息,这种类型的LSA只在本地链路范围内洪泛,所以它不能超出路由器以外进行扩散。 + +### 理解OSPFv3取消了寻址的概念: + +OSPFv3的路由器LSA和网络LSA不再携带IP地址,这加强了OSPF的扩展性。 + + +## 2 OSPFv3报文 +OSPFv3用IPv6报文直接封装协议报文,协议号为89。OSPFv3分为5种报文:Hello报文、DD报文、LSR报文、LSU报文和LSAck报文。 +![](image/ospfv3报文结构.png) + + | 字段名 | 长度 | 含义 | + |-|-|-|-| +|Version| 8比特 | OSPF的版本号。对于OSPFv3,其值为3。 + | Type | 8比特 | OSPFv3报文的类型:1:Hello报文。2:DD报文。3:LSR报文。4:LSU报文。5:LSAck报文。 + | Packet length | 16比特 | OSPFv3报文的总长度,包括报文头在内,单位为字节。 + | Router ID | 32比特 | 发送该报文的路由器标识。 + | Area ID | 32比特 | 发送该报文的路由器的所属区域。 + | Checksum | 16比特 | 包含除了认证字段的整个报文的校验和。 + | Instance ID | 8比特 | OSPFv3多实例ID。 + | 0 | 8比特 | 预留值。 + + +## 3 LSA格式 + +### LSA 分类 +在AS内的每台路由器,根据路由器的分类产生一种或多种LSA。LSA的集合形成了LSDB(Link-state Database)。OSPFv3中对路由信息的描述都是封装在LSA中发布出去的。常用的LSA包括: + +* Router-LSA(Type1)每个路由器都会产生,描述了路由器的链路状态和花费,在所属的区域内传播。 +* Network-LSA(Type2)由广播网或NBMA网络中的DR产生,Network-LSA中记录了这一网络上所有路由器的Router ID,描述本网段的链路状态,在所属的区域内传播。 +* Inter-Area-Prefix-LSA(Type3)描述区域内某个网段的路由,由ABR产生,并通告给其他相关区域。 +* Inter-Area-Router-LSA(Type4)由ABR产生,描述到ASBR的路由,通告给除ASBR所在区域的其他相关区域。 +* AS-external-LSA(Type5)AS-External-LSA描述到AS外部的路由,由ASBR产生。 +* NSSA LSA(Type7)NSSA-LSA描述到AS外部的路由,由ASBR产生。 +* Link-LSA(Type8)每个路由器都会为每个链路产生一个Link-LSA,描述到此Link上的link-local地址、IPv6前缀地址,并提供将会在Network-LSA中设置的链路选项,它仅在此链路内传播。 +* Intra-Area-Prefix-LSA(Type9)每个路由器及DR都会产生一个或多个此类LSA,在所属的区域内传播。路由器产生的此类LSA,描述与Route-LSA相关联的IPv6前缀地址。DR产生的此类LSA,描述与Network-LSA相关联的IPv6前缀地址。 + +### LSA 格式 + +![](image/ospfv3-lsa-header.png) + +|字段名|长度|含义 +|-|-|-| +|LS age|16比特|LSA产生后所经过的时间,单位是秒。无论LSA是在链路上传输,还是保存在LSDB中,其值都会在不停的增长。 +|LS type|16比特|LSA的类型:Type1:Router-LSA。Type2:Network-LSA。Type3:Inter-Area-Prefix-LSA。Type4:Inter-Area-Router-LSA。Type5:AS-external-LSA。Type7:NSSA-LSA。Type8:Link-LSA。Type9:Intra-Area-Prefix-LSA。 +|Link State ID|32比特|与LS Type一起描述路由域中唯一一个LSA。 +|Advertising Router|32比特|产生此LSA的路由器的Router ID +|LS sequence number|32比特|LSA的序列号。其他路由器根据这个值可以判断哪个LSA是最新的。 +|LS checksum|16比特|除了LS age外其它各域的校验和。 +|Length|16比特|LSA的总长度,包括LSA Header,以字节为单位。 + +### LSA洪泛范围 + +* 链路本地范围:只在本地链路上洪泛,用于Link LSA +* 区域范围:覆盖OSPFv3区域。Router LSA、Network LSA、Inter Area Prefix LSA、Inter Area Router LSA、Intra Prefix LSA +* 自制系统范围:整个路由域。AS External LSA。 \ No newline at end of file diff --git a/计算机网络实验/IPv6.md b/计算机网络实验/IPv6.md index 5aa110b8..517c1ce2 100644 --- a/计算机网络实验/IPv6.md +++ b/计算机网络实验/IPv6.md @@ -23,18 +23,29 @@ IPv4协议是目前广泛部署的因特网协议。在因特网发展初期,I ### 基本术语 +![](image/ipv6概念范围.png) + 1. 节点:运行IPv6的设备,包括路由器和主机。 2. 路由器:一种节点,能够转发数据包。 3. 主机:一种节点,发送或接收数据信息。 4. 上层协议:运行在IPv6上层的其他协议。 5. 局域网段:由单一介质组成,以二层交换机设备为边界。 -6. 链路:多个局域网段,以路由器为边界。 -7. +6. 链路:多个局域网段,以路由器为边界。这里可以简单的理解为ipv4链路层arp能够到达的地方,就属于同一个物理链路。 +7. 子网:使用相同ipv6前缀的一个或多个链路。可以被内部子网路由器划分为很多部分。 +8. 网络:由路由器连接起来的多个子网。 +9. 邻接点:连接到同一个链路上的物理或者逻辑节点。 +10. 链路MTU:链路上的最大传输单元 +11. Path MTU:路径上的最大传输单元。 + + ## 2 IPv6地址 ### IPv6地址的表示方法 + +**首选格式** IPv6地址总长度为128比特,通常分为8组,每组为4个十六进制数的形式,每组十六进制数间用冒号分隔。例如:FC00:0000:130F:0000:0000:09C0:876A:130B,这是IPv6地址的首选格式。 +**压缩格式** 为了书写方便,IPv6还提供了压缩格式,以上述IPv6地址为例,具体压缩规则为: * 每组中的前导“0”都可以省略,所以上述地址可写为:FC00:0:130F:0:0:9C0:876A:130B。 @@ -42,6 +53,10 @@ IPv6地址总长度为128比特,通常分为8组,每组为4个十六进制 * 需要注意的是,在一个IPv6地址中只能使用一次双冒号“::”,否则当计算机将压缩后的地址恢复成128位时,无法确定每个“::”代表0的个数。 +**内嵌格式** +内嵌IPv4地址的IPv6地址: +0:0:0:0:0:0:192.168.1.2 + ### IPv6地址的结构: 一个IPv6地址可以分为如下两部分: @@ -90,9 +105,11 @@ Subnet ID:子网ID。组织机构可以用子网ID来构建本地网络(Site Interface ID:接口标识。用来标识一个设备(Host)。 -* 链路本地地址 +* 链路本地地址link local address -链路本地地址是IPv6中的应用范围受限制的地址类型,只能在连接到同一本地链路的节点之间使用。它使用了特定的本地链路前缀FE80::/10(最高10位值为1111111010),同时将接口标识添加在后面作为地址的低64比特。 +链路本地地址是IPv6中的应用范围受限制的地址类型,只能在连接到同一本地链路的节点之间使用。它使用了特定的本地链路前缀FE80::/10(最高10位值为1111111010),同时将接口标识添加在后面作为地址的低64比特。无法穿过路由器,在ipv4中arp广播能够到达的范围就属于同同一个链路,即链路层的地址,不需要经过路由器转发,处于同一个广播域。 + +为何需要link-local?在一个接口可以配置很多IPv6地址,所以学习路由就有可能出现很多下一跳。所以出现Link Local地址唯一标识一个节点。在本地链路看到下一跳都是对端的Link Local地址。在网络重新编址过程中,节点和路由器的Link Local地址不会发生变化,可以很容易地做一个修改,不用担心网络不可达。 当一个节点启动IPv6协议栈时,启动时节点的每个接口会自动配置一个链路本地地址(其固定的前缀+EUI-64规则形成的接口标识)。这种机制使得两个连接到同一链路的IPv6节点不需要做任何配置就可以通信。所以链路本地地址广泛应用于邻居发现,无状态地址配置等应用。 @@ -100,9 +117,9 @@ Interface ID:接口标识。用来标识一个设备(Host)。 ![](image/IPv6链路本地地址.png) -* 唯一本地地址 +* 唯一本地地址(站点本地地址)site local address -唯一本地地址是另一种应用范围受限的地址,它仅能在一个站点内使用。由于本地站点地址的废除(RFC3879),唯一本地地址被用来代替本地站点地址。 +唯一本地地址是另一种应用范围受限的地址,它仅能在一个站点内使用。由于本地站点地址的废除(RFC3879),唯一本地地址被用来代替本地站点地址。可以穿越路由器,进行局域网内的路由。 唯一本地地址的作用类似于IPv4中的私网地址,任何没有申请到提供商分配的全球单播地址的组织机构都可以使用唯一本地地址。唯一本地地址只能在本地网络内部被路由转发而不会在全球网络中被路由转发。唯一本地地址格式如下如所示: @@ -138,9 +155,17 @@ IPv6的组播与IPv4相同,用来标识一组接口,一般这些接口属于 * IPv6组播地址格式如下图: ![IPv6组播地址格式](image/IPv6组播地址格式.png) +**常见组播地址前缀** + +* FF01::1:本地接口范围内所有节点 +* FF01::2:本地借口范围的所有路由器 +* FF02::1:本地链路范围内的所有节点 +* FF02::2:本地链路范围内的所有路由器 **被请求节点组播地址**: +被请求节点即一个可能会发出组播数据的单播节点。 + 被请求节点组播地址通过节点的单播或任播地址生成。当一个节点具有了单播或任播地址,就会对应生成一个被请求节点组播地址,并且加入这个组播组。一个单播地址或任播地址对应一个被请求节点组播地址。该地址主要用于邻居发现机制和地址重复检测功能。 IPv6中没有广播地址,也不使用ARP。但是仍然需要从IP地址解析到MAC地址的功能。在IPv6中,这个功能通过邻居请求NS(Neighbor Solicitation)报文完成。当一个节点需要解析某个IPv6地址对应的MAC地址时,会发送NS报文,该报文的目的IP就是需要解析的IPv6地址对应的被请求节点组播地址;只有具有该组播地址的节点会检查处理。 @@ -164,6 +189,38 @@ IPv6中没有为任播规定单独的地址空间,任播地址和单播地址 ![子网路由器任播地址](image/IPv6子网路由器任播地址.png) +### 主机上的IPv6地址 +接口上的地址 +* 每个接口的线路本地地址 +* 每个接口的全球地址 +* 回环接口的回环地址::1 + +接口上监听的地址 + +* 本地接口范围内所有节点的组播地址FF01::1 +* 本地链路范围内所有节点的组播地址FF02::1 +* 被请求节点的组播地址 +* 组播组地址(如果加入了组播组) + +### 路由器上的IPv6地址 + +接口上的单点地址 +* 每个接口上的链路本地地址 +* 每个接口上的全球地址 +* 子网-路由器任播地址 +* 其他任播地址 +* 回环接口的回环地址 + +接口上坚挺的地址 + +* 本地接口范围内的所有节点组播地址 +* 本地接口范围内的所有路由器组播地址 +* 本地链路防伪捏的所有节点组播地址 +* 本地链路范围内的所有路由器组播地址 +* 站点本地范围内所有的路由器组播地址 +* 被请求节点的组播地址 +* 组播组地址 + ## 3 IPv6报文格式 IPv6报文由IPv6基本报头、IPv6扩展报头以及上层协议数据单元三部分组成。 diff --git a/计算机网络实验/image/ipv6概念范围.png b/计算机网络实验/image/ipv6概念范围.png new file mode 100644 index 00000000..2206f53c Binary files /dev/null and b/计算机网络实验/image/ipv6概念范围.png differ diff --git a/计算机网络实验/image/ospfv3-lsa-header.png b/计算机网络实验/image/ospfv3-lsa-header.png new file mode 100644 index 00000000..dcccdb04 Binary files /dev/null and b/计算机网络实验/image/ospfv3-lsa-header.png differ diff --git a/计算机网络实验/image/ospfv3报文结构.png b/计算机网络实验/image/ospfv3报文结构.png new file mode 100644 index 00000000..f4d9810b Binary files /dev/null and b/计算机网络实验/image/ospfv3报文结构.png differ