[网络]IPv6基础IPv6概述

举报
Gere 发表于 2022/07/29 15:59:00 2022/07/29
【摘要】 1.前言目前我们接触得比较多的主流操作系统内核,已经能够很好地支持IPv6协议栈,例如:Windows: windows 7、windows 8.x、windows 10,默认开启IPv6;Linux: 内核2.6.x、内核3.x、内核4.x 已经支持IPv6(需要手动开启);iOS:IOS9开始已经支持IPv6 Only,2016年苹果已经强制要求app必须支持IPv6。本系列文章提到的I...

1.前言

目前我们接触得比较多的主流操作系统内核,已经能够很好地支持IPv6协议栈,例如:

  1. Windows: windows 7、windows 8.x、windows 10,默认开启IPv6;
  2. Linux: 内核2.6.x、内核3.x、内核4.x 已经支持IPv6(需要手动开启);
  3. iOS:IOS9开始已经支持IPv6 Only,2016年苹果已经强制要求app必须支持IPv6。

本系列文章提到的IPv6节点,没有特殊说明,一般指的是纯IPv6节点(IPv6 Only),也就是只支持IPv6协议栈。IPv4节点,是指纯IPv4的节点,也就是只支持IPv4协议栈。如果节点支持IPv6和IPv4双栈,会指明是双栈节点。

2.基本概念

2.1 IPv6的报文格式

众所周知,32位的IPv4地址已经接近耗竭,IPv6采用128位的地址长度拥有更大的地址空间。

                                          

                                                                              图表 1 IPv6数据报文

上图是我们最熟悉的ping的IPv6版本ICMPv6,可以看到,IPv6数据报文和IPv4有很大的差别:

  • 数据链路层(L2)的type字段标识为 0x86dd,表示承载的上层协议是IPv6(IPv4对比:type字段为0x0800);

  • IPv6的头部字段,和IPv4差别巨大,因此IPv6和IPv4无法兼容。

                                     

                                                                                 图表 2 IPv6报文头部

 IPv6报文头部更精简,字段更少,对比起IPv4,有以下几个地方值得注意:

  • IPv6报文头部是定长(固定为40字节),IPv4报文头部是变长的。这个意味着,写代码处理IPv6数据报文的效率会提高很多;

  • IPv6中Hop Limit字段含义类似IPv4的TTL;

  • IPv6中的Traffic Class字段含义类似IPv4中的TOS(Type Of Service);

  • IPv6的报文头部取消了校验和字段:取消这个字段也是对IPv4协议的一个改进。当IPv4报文在网路间传输,每经过一个路由器转发就是修改TTL字段,就需要重新计算校验和,而由于数据链路层L2和传输层L4的校验已经足够强壮,因此IPv6取消这个字段会提高路由器的转发效率。值得一提的是,在IPv6协议下,传输层L4协议UDP、TCP是强制需要进行校验和的(IPv4是可选的);

  • IPv6报文头部中的Next Header字段表示“承载上一层的协议类型”或者“扩展头部类型”。当IPv6数据报文承载的是上层协议ICMPv6、TCP、UDP等的时候,Next Header的值分别为58、6、17,这个时候和IPv4报文头部中的Protocol字段很类似;当不是以上3种协议类型的时候,IPv6报文头部紧接的是扩展头部。扩展头部是IPv6引入的一个新的概念,每个IPv6的数据报文可以承载0个或多个扩展头部,扩展头部通过链表的形式组织起来。当IPv6数据报文承载着扩展头部的时候,Next Header的数值为扩展头部的类型值。引入扩展头部这个概念,是IPv6对IPv4改进的一个方面,用扩展头部取代了IPv4的可选项信息,精简了IPv6的头部,增强了IPv6的扩展性。

                                       

                                                                                  图表 3 IPv6分片报文

 当发送一个分片IPv6数据报文的时候,IPv6使用的是扩展头部的形式组织各个分片的信息,如图IPv6报文头部Next Header字段值为44表示存在扩展头部,扩展头部是IPv6分片数据信息。在IPv4的报头中包含了几乎所有的可选项,因此每个中间路由器都必须检查这些选项是否存在。在IPv6中,这些相关选项被统一移到了扩展报头中,这样中间路由器不必处理每一个可能出现的选项(仅有“逐跳选项”报头是必须要处理的),提高了处理器处理数据报文的速度,也提高了其转发的性能。

