1 IPV6概述
1.1 为什么发明IPV6?
- IPV4数量有限(2^32个),已经在2010年分配耗尽,需要想办法解决这问题
- 虽然后续使用NAT(包括后来的CG-NAT技术),暂时解决了这个问题,但是使用NAT难以做到真正的“端到端”通信,限制科技的发展和通信的速度(假如使用NAT穿透的话,也会影响效率)
- 且使用端到端通信也意味着需要很多的IP地址
- 综上主要原因就发明了IPV6
1.2 IPV6的特点
- 128bit,IP空间大(IPV4才32bit)
- 多等级层次有助于路由,提高因特网网络路由的效率和扩展性
- IPV6地址可以自动配置,更加便捷(无状态&有状态自动配置)
- 无状态:通过RS和RA和NS报文实现(作用类似:ARP request/reply/free后面会细说)
- 有状态:DHCPV6
- 无需NAT
注:意味着可以实现真正的端到端通信,同时也加快了设备通信的效率
- 不再使用广播和ARP技术
- IPV6中只有单播、组播、任波,不存在广播的形式,同时使用ICMP的RS/RA/NS代替ARP的request/reply/free
- 广播的弊端:只要三层设备能收到广播报文,则都要解封装数据链路层和网络层之后才能判断报文是否是发给自己的,这种行为会对设备的CPU造成负担;所以在IPV6中,很多时候是用组播来代替广播行使功能,因为较之广播,组播的目的MAC是根据组播的目的IP映射而成的,很多时候一个组播的目的IP对应一个协议进程(如OSPF为FF02::5),而接收设备可以根据自身对应接收该组播目的MAC的协议程序是否有开启来判断是否能处理这个报文,也就是说可以在解封装数据链路层时就可以报文是不是发给自己处理的,加快了设备处理报文的速率;
- ARP技术的:ARP技术实现了网络地址转换,这类技术在网络中是必不可少的,只是由于ARP技术依赖于广播同时自身安全性也不高,所以IPV6使用ICMPV6这个技术来取代他,行使相同的功能
- IPV6包头相比IPV4更少,对于设备来说处理更快,同时扩展性又更好‘
注:后面会详细介绍报文内容
- 更加有效的支持可移动性和安全性
2 IPV6报文
- 保留的字段
- Version
IPV6版本号- Source Address
IPV6地址- Destination Address
IPV6地址
- 取消的字段(取消原因)
- Head Checksum
第二层和第三层网络已经足够健壮,所以取消了验证- Options
ICMPV6中使用新的头部来行使拓展性功能,而放弃使用TLV的形式;扩展头中还有赫赫有名的IPsec头(AH/ESP头)来实现安全支持,可以为上层协议省去安全认证功能(如OSPFV3)
- Frame Offset+Identification
使用PMTU技术来发从源头发现中间节点的MTU,从而使用最小的MTU来发送报文,防止报文在中间节点被再分片,影响中间节点的设备工作效率;如果真的需要分片,也可以在扩展包头中来实现分片的一些字段的功能
- 名字位置变化
- Traffic Class:对应ToS(Type of Service)
- Payload Length:对应Total Length
- Next Header:对应Protocal行使索引的功能
- Hop Limit:对应TTL
- 新增字段
- Flow Label:增加QoS的效率
3 IPV6地址
3.1 IPV6编址方式
3.2 IPV6地址分类
注:
- 单播地址(Unicast Address)
标识一个接口,目的地址为单播地址的报文会被送到被标识的接口- 组播地址(Multicast Address)
标识多个接口,目的地址为组播地址的报文会被送到被标识的所有接口- 任播地址(Anycast Address)
标识多个接口,目的为任播地址的报文会被送到最近的一个被标识接口,最近节点是由路由协议来定义的- IPV6没有定义广播地址
以上的地址类型太多了,不方便对比记忆,所以我们省去了部分地址结合与IPv4的比较,来方便读者理解和记忆
3.2.1 单播-可聚合全球地址
- 地址说明
类比于IPV4公网IP,也就是说该地址前面48位固定不变,可以使用的子网数量就有2^16,每个子网可使用的IP地址数量就有2 ^64- 可聚合全球地址的范围
2000:0000:0000:0000:0000:0000:0000:0000到
3FFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF
由此看出,可聚合全球单播地址占IPV6总地址空间的1/8
3.2.2 单播-本地链路地址
注:接口ID在3.2.6会详细接收获取和配置的方法,这里不赘述
从上面地址的组成结构也能看出,其实链路本地地址内的设备都处于一个“网段”,因为前64bit的网络位都是相同的,自然可以进行通信;
本地链路地址仅在本地有效的情况
- 情况一、通过交换机连接的设备
- 情况二、通过路由器连接的设备
3.2.3 单播-私有本地地址
- 类比于IPV4之中的内网IP地址,为了实现公网和内网之间的隔离,保证内部设备不被外部访问,只实现内部互访的需求;
注:该类地址取代了单播中的本地站点地址(Site-Local Address)
3.2.4 组播-基本组播地址
注:“FF02”开头的这类IPv6组播地址,从“2”可以看出是“链路本地范围”的组播地址,也就是说需要同网段的设备才可以接收,所以自然源IP地址是“链路本地地址”
- 组播MAC映射的目的?
为了让接收到组播的设备更快判断是否是发给自己的报文(只需要解封装数据链路层就知道了)
3.2.5 组播-被请求节点地址
3.2.6 接口标识(接口ID)
上面地址组成中很多都涉及到一个东西——接口ID,啥是接口ID呢?
- 为什么电脑系统使用自动产生的方式来生成接口ID而不使用EUI-64的方式来生成?
因为使用EUI-64生成的IPV6地址(比如链路本地地址),作为源IPv6地址的话,很容易反向推理出设备接口的MAC地址,这对于设备来说存在安全风险,所以选择自动生成的方式来产生接口ID
4 ICMPv6基本
4.1.1 ICMPv6基础
-
ICMPv6是IPv6中的最基础的协议之一
-
ICMPv6的“Next-Header”字段中的协议号为58,写作16进制为3A
-
ICMPv6有两种的消息类型,差错消息和信息消息
4.1.2 ICMPv6报文结构即分类
- 对于收到ICMP报文之后,如果出现差错则本地会返回相应的差错ICMPv6报文给发送方,来提示出现差错的类型
- 注意在返回的ICMPv6的差错报文中还会携带接收到的差错报文的包头来告诉发送方是哪个报文出现的问题,拿20举例:
比较常见的差错类型:
- 10:设备收到报文之后,发现没有目的IPv6地址所在的网段的路由条目
- 11:设备收到报文之后,发现存在ACL来限制到目的IP的访问
- 13:设备收到报文之后,发现存在目的IPv6地址所在的网段的路由条目,但是不可达
- 20:沿途设备收到报文之后,发现需要转发报文的接口的IPv6 MTU值小于报文的容量,则会返回该提示,其中也包含了自身转发接口的MTU的数值,这也是获取PMTU的方法
- 30:沿途设备收到报文之后,发现“Hop Limit”字段已经为0,此时就会返回该提示,可以逐渐增大“Hop Limit”的数值来做到获取沿途所有的设备的IP地址的目的(类似TraceRoute用TTL字段来获取沿途设备的IP地址的方法)
5 ICMPv6的应用
5.1 PMTU(Path Maximum Transmission Unit)
设计PMTU的目的
源设备通过特殊方法获取沿途设备转发报文出接口的MTU大小,从而将报文按沿途设备中最小的MTU进行分片发送给目的设备,从而防止了分片过大的情况下沿途转发设备也需要分片的情况,可以让沿途设备更加高效的执行报文的转发功能,减轻沿途设备的负担;PMTU的特性
单向性——在需要获取PMTU的情况下,只需要获取转发出接口的MTU,类似COST的特性
被动性——并不是所有报文都会让源设备获取到沿途设备的所有MTU,如果源设备发送的报文的容量很小,根本触发不了沿途设备的ICMP差错消息门槛,则自然源设备也就获取不到这个设备的转发接口的MTU,不过这也说明设备发送的报文容量已经足够小不会让沿途设备再次分片,所以也不需要获取PMTU了;获取PMTU的本质
通过ICMPv6的差错消息类报文的20来获取沿途PMTU获取PMTU的过程
综上看出PMTU的触发过程是被动触发的,当A收到一个MTU大于自己转发出接口的数据报时,会触发PMTU机制,给上游发送ICMPv6的通告报文,来进行数据报的MTU调整,从而防止了中间段分片的发生;
5.2 NDP(Neighbor Discovery Protocol)邻居发现协议
设计目的:
替代ARP实现其获取邻居的接口MAC地址的功能,用邻居表代替ARP表,并且在此基础上提高了安全性和效率;过程
注:以下使用的源IPv6地址是“可聚合全球单播地址”,不过并不代表只能使用这个源IP地址
详细状态切换
(注意:在刚刚发送NS报文的时候,类似于发送ARP request,也会在本地生成一个incomplete的表项)
综上:ICMPv6跟踪邻居状态的目的是为了根据数据流更新缓存表项,以及清除部分不常使用表项;来做到缓存条目的动态更新;报文详情
为什么没有像ARP一样设置Sender和Tatrget对,只有目的IP和源MAC?
因为ARP协议不存在三层,所以需要设置这些对来实现数据承载;而NS报文是三层的协议,本身就存在IP层,所以不需要额外的载荷来承载这些数据;而需要承载源MAC是因为可能存在中继等设备使得源MAC出现变化;
5.3 DAD(Duplicate Address Detect)重复地址检测
设计目的:代替免费ARP实现重复地址检测的功能
DAD机制使用ICMPv6的NS即NA消息实现
具体机制:
■ 当一个IPv6接口激活之后,或者当一个接口获得IPv6地址(无论是有状态或是无状态自动配置),都会启动IPv6地址的DAD机制,以确定该地址在链路上的唯一性;
■ 接口的IPv6地址在通过DAD之前称为“tentative地址”也即试验性地址。接口还暂时不能使用这个试验性地址进行正常的单播通讯,除非该IPv6地址通过DAD检测;
■ 节点向一个自己将使用的tentative地址所对应的Solicited-Node组播地址发送一个NS
如果收到了其他站点回应的NA,就证明该地址已经被使用,节点将不能使用该teneative地址通讯;
如果段时间没有收到NA回应,就自己发送NA,来宣告正式使用该地址;和IPv4联系
IPv4在接口配置地址之后也会启动ARP free来侦听链路中是否有其他的设备配置了相同的IPv4地址,如果收到回复则说明地址重复具体过程
■ 发现NS报文的目的IP地址是使用的被请求节点组播地址,目的MAC也是在此之上使用的映射组播MAC,可以在其他非该IP设备收到之后更快的丢弃报文,比ARP的组播更加高效;
■ 发现NS报文的源IP地址是使用的"::",因为此时还没有正式使用接口的单播ip,所以用这个填充;
■ NA报文的目的IP和MAC还是组播MAC,不过区别于发送的DAD报文,因为R2还没有正式使用接口的单播IPv6地址,所以R1只能用全路径都能收到的FF02::1组播地址;
5.4 无状态自动配置
- 概况
基本介绍
■ IPv6 Address Stateless AutoConfiguration
■ 在RFC2462中定义,是IPv6最有吸引力和最有用的新特性之一
■ 即插即用,IPv6地址无需手动配置
■ 主机、网络设备均可以支持过程详解(理论)
■ 主机网卡激活之后会自动生成一个IPv6的本地链路地址,此时会对这个地址先进行第一轮的DAD监测其可用性,如果通过则进入下一步;
■ 主机网卡发送组播(FF02::1)的RS报文请求获取前缀信息;
■ 配置了IPv6接口的设备会单播回复一个单播RA报文,内含自身前缀信息(自身单播IPv6地址的前64位);
■ 主机利用获取的前缀信息(64位)加上生成的接口ID(后64位)组成新IPv6单播地址;
■ 在使用新地址前也需要进行DAD检测其可用性,如果通过则进入下一步;
■ 无状态自动配置过程完成过程详解(实际)
■ 配置IPv6接口的设备周期性发送RA报文,内含自身前缀信息;
■ 还未配置IPv6单播地址的网卡在收到报文之后,会根据其内部前缀信息生成IPv6单播地址
■ 经过DAD
■ 无状态自动配置过程完成一些配置说明
R9(config-if)#ipv6 nd suppress-ra
R9(config-if)#no ipv6 nd suppress-ra
以上两条配置的区别在于,前者会主动周期性自动发送RA信息,而后者不会;不过两者收到RS报文之后都会回复RA信息;
- 报文分析
Cur hop limit
表示主机在经过该RA报文成功配置IPv6单播地址之后,发送的报文的IPv6网络层的hop Limit字段的数值为64Flags_M
当M位置零时(默认),表示接收设备不可以发送DHCPv6报文请求地址信息,只能使用该报文的前缀来自动生成IPv6单播地址
当M位置一时,表示接收设备可以发送DHCPv6报文请求地址信息Flags_O
当O位置零时(默认),表示接收设备不可以通过DHCPv6来获取其他的网络信息
当O位置一时,表示接收设备可以通过DHCPv6来获取其他的网络信息
Flag
■ On-link
置一,表示接收设备经过无状态配置得到的IP地址本地可达
置零,反之
■ Autonomous address-configuration
置一,表示接收设备不可以使用该前缀来进行无状态自动配置
置零,反之Valid Lifetime + preferred Lifetime
6 ICMPv6小结
6.1 ICMPv6和ARP的对比
-
报文内容对比
注:在下面的ICMPv6协议中的 源IP地址,可以是 私有本地地址 / 可聚合全球地址 / 本地链路地址 -
结合ARP的来理解效果更佳,对于ICMPv6 NS而言
在请求邻居的MAC时,源IP地址都是出接口的IP地址
在宣告自己要使用一个接口IP地址之前,源IP地址都是“::”
协议类型 | 详细类型 | 源IP | 目的IP | 源MAC | 目的MAC | 载荷信息 |
---|---|---|---|---|---|---|
ARP | Request | - | - | 出接口MAC | 全F | ![]() |
ICMPv6 | NS | 出接口IP | 被请求节点组播IP(网关IP或者目的IP转换而来) | 出接口MAC | 组播IP映射的组播MAC | Target Address:目的IP(网关IP) Link-Layer Address:出接口MAC(可能不是源接口) |
ARP | Reply | - | - | 出接口MAC | 单播MAC | ![]() |
ICMPv6 | NA | 出接口IP | 单播IP | 出接口MAC | 单播MAC | Target Address:目的IP(网关IP) Link-Layer Address:出接口MAC(可能不是源接口) |
ARP | Free(Request) | - | - | 出接口MAC | 全F | ![]() |
ICMPv6 | NS | ::(该符号表示地址全0) | 配置IP对应被请求节点组播IP | 出接口MAC | 组播IP映射的组播MAC | Target Address:出接口IP Link-Layer Address:出接口MAC |
ARP | Free(Reply) | - | - | 出接口MAC | 目的MAC | ![]() |
ICMPv6 | NA | 出接口IP | FF02::1 | 出接口MAC | 组播IP映射的组播MAC | Target Address:目的IP Link-Layer Address:出接口MAC |
- 表项创建更新机制对比
ARP表
报文类型 | 更新ARP表条件 |
---|---|
免费ARP | ①ARP表中已经存在报文中对应的target ip(sender ip)的表项 |
ARP_request | ①Target_IP为自己 |
ARP_reply | ①Target_IP为自己 ②ARP表中已经存在Sender的表项 |
ICMPv6的邻居表
接收方和发送方更新方式不同,发送方更新方式为绿色,接收方为橙色
- 思考?
1 为什么在已知目的IP的情况下,仍然要用被请求组播地址来作为NS报文目的IP?(就是取代ARP Request 报文的NS报文)
答:主要原因——达到二三层的统一性,因为二层封装缺少目的MAC,而IPv6系统不使用广播所以只能使用组播,所以IP也要用组播;而为了尽量加快接收到报文的设备对报文的判断效率,所以需要使用特殊的组播MAC,而特殊的组播MAC就需要使用特殊的组播IP来做映射,这个组播IP就是被请求节点的组播IP;
6.2 自动配置的分类
- 优势分析
■ 自动配置较手动配置更加便捷和高效
■ 无状态自动配置较有状态自动配置更简单,同时不需要对设备的性能做要求
■ 有状态自动配置由于使用DHCPv6,所以需要设备支持DHCPv6以及DHCP中继等,所以对设备的性能有要求,但是分配信息更加可视化也更容易管控
6.3 命令总结
- 设备即端口开启IPv6功能
R12(config)#ipv6 unicast-routing
R12(config-if)#ipv6 enable
- 查看状态的切换和报文收发
R12#debug ipv6 icmp
R12#debug ipv6 nd
//查看邻居状态切换
- RA-计时器设置
R12(config-if)#no ipv6 nd suppress-ra
//不开启ra报文抑制
R12(config-if)#ipv6 nd ra-interval
//ra报文发送间隔设置
- 接口通过RA配置IP
R12(config-if)#ipv6 address autoconfig default
//加上default可以将发送RA的路由器IP作为默认路由下一跳ip
- RS-flags字段设置
R12(config-if)#ipv6 nd managed-config-flag
//M位置1
R12(config-if)#ipv6 nd other-config-flag
//O位置1
- RS-flag字段设置
R12(config-if)#ipv6 nd prefix 2012::/64 20 10 off-link
//off-link置位
R12(config-if)#ipv6 nd prefix 2012::/64 20 10 no-autoconfig
//no-autoconfig置位
输入数字左到右依次为:前缀和掩码,valid时间,preferred时间
- 其他大部分命令和
ipv4
类似,只是在需要输入ip
的地方改为ipv6
即可
7 DHCPv6
- DHCP基础配置
- DHCP-PD
8 思考
1、IPv6增加链路本地地址的原因?为什么OSPFv3等协议使用链路本地地址作为源地址?
2、IPv6增加被请求节点地址的原因?为什么NS Request已近知道了目的IP地址,还是用被请求节点地址?
3、IPv6删除广播的原因?为什么取消ARP?
4、ICMPv6跟踪邻居状态的目的?
5、无状态自动获取和DHCPv6结合的方法?
6、为什么没有像ARP一样设置Sender和Tatrget对,只有目的IP和源MAC?
1、用于在没有配置 私有本地地址/可聚合全球地址 的情况下,用这个地址通过 无状态自动获取 的办法获取需要使用的地址,以及在未配置真实地址下的邻居的发现,和路由的发现;OSPFv3,使用本地链路地址作为源地址,减少了配置的复杂性,不需要手动配置IP地址再开启协议;同时,也是一种转发层和控制层IP的分离,也更方便IP管理;同时,使用链路本地地址,就意味着是个局部性的概念,可以控制OSPFv3的启用范围;
2、一种组播地址,用于在NS Request中作为目的IPv6地址使用,可以快速帮助接收设备判断是否是发送给自己的报文,较广播效率更高占用资源更少;因为,需要做到二层和三层地址的映射统一,既然二层的目的MAC未知,如果三层使用明确的单播地址,二层目的MAC将不好操作,所以最好的选择就是二层三层全部使用组播地址,且二层的组播地址是三层的被请求节点组播地址的映射地址;同时,中间设备(如交换机)处理组播的速度比未知单播的速度快,也是加快出整体的处理速度;
3、占用了较多的资源,需要解封装多层才可以判断报文是否是发给自己的,整体的处理速度也没组播快;ARP使用广播地址作为目的地址是一方面,同时ARP本身的安全性也不高,容易受到攻击;
4、通过跟踪邻居状态,来动态的管理ICMPv6的邻居表项;
5、通过RS报文中的M位和O位,来实现和DHCPv6的联动;
M和O值 | 表示含义 |
---|---|
M=0,O=0 | 通过无状态自动配置获取IPv6地址,通过手动配置等非DHCPv6方法获取其他配置 |
M=0,O=1 | 通过无状态自动配置获取IPv6地址,通过DHCPv6获取其他配置 |
M=1,O=0 | 通过DHCPv6获取IPv6地址, 通过手动配置等非DHCPv6方法获取其他配置 |
M=1,O=1 | 通过DHCPv6获取IPv6地址,通过DHCPv6获取其他配置 |
6、因为ARP协议不存在三层,所以需要设置这些对来实现数据承载;而NS报文是三层的协议,本身就存在IP层,所以不需要额外的载荷来承载这些数据;而需要承载源MAC是因为可能存在中继等设备使得源MAC出现变化;