编码机

图解IPv6IPv4都用完了,赶紧看看它

发布时间:2023/2/23 21:54:09   

初识IPv6

年11月25日已分配完公网IPv4地址,以后就没有多余地址可以分配了。短期内可以使用NAT技术进行缓解。长期来看,还是要用位的IPv6地址替代32位的IPv4地址,IPv6有3.4×10^38个可用地址,多得不得了,可以满足未来IP地址的需求。

IPv6地址

IPv6地址不但比IPv4的地址长度长,还其它方面的不同。

1、IPv6地址表示

32位的IPv4地址,分隔成4个8位段,每8位段的值在0~之间,每个8位段之间用“.”分开,这就是“点分十进制表示法”。举个栗子:

..0.1

而位的IPv6地址,是IPv4地址的4倍,如果用点分十进制表示法,那么会有16个八位组,地址过于冗长。为了使用方便,使用十六进制表示法,分隔成8个16位段,每16位段的值在~FFFF的十六进制数之间,每个16位段之间用“:”分开。举个栗子:

:::a::00bc::0a0b

为了方便理解,可以查看下面的进制转换表。

但是IPv6地址还是太长,不方便记忆,看着都头晕,也不方便书写,毫无规律可言。于是就有了两条简化规则。第一条规则是:

每组十六进制数中开头的0可以省略。上面的IPv6地址可以写成:

:::a:0:bc::a0b

这里需要注意,开头的0才能省略,末尾的0是不能省略的,因为这样会引起歧义,无法确定省略的0是在数字前还是数字后。

如果有个IPv6地址有一串的0,比如:

:::::::3

可以简写成:

:0:0:0:0:0:0:3

这时,还可以使用第二个规则进行简化,第二条规则是:

由全0组成的连续的16位段可以用一对冒号“::”表示。上面的地址还可以简化成:

::3

这里需要注意,一个IPv6地址内,只能使用一次“::”表示。如果使用两次及以上,也会产生歧义。举个栗子:

:0a0c::::::

正确的写法有是:

:a0c::21:0:0:77

:a0c:0:0:21::77

如果使用了两次“::”,那么就是错误的:

:a0c::21::77

有两个全0字符串,就无法确定它们的长度,上面错误的地址会有几种可能:

:0a0c::::::

:0a0c::::::

:0a0c::::::

IPv4的网段地址可以用子网掩码表示,还可以用斜线法表示。IPv6只能用斜线法表示网段地址,即在IPv6地址后面加上一个斜线“/”,后面加上一个十进制的数字,来表示前面多少位是网络位。网络位是64位的IPv6地址表示如下:

:::aa:bc:::/64

对应的网段地址是:

:::aa::/64

全是0的IPv6地址可以写成一对冒号。当网络位是0位时,表示默认地址。

::/0

当网络位是位时,表示未指定地址(unspecifiedaddress)。设备未分配IPv6地址时,就用未指定地址作为标识进行报文交互。

::/

2、IPv6地址类型

IPv6地址根据使用范围和功能,分为三种类型:

单播(Unicast)任意播(Anycast)组播(Multicast)对比IPv4,IPv6地址中没有广播地址,但是有一个包含全部节点的组播地址,跟IPv4中的广播地址功能相同。

其中单播地址又细分为全球单播地址、唯一本地地址和链路本地地址等。

2.1全球单播地址

单播地址表示单台设备的地址。全球单播地址是指这个单播地址是全球唯一的。也就是说,全球单播地址是可以在公网使用、全网可路由的IPv6地址,类似于IPv4的公网IP地址。全球单播IPv6地址是由Internet地址授权委员会(IANA)分配给地区Internet注册机构(RIR),再由RIR分配给Internet服务提供商(ISP)。

IANA分配位的IPv6地址时,同IPv4一样,也是分配一个网段,即网络/子网位,不会分配位的地址。IPv6单播地址的通用格式如下:

全球单播IPv6地址的前3位固定为;第4~48位的这45位由地址分配机构分配;48位之后的16位是网络划分子网位,称为子网ID;剩余的64位IPv6地址就是主机位,但是叫做接口ID(InterfaceID)。因为一台主机可以有几个接口,用IPv6地址表示主机的一个接口更准确,而不是表示一台主机。同时,一个接口可以有多个IPv6地址,还可以有一个IPv4地址,接口ID只是这个接口的几个标识符之一。

通常,全球IPv6地址的接口ID是64位,子网ID是16位。一个16位的子网ID可以划分个不同的子网。很少有这么多子网的网络,因此全球单播IPv6地址还有另外一种格式:前缀是n位,子网ID是64-n位,接口ID也是64位。两种格式也不是矛盾的。

将全球单播IPv6地址的前3位固定值转换为IPv6表示法,可知全球单播地址的前缀为2::/3。

IANA和RIR把长度/32或/35的IPv6前缀分配给本地Internet注册机构(LIR)。LIR通常是大型的ISP,LIR分配前缀长度/48的IPv6地址给各个客户。也有一些例外,会分配不同长度的前缀:

如果一个客户非常庞大,那么可以分配一个长度小于/48的前缀。如果有且仅有一个子网需要地址,那么可以分配一个长度是/64的前缀。如果有且仅有一台设备需要地址,那么可以分配一个长度是/的前缀。2.2IPv6地址类型

IPv6地址开头的二进制标识地址类型。比如:全球单播地址的前3位是。

2.3本地单播地址

除了全球单播地址,还有几种其它类型的本地单播地址,分别应用在不同的场景。

有哪些本地单播地址呢?

本地单播地址有4种类型,分别是唯一本地地址、链路本地地址、未指定地址、回环地址。

唯一本地地址虽然IPv6地址非常充足,但是IANA还是分配了一段可以在私有网络使用的私有IP地址空间。这种可以自行使用而不用申请的单播IPv6地址叫做唯一本地地址。唯一本地地址只能在私有网络使用,不能在全球路由,不同的私网可以复用这类地址。它的作用和范围跟IPv4的私有IP地址相同。

唯一本地地址的前7为固定是110,前缀为FC00::/7的IPv6地址。之前还有站点本地地址(SiteLocalAddress),前缀是FEC0::/10,已被ULA取代。

唯一本地地址的第8位比较特殊。第8位为0时,未定义,也就是说,FC00::/8这个IPv6地址前缀属于保留的地址空间。目前私有网络使用的IPv6地址是以1101开头的,即前缀为FD00::/8的IPv6地址。

链路本地地址IPv6的链路本地地址(Link-LocalAddress),是IPv4地址中没有的类型,是IPv6新定义的地址类型。

链路本地地址是只在链路内有效的地址。启动IPv6时,网络接口会自动配置这样的一个IPv6地址,就可以直接和同一链路上的其它设备通信。因为链路本地地址只在链路本地有效,所以这些数据包不会被发送到其它链路上。

链路本地地址的前10位固定是111010,之后的54位固定为0,最后64位是接口ID。也就是说,链路本地地址的前缀为FE80::/10。

如果链路本地地址的前64位都是相同的,那么接口如何使用64位的接口ID进行标识,才能确保链路本地地址在链路中不会出现IP地址冲突呢?答案是接口使用自己的物理MAC地址来填充接口ID字段。理论上接口的MAC地址是唯一的,因此通过MAC地址生成的接口ID和链路本地地址也是唯一的。

把MAC地址转换成接口ID,使用MAC-to-EUI64转换法。简单的讲,就是使用接口的48位MAC地址,在MAC地址中间,也就是OUI后面,插入一个固定的十六进制数0xFFFE,并把第7位的U/L(全局/本地)位设置为1,这样就转换为一个64位的接口ID。

未指定地址未指定地址是位全为0的前缀地址,简写成::/,相当于IPv4中的0.0.0.0/32。这个地址不能分配给接口使用,只有当IPv6设备还没获取到地址时,才将未指定地址作为数据包的源IPv6地址。