2.2 IPv6的地址语法

一个IPv6的地址使用冒号十六进制表示方法:128位的地址每16位分成一段,每个16位的段用十六进制表示并用冒号分隔开,例如一个普通公网IPv6地址:

2001:0D12:0000:0000:02AA:0987:FE29:9871

IPv6地址支持压缩前导零的表示方法,例如上面的地址可以压缩表示为:

2001: 0D 12:0:0:2AA:987:FE29:9871

为了进一步精简IPv6地址,当冒号十六进制格式中出现连续几段数值0的位段时,这些段可以压缩为双冒号的表示,例如上面的地址还可以进一步精简表示为:

2001:12:0:2AA:987:FE29:9871

又例如IPv6的地址FF80:0:0:0:FF:3BA:891:67C2可以进一步精简表示为: 

FE80::FF:3BA:891:67C2

注意:双冒号只能出现一次。

2.2.1号段划分和前缀表示法

IPv6拥有128位巨大的地址空间,对于那么大的空间,也不是随意的划分,而是使用按照bit位进行号段划分。IPv6的地址结构如下图:

                                       

                                                                          图表 4 IPv6地址结构

例如RFC4291中定义了n=48, m=16,也就是全局路由前缀与子网和接口ID各占64位。IPv6支持子网前缀标识方法,类似于IPv4的无分类域间路由CIDR机制(注意:IPv6没有子网掩码mask的概念)。

使用“IPv6地址/前缀长度”表示方法,例如:2001:C3:0:2C6A::/64表示一个子网;而2001:C3:0:2C6A:C9B4:FF12:48BC:1A22/64表示该子网下的一个节点地址。可以看到,一个IPv6的地址有子网前缀+接口ID构成,子网前缀由地址分配和管理机构定义和分配,而接口ID可以由各操作系统实现生成。

2.2.2 接口ID生成算法

从前面的介绍中可以看出,IPv6单播地址是由前缀(64位)+接口ID(64位)组成。接口ID的生成算法主要有以下几种:

  • 接口ID可以从EUI-64地址生成(EUI-64就是mac地址中间插入FFFE,然后第七位置位。例如:一台电脑的MAC是00:0C:85:AB:50:01,中间插入FFFE:00:0C:85:FF:FE:AB:50:01,然后由左到右第七位置位: 02:0C:85:FF:FE:AB:50:01,这台电脑的EUI-64就是020C:85FF:FEAB:5001)

  • 为了可以具备某种程度的匿名信,接口ID可以使用一个随机分配的,windows操作系统默认就是使用这种生成算法,Linux下也是默认开启这个算法;

  • 使用状态化的自动配置技术分配,例如DHCPv6分配;

  • 手工配置。

2.3 IPv6的地址类型

IPv6地址分三种类型:

  • 单播,对应于IPv4的普通公网和私网地址;

  • 组播,对应于IPv4的组播(多播)地址;

  • 任意播,IPv6新增的地址概念类型。

IPv6没有广播地址,用组播地址实现广播的功能。实际上我们工作和生活最多接触的就是单播地址。

2.3.1 单播地址

IPv6单播地址主要有以下几种。

全球单播地址

                                        

                                                                      图表 5 IPv6全球单播地址结构

 前缀2000::/3,相当于IPv4的公网地址。这种地址在全球的路由器间可以路由。

链路本地地址

                                    

                                                                        图表 6 链路本地地址结构 

