IPv6基础介绍

IPv4理论上仅仅能够提供的地址数量是43亿,但是由于地址分配机制等原因,实际可使用的数量还远远达不到43亿。因特网的迅猛发展令人始料未及,同时也带来了地址短缺的问题。针对这一问题,曾先后出现过几种解决方案,比如CIDR和NAT。但是CIDR和NAT都有各自的弊端和不能解决的问题,在这样的情况下,IPv6的应用和推广便显得越来越急迫。

IPv6是Internet工程任务组(IETF)设计的一套规范,它是网络层协议的第二代标准协议,也是IPv4的升级版本。IPv6与IPv4的最显著区别是,IPv4地址采用32比特标识,而IPv6地址采用128比特标识。128比特的IPv6地址可以划分更多地址层级、拥有更广阔的地址分配空间,并支持地址自动配置。

IPv6基础介绍_第1张图片

IPv6报文格式 

IPv6数据包由一个IPv6报头、多个扩展报头和一个上层协议数据单元三部分组成。

IPv6基本报头

IPv6基本报头提供报文转发的基本信息,会被转发路径上面的所有路由器解析,有8个字段,固定大小为40字节,每一个IPv6数据报都必须包含报头。

IPv6的基本报头在IPv4报头的基础上,增加了流标签域,去除了一些冗余字段,使报文头的处理更为简单、高效。具体格式如下图所示:

IPv6基础介绍_第2张图片

IPv6基本报头中主要字段解释如下:

  • Version:版本号,长度为4bit。对于IPv6,该值为6。

  • Traffic Class:流类别,长度为8bit。等同于IPv4中的ToS字段,表示IPv6数据报的类或优先级,主要应用于QoS。

  • Flow Label:流标签,长度为20bit。IPv6中的新增字段,用于区分实时流量,不同的流标签+源地址可以唯一确定一条数据流,中间网络设备可以根据这些信息更加高效率的区分数据流。

  • Payload Length:有效载荷长度,长度为16bit。有效载荷是指紧跟IPv6报头的数据报的其它部分(即扩展报头和上层协议数据单元)。

  • Next Header:下一个报头,长度为8bit。该字段定义了紧跟在IPv6报头后面的第一个扩展报头(如果存在)的类型。

  • Hop Limit:跳数限制,长度为8bit。该字段类似于IPv4中的Time to Live字段,它定义了IP数据报所能经过的最大跳数。每经过一个路由器,该数值减去1,当该字段的值为0时,数据报将被丢弃。

  • Source Address:源地址,长度为128bit。表示发送方的地址。

  • Destination Address:目的地址,长度为128bit。表示接收方的地址。

IPv6扩展报头

在IPv4中,IPv4报头包含可选字段Options,内容涉及security、Timestamp、Record route等,这些Options可以将IPv4报头长度从20字节扩充到60字节。在转发过程中,处理携带这些Options的IPv4报文会占用路由器很大的资源,但实际中也很少使用。IPv6将这些Options从IPv6基本报头中剥离,放到了扩展报头中,使得IPv6报头更加简化。

扩展报头是可选的,一个IPv6报文可以包含0个、1个或多个扩展报头,仅当需要路由器或目的节点做某些特殊处理时,才由发送方添加一个或多个扩展头。IPv6支持多个扩展报头,各扩展报头中都含有一个下一个报头字段,用于指明下一个扩展报头的类型。具体格式如下图所示:

IPv6基础介绍_第3张图片

IPv6扩展报头中主要字段解释如下:

  • Next Header:下一个报头,长度为8bit。与基本报头的Next Header的作用相同。指明下一个扩展报头(如果存在)或上层协议的类型。

  • Extension Header Length:报头扩展长度,长度为8bit。表示扩展报头的长度(不包含Next Header字段)。

  • Extension Head Data:扩展报头数据,长度可变。扩展报头的内容,为一系列选项字段和填充字段的组合。

IPv6地址介绍

IPv6地址格式

IPv6地址长度为128比特,用于标识一个或一组接口。IPv6地址通常写作xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx,其中xxxx是4个十六进制数,等同于一个16比特二进制数;八组xxxx共同组成了一个128比特的IPv6地址。一个IPv6地址由IPv6地址前缀和接口ID组成,IPv6地址前缀用来标识IPv6网络,接口ID用来标识接口。

IPv6基础介绍_第4张图片

IPv6地址压缩格式

由于IPv6地址长度为128比特,书写时会非常不方便。此外,IPv6地址的巨大地址空间使得地址中往往会包含多个0。为了应对这种情况,IPv6提供了压缩方式来简化地址的书写。压缩规则如下:

  1. 每16比特组中的前导0可以省略。

  2. 地址中包含的连续两个或多个均为0的组,可以用双冒号“::”来代替。需要注意的是,在一个IPv6地址中只能使用一次双冒号“::”,否则,设备将压缩后的地址恢复成128位时,无法确定每段中0的个数。