回环地址回环地址是前位全为0,最后一位是1的位前缀地址,简写成::1/,相当于IPv4中的回环地址.0.0.1/8。回环地址表示节点自己,不能分配给接口使用。只要设备的协议栈状态正常,设备就可以收到发送给回环地址的数据包。

2.4任意播地址

IPv6定义了一种任性的功能,通过任意播地址(AnycastAddress)实现。任意播地址是根据功能定义的,而不是根据报文格式,IPv6没有定义任意播的地址空间,与单播使用相同的地址空间。所以,无法根据地址判断是单播地址还是任意播地址。

单播是一对一,组播是一对多,广播是一对全体,那么任意播就是一对最近的通信方式。

一个任意播地址可以分配给多台设备,路由器会有多条路由到达相同的目的地,选择代价最小的路由进行数据转发。在大型网络中,流量可以发送到最近的设备,数据传输效率更高。而且当最近的设备故障时,路由器可以把路由指向下一台最近的路由器。

2.5组播地址

组播地址不是标识一台设备,而是一组设备:一个组播组(MulticastGroup)。发送组播数据包通常是单台设备,可以是组播组成员,也可以是其它主机,数据包的目的地址是组播地址。

组播组成员有可能是一台设备,也可能是这个网络上的所有设备。IPv6没有广播地址,但是有一个包含所有节点的组播组,和广播地址做相同的事情:所有节点都是这个组播组的成员。

组播地址的前8位全是1,后面跟着4位标记位,再后面就是4位表示地址范围。最后的位作为组ID(GroupID),标识不同的组播组。前面的80位是0,只使用后面的32位。

4位标记位中,第1位是保留标记位,未使用,使用固定值0。第2位用于汇集点(RendezvousPoint),汇集点是组播的一个概念,叫做R位,通常取值为0。第3位表示组播地址是否带了前缀,叫做P位。组播地址没前缀,取值为0。大多数情况是0。最后一位是T位,值为0时表示是已定义的、永久的组播地址;值为1时是临时充当一些设备的组播组。因此,各个协议使用的组播组是以FF0开头的IPv6地址,而自定义的组播组是以FF1开头的。

组播地址和单播地址一样,有一个有效范围,4为范围位定义了组播地址的使用范围。不同取值的范围表如下:

常见的IPv6组播地址的格式是标记位的值是0,范围位的值是2,即前缀为FF02的组播地址。

2.6嵌入的IPv4地址

在IPv6地址的环境中使用IPv4地址,需要用到转换技术,把IPv4地址转换成IPv6地址。比如6to4技术就是将IPv4地址转换成16进制数,再嵌入到IPv6地址的最后32位。

ICMPv6

IPv6也是使用ICMP来管理网络,实现错误检查和报告机制功能。IPv4协议中ICMP使用的协议号是1,而IPv6协议中ICMPv6使用的值是58。ICMPv6对于头部字段的定义也与ICMP相同。

ping功能也是使用Echo请求和Echo应答报文。除此之外,还有一个基于ICMP的新协议:邻居发现协议。

NDP

IPv6的邻居发现协议(NDP)相当于IPv4的ARP、ICMP的路由器发现和ICMP的重定向,还可以发现网络中使用的IPv6地址前缀等参数,并实现地址自动配置等。IPv6协议通过NDP功能实现即插即用特性:

路由器发现(RouterDiscovery):当一个节点接入到IPv6链路时,它可以发现链路上的路由器,而不需要借助使用DHCP。前缀发现(PrefixDiscovery):当一个节点接入到IPv6链路时,它能够发现链路的前缀。参数发现(ParameterDiscovery):节点能够发现所在链路的参数,像链路的MTU和跳数限制等。地址自动配置(AddressAutoconfiguration):节点能够自动配置,不需要使用DHCP。地址解析(AddressResolution):节点不需要通过ARP就能够获取链路上其它节点的MAC地址。下一跳确定(Next-HopDetermination):能够确定到达目的节点的下一跳链路层节点,或者所在链路的目的节点,或是到达目的节点的路由器。邻居不可达检测(NeighborUnreachabilityDetection):节点上能够检测到链路上的邻居何时不可达,邻居有可能是主机,也可能是路由器。地址冲突检测(DuplicateAddressDetection):节点能够检测到要使用的地址是否已经被其它节点占用。重定向(Redirect):对于非连接的目的节点,路由器能够通知主机存在更好的下一跳路由。NDP报文是在数据链路内接收和发送,因此封装NDP的数据包是使用IPv6链路本地地址,或者是链路范围内的组播地址。在安全性上也有加强,NDP报文的跳数限制是。如果收到的数据包的跳数限制值小于,那么这个数据包至少经过了一台路由器,因此丢弃这个数据包。这样可以阻止NDP不会受到非本地链路的攻击或欺骗。

1、NDP报文

NDP定义了5种报文类型,且跳数限制字段值都是。如果收到的NDP报文中跳数限制字段值不是,那么会丢弃这个NDP报文。在ICMPv6封装这5种NDP报文时,编码字段都是0,不同报文类型通过类型值来标识:

路由器请求(RouterSolicitation,RS):路由器请求报文是由主机发出的,用来请求链路中的路由器发送一个RA。类型字段值是。路由器通告(RouterAdvertisement,RA):路由器通告报文是路由器发出的,用来通告路由器的存在和链路参数,比如:链路前缀、链路MTU,以及跳数限制等。这些报文周期性的发送,也用于响应路由器请求报文。类型字段值是。邻居请求(NeighborSolicitation,NS):也是有主机发起,用来请求另一台主机的MAC地址,也用于地址冲突检测、邻居不可达检测。类型字段值是。邻居通告(NeighborAdvertisement,NA):用于响应邻居请求报文。如果一个节点改变了MAC地址,那么它通过发送一个未请求的邻居通告报文来告知这个新地址。类型字段值是。重定向(Redirect):跟IPv4协议中的ICMP用法相同,只不过是移植到NDP中。类型字段值是。2、路由器发现

路由器在所在的链路上周期性发送RA,告知它的存在和配置的所有参数。未收到请求的RA的源地址是路由器接口的链路本地IPv6地址,目的地址是所有节点的组播地址(FF02::1)。

刚接入到链路的主机,需要等待一个RA,用来发现链路上的路由器和链路参数。默认等待秒的时间太长。所以,主机激活时,就会发送一个RS,这个报文的源地址可以是未指定地址(::),也可以是主机的链路本地IPv6地址。目的地址就是所有路由器的组播地址(FF02::2),请求链路本地路由器为主机提供一些信息。

只有路由器才会监听链路本地路由器组播地址,当路由器收到RS时,就会发送一条RA作为响应。如果收到报文的源地址是链路本地地址,那么使用链路本地地址单播发送。如果源地址是未指定地址(::),那么会以组播方式发送给所有节点(FF02::1)。

当主机收到RS时,会把路由器的链路本地地址作为默认路由地址,添加到自己的路由表中。如果路由器列表有多条默认路由器条目,那么主机要给出选定默认路由器的方法。要么是整个默认路由器列表依次轮询,要么选择单台路由器作为默认路由。

3、地址自动配置

当一台IPv6的设备第一次接入链路时,它能够自动配置自己的接口地址。这个过程的第一步就是确定64位接口ID部分,使用MAC-to-EUI64转换法获取接口ID。

当然,接口ID只是IPv6地址的一半,还需要一个64位的前缀。前面提到过,链路本地前缀是0xFF80::/10。用它作为64位前缀(0xFF80::/64),再加上转换后的接口ID,就是一个完整的IPv6地址,可以和同一链路上设备进行通信。

如果一台主机只需要和所在链路上的设备通信,那么它自动配置的链路本地地址就已经满足了。但是如果主机需要和链路之外的设备通信,那么它就需要一个更大范围的地址,通常是一个全球IPv6地址。有两种途径获取这类

转载请注明:http://www.aideyishus.com/lkgx/3406.html

------分隔线----------------------------