前缀FE80::/10,顾名思义,此类地址用于同一链路上的节点间的通信,主要用于自动配置地址和邻居节点发现过程。Windows和Linux支持或开启IPv6后,默认会给网卡接口自动配置一个链路本地地址。也就是说,一个接口一定有一个链路本地地址。如下图:

                                               

                                                                      图表 7 Linux下查看链路本地地址

                                                                  

                                                                      图表 8 Windows下查看链路本地地址

每个接口必须至少有一个链路本地地址;每个接口可以配置1个以上的单播地址,例如一个接口可以配置一个链路本地地址,同时也可以配置一个全球单播地址。

注意:很容易会把链路本地地址和IPv4的私网/内网地址对应起来,其实链路本地地址对应于IPv4的APIPA地址,也就是169.254开头的地址(典型场景就是windows开启自动获取地址而获取失败后自动分配一个169.254的地址)。

唯一本地地址

                                         

                                                                           图表 9 唯一本地地址结构

前缀FC00::/7,相当于IPv4的私网地址(10.0.0.0、172.16.0.0、192.168.0.0),在RFC4193中新定义的一种解决私网需求的单播地址类型,用来代替废弃使用的站点本地地址。

在IPv4中,利用NAT技术私网内的网络节点可以使用统一的公网出口访问互联网资源,大大节省了IPv4公网地址的消耗(IPv6推进缓慢的原因之一)。另一方面,由于默认情况下私网内节点与外界通信的发起是单向的,网络访问仅仅能从私网内发起,外部发起的请求会被统一网关或者防火墙阻隔掉,这样的网络架构很好的保护了私网内的节点安全性和私密性。因此,在安全性和私密性要求下,IPv6中同样需要支持私网,并且也需要支持NAT。在Linux内核3.7版本开始加入对IPv6 NAT的支持,实现的方式和IPv4下的差别不大

站点本地地址

前缀FEC9::/48,以前是用来部署私网的,但RFC3879中已经不建议使用这类地址,建议使用唯一本地地址。

回环地址

0:0:0:0:0:0:0:1或::1,等同于IPv4的127.0.0.1

过渡地址

过度地址是指在IPv6的某一些十六进制段内嵌这IPv4的地址,例如IPv6地址中64:ff9b::10.10.10.10,此IPv6地址最后4个字节内嵌一个IPv4的地址,这类地址主要用于IPv6/IPv4的过渡技术中。

2.3.2 组播地址

IPv6的组播地址通常是为IPv6的组播服务,而IPv6通信的核心大量的使用了组播,IPv6不再使用广播,这与IPv4的通信不同。(注意:IPv6的通信过程依赖于邻居发现协议(NDP),而NDP协议又是基于IPv6的组播进行工作的)

而对于IPv6组播地址是由固定的8bit地址前缀FF::/8,4bit的标志位,4bit组播范围和112bit多播组标识符(组ID)组成。如下图所示。“标志”字段用于说明组播地址是“永久性(由IANA指定的一个地址)”的,还是“临时性”的。而对于该4bit标志字段,一般情况下,其高3bit位为0,剩下的低1bit位就是用于判断多播地址是“永久性”还是“临时性”。如果低1bit位为0,则表示为“永久性多播地址”,也就是一个众所周知的多播地址,如FF02::1表示在IPv6环境中一个链路上的所有计算机节点、FF02::2表示一个链路上的所有路由器节点,类似于IPv4的224.0.0.1和224.0.0.2。如果为“1”就是“临时性多播地址”。

                                                    

                                                                                 图表 10 多播地址格式

"范围"的取值:

  • 1代表本地接口范围 
  • 2代表本地链路范围 
  • 3代表本地子网范围 
  • 4代表本地管理范围 
  • 5代表本地站点范围 
  • 8代表组织机构范围 
  • E代表全球范围 

2.4 地址配置