下图展示了如何利用压缩规则对IPv6地址进行简化表示。

IPv6基础介绍_第5张图片

IPv6地址类型

如下图所示,IPv6地址分为单播、组播和任播三种类型

IPv6基础介绍_第6张图片

  • 单播地址(Unicast Address):标识一个接口,目的地址为单播地址的报文会被送到被标识的接口。在IPv6中,一个接口拥有多个IPv6地址是非常常见的现象。

  • 组播地址(Multicast Address):标识多个接口,目的地址为组播地址的报文会被送到被标识的所有接口。只有加入相应组播组的设备接口才会侦听发往该组播地址的报文。

  • 任播地址(Anycast Address):任播地址标识一组网络接口(通常属于不同的节点)。目标地址是任播地址的数据包将发送给其中路由意义上最近的一个网络接口。

IPv6单播地址

全球单播地址

全球单播地址是带有全球单播前缀的IPv6地址,其作用类似于IPv4中的公网地址。这种类型的地址允许路由前缀的聚合,从而限制了全球路由表项的数量。其具体格式如下图所示:

IPv6基础介绍_第7张图片

  • 全局路由前缀:由提供商指定给一个组织机构,一般至少为48bit。目前已经分配的全局路由前缀的前3bit均为001。因此前缀为2000::/3。

  • 子网:组织机构可以用子网ID来构建本地网络(Site),与IPv4中的子网号作用相似。子网ID通常最多分配到第64位。

  • 主机位:用来标识一个设备(Host),与IPv4中的主机ID作用相似。

链路本地地址

链路本地地址是IPv6中的应用范围受限制的地址类型,只能在连接到同一本地链路的节点之间使用。它使用了特定的本地链路前缀FE80::/10(最高10位值为1111111010),同时将接口标识添加在后面作为地址的低64比特。

在一个节点启动IPv6协议栈时,节点的每个接口会自动配置一个链路本地地址。该地址专门用来和相同链路上的其他主机通信。具体格式如下图所示:

IPv6基础介绍_第8张图片

  • 只能在连接到同一本地链路的节点之间使用,广泛应用于邻居发现、无状态地址等。

  • 链路本地地址前缀FE80::/10,将接口ID添加在后面作为地址的低64位。

  • 每一个IPv6接口都必须具备一个链路本地地址。

唯一本地地址

为了代替站点本地地址的功能,又使这样的地址具有唯一性,避免产生像IPv4的私有地址泄漏到公网而造成的问题,RFC4193定义了唯一本地地址。

  • 唯一本地地址,概念上类似于IPv4中的私网地址,仅能够在本地网络使用,在IPv6 Internet上不可被路由。

  • 唯一本地地址固定前缀FC00::/7。它被分为两块,其中FC00::/8暂未定义,另一块是FD00::/8,其格式如下:

IPv6基础介绍_第9张图片

字段解释:

Prefix:前缀;固定为FC00::/7。

L:L标志位;值为1代表该地址为在本地网络范围内使用的地址;值为0被保留,用于以后扩展。

Global ID:全球唯一前缀;通过伪随机方式产生(RFC4193)。

Subnet ID:子网ID;划分子网使用。

Interface ID:接口标识。

特殊地址

  • 未指定地址。

    0:0:0:0:0:0:0:0/128 或者::/128。

    该地址作为某些报文的源地址,比如作为重复地址检测时发送的邻居请求报文(NS)的源地址,或者DHCPv6初始化过程中客户端所发送的请求报文的源地址。

  • 环回地址。

    0:0:0:0:0:0:0:1/128 或者::1/128。

    与IPv4中的127.0.0.1作用相同,用于本地回环,发往::/1的数据包实际上就是发给本地,可用于本地协议栈回环测试。

  • IPv4兼容地址。

    在过渡技术中,为了让IPv4地址显得更加突出一些,定义了内嵌IPv4地址的IPv6地址格式。在这种表示方法中,IPv6地址的部分使用十六进制表示,IPv4地址部分可用十进制格式。该地址基本上已经不再使用。

接口标识生成方法

对于IPv6单播地址来说,如果地址的前三bit不是000,则接口标识必须为64位,如果地址的前三位是000,则没有此限制。

接口ID的长度为64bit,用于标识链路上的接口。在每条链路上,接口ID必须唯一。接口ID有许多用途,最常见的用于就是黏贴在链路本地地址前缀后面,形成接口的链路本地地址。或者在无状态自动配置中,黏贴在获取到的IPv6全局单播地址前缀后面,构成接口的全局单播地址。

接口ID可通过3种方法生成:手工配置、系统自动生成和IEEE EUI-64规范生成。

  • 手工配置:建议在服务器和重要网络设备上配置。

  • 系统通过软件自动生成:保护主机的私密性。

  • IEEE EUI-64规范自动生成:最常用的方法。