IPv6一个比IPv4更厉害的方面,就是可以自动配置地址,甚至这个配置过程不需要DHCPv6(在IPv4中是DHCPv4)这样的地址配置协议。最典型的例子就是,只要开启了IPv6协议栈的操作系统,每个接口就能自动配置了链路本地地址,这个是和IPv4最重要的区别之一。IPv6的地址配置有以下几种:

  • 只要开启了IPv6协议栈,接口自动分配链路本地地址;
  • 无状态自动配置地址;
  • 有状态自动配置地址,例如DHCPv6。
  • 手动配置。

2.5 域名解析

由于IPv6的地址扩展为128位,比IPv4的更难书写和记忆,因此IPv6下的DNS变得尤为重要。IPv6的的DNS资源记录类型为AAAA(又称作4A),用于解析指向IPv6地址的完全有效域名。下面是一个示例:

Hostipv6.example.wechat.com IN AAAA 2001:db8:1::1

3. PingV6流程解析

本章节的目的是,根据上述章节的理论基础,通过抓包分析ping命令的流程。抓包结果如下:

                             

                                                        图表 11 ping ipv6地址的抓包结果

如上图,发现在发送Echo之前,有一个类似于IPv4的ARP过程,该过程即为NDP邻居发现协议的基础。通过上述描述,我们可以了解到,IPv6是没有广播地址的,而是通过组播地址来实现数据链路层地址解析

在IPv4环境的的ARP地址解析协议是使用目标MAC地址为广播地址(255.255.255.255或者FFFF.FFFF.FFFF)将MAC地址请求消息发送到整个以太网链路上的所有主机,即便是A主机只请求D主机的MAC,B主机与C主机也同样会收到这个请求广播,从性能与效率上讲这明显不科学。所以在IPv6的环境中放弃了广播的的方式,而是采用组播方式将MAC地址的解析请求,以点对点的形式直接组播到D主机的请求节点组播地址FF02::1:FF54:319E。而不再将请求消息发送到无关的主机B和主机C,所以IPv6的节点请求的确是高效率去替代IPv4的ARP协议。总而言之就是使用点到点的方式去代替广播。

节点请求主机能够以一种“点对点”的形式将MAC地址请求消息发送到目标主机D,是因为D主机的请求节点组播地址FF02::1:FF54:319E在整个链路上是唯一的,所以源主机可以直接将节点请求信息发到目标主机节点请求组播地址上。目标节点组播地址的生成过程如下图所示:

                                              http://blog.51cto.com/attachment/201312/121929178.png

                                                                               图表 12 组播地址生成原理图

如抓包的结果,目的链路本地址为fe80::202:c9ff:fe54:319e,取出IPv6主机的本地链路地址的后24位“54:319e”,填充到“FF02:0000:0000:0000:0000:0001:FF”前缀中,形成最后的地址:FF02:0000:0000:0000:0000:0001:FF54:319e,使用“零压缩”法表示成为:FF02::1:FF54:319e。

在IPv4的ARP地址解析协议中的ARP请求报文的目标MAC地址为FFFF.FFFF.FFFF,在IPv6中,组播的MAC地址是通过IPv6的组播IP地址映射而来,映射的原则是:将IPv6组播地址的后32位取出,填充到固定前缀是3333的MAC地址中来生成数据链路层地址,如下图所示:

                                                         http://ossi4.51cto.com/attachment/201312/122107606.png

                                                                       图表 13 组播ip地址映射成组播MAC地址

如抓包的结果,组播IP地址为FF02::1:FF54:319e,取出该地址的最后32个二进制位,一个十六进制位就为4个二进制位,所以最后32个二进制位就是FF54:319e,将这部分填充到IPv6组播MAC的固定前缀3333,就得到组播MAC地址是3333: FF54:319e。

                                         

                                                                          图表 14组播IP地址与组播MAC地址

目的PC在收到该请求后,即应答请求:

                                          

                                                                                        图表 15 邻居应答消息

主机收到应答后,即可取出源MAC地址,保存到MAC表中。之后就开发发送Echo,如下图所示:

                                           

                                                                                   图表 16 ICMPv6的Echo请求

                                            

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。