通过EUI-64规范根据MAC地址生成接口ID

采用EUI-64规范,接口可根据该MAC地址计算得到接口ID,由于MAC地址全局唯一,因此该接口ID也相应的具备全局唯一性。

计算过程如下:将48bit的MAC地址对半劈开,然后插入“FFFE”,再对从左数起的第7位,也就是U/L位取反,即可得到对应的接口ID。

IPv6基础介绍_第10张图片

说明

在单播MAC地址中,第1个Byte的第7bit是U/L(Universal/Local,也称为G/L,其中G表示Global)位,用于表示MAC地址的唯一性。如果U/L=0,则该MAC地址是全局管理地址,是由拥有OUI的厂商所分配的MAC地址;如果U/L=1,则是本地管理地址,是网络管理员基于业务目的自定义的MAC地址。

而在在EUI-64接口ID中,第7bit的含义与MAC地址正好相反,0表示本地管理,1表示全球管理,所以使用EUI-64格式的接口ID,U/L位为1,则地址是全球唯一的,如果为0,则为本地唯一。

IPv6组播地址

IPv6的组播与IPv4相同,用来标识一组接口,一般这些接口属于不同的节点。一个节点可能属于0到多个组播组。发往组播地址的报文被组播地址标识的所有接口接收。

一个IPv6组播地址由前缀,标志(Flag)字段、范围(Scope)字段以及组播组ID(Global ID)4个部分组成:

IPv6基础介绍_第11张图片

  • 前缀:IPv6组播地址的前缀是FF00::/8(1111 1111)。

  • 标志字段(Flag):长度4bit,目前只使用了最后一个比特(前三位必须置0),当该位值为0时,表示当前的组播地址是由IANA所分配的一个永久分配地址;当该值为1时,表示当前的组播地址是一个临时组播地址(非永久分配地址)。

  • 范围字段(Scop):长度4bit,用来限制组播数据流在网络中发送的范围。

  • 组播组ID(Global ID):长度112bit,用以标识组播组。目前,RFC2373并没有将所有的112位都定义成组标识,而是建议仅使用该112位的最低32位作为组播组ID,将剩余的80位都置0。

IPv6组播地址的MAC地址映射

组播IPv6报文的目的IP地址是组播IPv6地址,而目的MAC地址则必须是组播MAC地址,并且该地址必须与组播IPv6地址对应。

33-33是专门为IPv6组播预留的MAC地址前缀,MAC地址的后32bit从对应的组播IPv6地址的后32bit拷贝而来。

IPv6基础介绍_第12张图片

被请求节点组播地址

在IPv4中,当设备需要解析某个IP地址对应的MAC地址时,就会发送一个广播ARP Request帧,之所以要发送广播帧,是因为它要确保广播域内所有节点都能收到。然而除了目标节点之外,该帧对于其他节点而言是个困扰,因为它们不得不去解析这个帧(一直解析到ARP载荷),这个动作将会浪费设备的资源。

在IPv6中,ARP及广播都被取消,当设备需要请求某个IPv6地址对应的MAC地址时,设备依然需要发送请求报文,但是该报文是一个组播报文,其目的IPv6地址是目标IPv6单播地址对应的被请求节点组播地址,而目的MAC地址则是该组播地址对应的组播MAC地址。由于只有目标节点才会侦听这个被请求节点组播地址,因此当其他设备收到该帧时,这些设备可以通过目的MAC地址、在网卡层面就判断出不需要处理它并将帧丢弃。

  • 当一个节点具有了单播或任播地址,就会对应生成一个与之相对应的被请求节点组播地址,并且加入这个组播组。一个单播地址或任播地址对应一个被请求节点组播地址。该地址主要用于地址解析、邻居发现机制和地址重复检测等功能。

  • 被请求节点组播地址由固定前缀FF02::1:FF00:0/104和对应IPv6地址的最后24bit组成。被请求节点组播地址的有效范围为本地链路范围

IPv6基础介绍_第13张图片

IPv6任播地址

任播地址是IPv6特有的地址类型,用来标识一组网络接口(通常属于不同的节点)。目标地址是任播地址的数据包将发送给其中路由意义上最近的一个网络接口。适合于“One-to-One-of-Many”(一对组中的一个)的通讯场合。接收方只需要是一组接口中的一个即可,如移动用户上网就需要因地理位置的不同,而接入离用户最近的一个接收站,这样才可以使移动用户在地理位置上不受太多的限制。

IPv6基础介绍_第14张图片

任播地址从单播地址空间中进行分配,使用单播地址的任何格式。因而,从语法上,任播地址与单播地址没有区别。被分配具有任播地址的节点必须得到明确的配置,从而知道它是一个任播地址。

你可能感兴趣的:(网络)