【IPv6】IPv6地址格式及地址分类(组播、单播、任播)整理

IPv6地址格式

IPv6 地址从 IPv4 地址的 32 bits 扩展到 128 bits,IPv6 地址的表示、书写方式也从 IPv4 的点分十进制,修改16进制的冒号分割

IPv4 点分格式(.)

192.168.11.11

IPv6 冒号分割(:)

2408:8459:3032:0000:0000:0000:0001:a9fd

IPv6 的规范

IPv6 地址,IETF 在标准中规定了 IPv6 的规范文本表示形式:

省略每个字段中的前导零

压缩前:0000:0000:0000:0000:0000:0000:0000:0001

压缩后:::1

使用双冒号 "::" 替换连续全零的字段

每一块多个前导的0可以省略,一个块全为0可以简写为一个0,,多个块为连续0的话可以简写为:: (地址表示中仅能有一个::)

压缩前:2001:0410:0000:0000:fb00:1200:5000:4500

压缩后:2001:410::fb00:1200:5000:4500

压缩前:2001:0410:0000:1234:fb00:1200:5000:4500

压缩后:2001:410::1234:fb00:1200:5000:4500

压缩前: 3ffe:0000:0000:0000:1010:2a2a:0000:0001

压缩后:3ffe::1010:2a2a:0:1

不允许压缩单个零字段

压缩前: 3ffe:0000:0000:0000:1010:2a2a:0000:0001

压缩后:3ffe::1010:2a2a:0:1

十六进制中的 a, b, c, d, e, f 必须是小写的

2001:0410:0000:1234:fb00:1200:5000:4500

IPv6 地址分类

单播 (Unicast)

单播地址唯一标识一个 IPv6 节点的接口。发送到单播地址的报文将被发送到由该地址标识的接口。

全球单播地址

**全球单播(Global Unicast)**一般从运营商处申请到的IPv6地址空间为/48,三个最高有效位始终设置为001,再由自己根据需要进一步规划:

链路本地单播地址

只在本地链路的节点之间使用,不会被路由(不同的链路上可以重复),用来自动地址配置、邻居发现、路由器发现等等,每个ipv6接口都必须具备的地址,且默认自动配置。类似于windows系统中IPv4的169.254.0.0/16地址(link-local IPv4 address)它的有效范围仅仅在所处链路上。以FE80::/10为前缀,11-64位为0,外加一个64bits的接口标识(一般是EUI-64)。

链路本地地址是仅用于与同一本地链路上的设备进行通信。必须保证这些地址在链路上的唯一性,因为数据包不会被路由到该链路之外。也就是说,路由器不会转发任何以链路本地地址为源地址或目的地址的数据包。所有 IPv6 网络接口都配置链路本地地址,前缀为 fe80::/10 (实际上是 fe80::/64 的子集)。

环回

与 IPv4 环回地址 127.0.0.1 等价。不能将该地址分配给任何物理接口,主机可以利用此地址向自己发送 IPv6 数据包。在路由器等网络设备上,通常使用环回地址来建立路由协议的邻居。

未指定地址

未指定地址是全 0 地址,不能分配给接口。未指定地址被用作源地址以表示接口无 IPv6 地址,仅被用做源地址。

本地唯一地址

其实就是类似ipv4的内网地址,ipv4有三段192.168/16、10/8、172.16~172.31/16,只能在私网内使用,自行配置网段

本地唯一地址的前缀为:fc00::/7,是对 IPv4 私有地址的替换 (RFC 1918),仅供在一个站点或一组站点中本地使用。本地唯一地址具有全局唯一性,但无法在全球互联网上路由。本地唯一地址解决了 IPv4 和 RFC 1918 地址中出现的一些操作问题,被设计用于企业站点或有限的网络集。

ULAs 必须通过在路由器上配置本地前缀 (Router Advertisement) 或通过 DHCPv6 来分配,地址结

内嵌IPv4

映射 IPv4 地址的 IPv6 地址,用来帮助从 IPv4 迁移到 IPv6,如在 IPv6 套接字上处理 IPv4 连接。使用前缀 ::ffff:0:0/96 (0:0:0:0:0:ffff:0:0/96),例如 ::ffff:192.0.2.124。注意,这里的文本表示方式略有不同,以便更容易在 IPv6 地址中嵌入 32 位 IPv4 地址。

这个地址就是把IPv4地址包含在IPv6地址中,把IPv6地址的高80位全部设置为0, 然后中间16位设置为1, 低32位设置为IPv4地址。如下图:

组播 (Multicast)

IPv6 组播(多播)地址是一组接口的标识符(典型在不同节点上)。一个接口可以属于任何数目的组播组。组播地址最高位前8位固定为全1,也就是"FFXX::/8"

IPv6通信的核心大量的使用了组播(邻居发现协议NDP),IPv6不再使用广播。IPv6的任何节点都能够成为一个组播成员,源节点可以发送数据包到组播组,任何一个组播成员都能收到来自这个组播组的数据包。

well-known组播

Interface-local scope
Site-local scope

节点请求(Solicited-Node)

Solicited-Node多播地址前缀是ff02:0:0:0:0:1:ff00::/104,Solicited-Node多播地址用于主要用于NDP(Neighbor Discovery Protocol)协议,NDP协议的功能有两个:

Address resolution

Duplicate Address Detection (DAD)

NDP协议的Address resolution功能就类似IPv4的ARP协议,名字都一样,就是根据IP地址请求MAC地址。DAD功能是用来检测局域网中的所有设备的单播地址都是不同的。

在IPv4环境中,ARP地址解析协议利用广播将MAC请求消息发送给整个以太网链路上的所有主机,目的主机回应ARP Reply从而使发送源获得目的主机的MAC地址。

节点请求则以一种"点对点"的形式将MAC地址请求消息发送到目标主机(因为主机的请求节点组播地址如FF02::1:FFAA:4C3E在整个链路上是唯一的),所以源主机可以直接将节点请求信息发到目标主机节点请求组播地址上,节点请求组播地址是提高MAC地址解析的核心技术,那么这个目标主机的节点请求组播是如何生成的?

节点请求组播的构成如下: 该组播地址是将一个单播IPv6地址(可以是本地链路地址也可以是全球单播地址)的后24位填充到一个请求节点组播地址的124位的固定前缀FF02::1:FF中,生成一个唯一的节点请求组播地址。

如一台IPv6主机的本地链路地址为FECO:0000:0000:0000:0230:18FF:FEAA:4C3E,现在通过对这个地址的实践分析,来理解该地址所对应的节点请求组播地址的构成原理,如下图所示。首先是还原节点请求组播地址的124位固定前缀的标准格式:"FF02:0000:0000:0000:0000:0001:FF"然后取出IPv6主机的本地链路地址FECO:0000:0000:0000:0230:18FF:FEAA:4C3E中的最后24位,填充到"FF02:0000:0000:0000:0000:0001:FF"前缀中,IPv6使用十六进制表达,那么一个十六进制字符是4个二进制位,所以需要将IPv6单播地址中的最后6个字符(二进制为24位)取下填充到124位固定前缀中形成最后的地址:FF02:0000:0000:0000:0000:0001:FFAA:4C3E,最后使用"零压缩"法表示成为:FF02::1:FFAA:4C3E。

IPv6的组播地址与MAC地址的映射关系

IPv6的节点请求多播地址去替代了ARP地址解析协议的目标广播地址255.255.255.255,这只能表示IPv6的节点请求从网络层上的优化与改进,在数据链路层优化则是:

在IPv4的ARP地址解析协议中的请求消息报文的目标链路层地址为FFFF.FFFF.FFFF,那么在IPv6中节点请求消息报文的目标链路层地址是什么?在IPv4中组播的IP地址是可以映射成为数据链路层的MAC地址,在IPv6中这个概念仍然生效,IPv6的节点请求组播地址也可以映射成数据链路层地址,具体方法如下图所示组播的MAC地址是通地IPv6的组播IP地址映射而来,映射的原则是:将IPv6组播地址的后32位取出,填充到固定前缀是3333的MAC地址中来生成数据链路层地址。

Win10系统中通过netsh interface ipv6 show neighbors可查看设备各个接口下的邻居建立情况:

单播地址到Solicited-Node组播地址的映射

Solicited-Node组播地址前104位是固定的,还剩下的24位则是来自单播地址,这剩下24位和单播地址是相同的。如下图,把单播地址的低24位拷贝过来,作为Solicited-Node多播地址的低24位。

这个单播地址可以是全局单播地址,也可以是Link-Local单播地址。

Solicited-Node组播地址到MAC地址的映射

Solicited-Node组播地址要映射到MAC地址上,就是Mac地址的高12位不变,低32位改为Solicited-Node多播地址的低32位。如图所示:

组播地址示例

IPv6 标准为所有的 NTP servers 定义了组播组 ID:0x101

这个组 ID 可以与不同的范围值一起使用:

注意:

临时分配的多播地址只有在定义的范围内才有意义。

组播地址不应用作 IPv6 报文的源地址或出现在任何路由报头中。

node-local scope 修改为 interface-local scope

任播 (Anycast)

任播地址的作用是在多台主机或多台路由器提供相同服务的场合下实现冗余性和负载均衡机制。任播并不专用于IPv6,早在1993年的RFC 1546中就已经将任播定义为用于IPv4的试验性规范。该规范为任播定义了专用前缀,使得通过该前缀即可识别任播地址。任播主要应用于DNS和HTTP等服务。为了正确处理这些非全局唯一的地址,该RFC还讨论了需要对TCP做的可能修改。

但是在实际应用中,任播并没有得到所期望的实现和使用。通常使用的是一种被称为共享单播地址(shared unicast address)的方法。该方法通过将一个普通单播地址分配给多个接口并在路由表中创建多个路由表项。在这种情况下,网络层和传输层都将其视为全局唯一的IP地址。如果不是,那么应用程序中就必须内嵌处理这种有歧义地址的相关机制。一种例外情况就是应用程序采用了独立的无状态请求/应答处理方式,如DNS over UDP。Internet上的根DNS就是使用共享单播地址设立的,该过程无需网络层的任何支持,也能用于IPv6。

IPv6开发人员在设计之初就考虑如何根据RFC 1546将任播融合到网络层中,因而没有为任播分配特殊前缀。IPv6任播地址空间与全局单播地址完全相同,因而必须为任播参与接口明确说明所配置的是任播地址。在接口包含相同任播地址的区域中,必须在路由表中将每台主机都宣告为一条独立的表项。如果多播接口没有可定义的区域,那么就要通过Internet传播所有的任播表项(这是最坏的一种情况),因而建议不使用或严格限制这类全局任播地址。

如果网络中的一组路由器都能提供访问公共路由域的能力,那么就可以为这组路由器分配单个地址。客户端向该地址发送数据包时,会被依次转发给可用路由器。一个例子就是RFC 3068中定义的6to4中继任播地址(将在第10章讨论)。移动IPv6规范也使用了任播地址。

需要注意到是,使用任播地址时,发送端无法控制将数据包发送到特定接口,该决策是在路由协议层面确定的。发送端向任播地址发送多个数据包的时候,数据包可能会到达不同的目的端。因此,如果是一系列请求和应答消息或者数据包被分段了,任播就可能会出现问题。

RFC 4291 规定的子网路由器的任播地址如下:

基本上,该地址看起来像一个常规的单播地址,带有指定子网的前缀和设置为全零的标识符。发送到这个地址的数据包将被发送到该子网的一台路由器上。所有路由器都需要支持它们有接口的子网的子网路由器任播地址。

保留子网任播地址可以有两种格式:

RFC 2526 规定在每个子网内,最大的 128 个接口标识值将保留为子网任播地址分配。

Reserved anycast IDs

这种形式的任播地址和共享单播地址之间的主要区别是,在后者中,应用程序需要支持任播,而在前者中,如果可能的话,将避免这种支持。我们需要指导如何使用它和修改现有的有状态传输协议。

任播地址与共享单播地址在使用上的主要区别在于,使用共享单播地址时,应用必须支持任播,而使用任播地址时,应用可以不支持任播,因而需要有相应的使用指南并说明如何对现有的状态化传输协议进行修改。Draft-doi-ipv6-anycast-func-term-05.txt描述了IPv6任播的使用条件以及使用要点。

任播与组播的区别

任播是将报文转发到一组节点中的一个(仅是一个),而组播却是将 报文转发给一组节点中的所有成员。

Server A, B, C均申明适用任播地址2001:AD02::1, 路由器根据路由协议决定将目的为2001:AD02::1的报文发给三者中的一个(如:Cost最小的Server C)

IPv6 vs. IPv4 特殊地址

| Prefix | Designation | IPv4 equivalent |
| ::/128 | Unspecified This address may only be used as a source address by an initializing host before it has learned its own addresses. | 0.0.0.0 |
| ::1/128 | Loopback This address is used when a host talks to itself over IPv6. This often happens when one program sends data to another. | 127.0.0.1 |
| ::ffff/96 Example: ::ffff:192.0.2.47 | IPv4-mapped Used to embed IPv4 addresses in an IPv6 address. One use for this is in a dual-stack transition scenario where IPv4 addresses can be mapped into an IPv6 address. See RFC 4038 for more details. | No IPv4 equivalent. However, you can search for the mapped IPv4 address in the relevant Whois Database. |
| fc00::/7 Example: fdf8:f535:82e4::53 | Unique Local Addresses (ULAs) Reserved for local use in home and enterprise environments (not public address space). | Private, or RFC 1918 address space: * 10.0.0.0/8 * 172.16.0.0/12 * 192.168.0.0/16 |
| fe80::/10 Example: fe80::200:5aee:feaa:20a2 | Link-Local Addresses Used on a single link or a non-routed common access network, such as an Ethernet LAN. They do not need to be unique outside of that link. May appear as the source or destination of an IPv6 packet. Routers must not forward IPv6 packets if the source or destination contains a link-local address. | 169.254.0.0/16 |
| 2001:0000::/32 Example: 2001:0000:4136:e378:8000: 63bf:3fff:fdd2 | Teredo This is a mapped address allowing IPv6 tunnelling through IPv4 NATs. The address is formed using the Teredo prefix, the server's unique IPv4 address, flags describing the type of NAT, the obscured client port, and the client IPv4 address, which is usually a private address. It is possible to reverse the process and identify the IPv4 address of the relay server, which can then be looked up in the relevant Whois Database. | No IPv4 equivalent |
| 2001:0002::/48 Example: 2001:0002:6c:ab::a | Benchmarking Reserved for use in documentation. They should not be used as source or destination addresses. | 198.18.0.0/15 |
| 2002::/16 Example: 2002:cb0a:3cdd:1::1 | 6to4 A 6to4 gateway adds its IPv4 address to this 2002::/16, creating a unique /48 prefix. As the IPv4 address of the gateway router is used to compose the IPv6 prefix, it is possible to reverse the process and identify the IPv4 address, which can then be looked up in the relevant Whois Database. See how it works on Potaroo. | There is no IPv4 equivalent, but 192.88.99.0/24 has been reserved as the 6to4 relay anycast address prefix by the IETF. |
| 2001:db8::/32 Example: 2001:db8:8:4::2 | Documentation used in examples and documentation. These should never be source or destination addresses. | * 192.0.2.0/24 * 198.51.100.0/24 * 203.0.113.0/24 |
| 2000::/3 | Global Unicast The operators of networks using these addresses can be found using the RIR Whois servers listed in the IANA registry. | No equivalent single IPv4 block |

ff00::/8 Example: ff01:0:0:0:0:0:0:2 Multicast Used to identify multicast groups. They should only be used as destination addresses, never as source addresses. 224.0.0.0/4

参考链接

ipv6地址零压缩方法_IPv6地址详解-CSDN博客https://blog.csdn.net/weixin_39983554/article/details/112415232IPv6 地址格式及报文详解_ipv6格式-CSDN博客https://blog.csdn.net/u013669912/article/details/139904198
华为数通 IPv6 全球单播地址、组播、任播 | Leoco-Blog (zleoco.com)https://www.zleoco.com/?p=2155

相关推荐
Bulestar_xx4 小时前
安全见闻(3)
网络·windows·安全
不会玩技术的技术girl5 小时前
AI 自动化编程的现状与局限
运维·人工智能·自动化
严不鸽7 小时前
Docker 常用总结
运维·docker·容器
小冯的编程学习之路7 小时前
【Linux】:Linux网络协议
linux·运维·网络协议
Just_Do_IT_OK7 小时前
Docker--Apollo-configservice
运维·docker·容器
dalongxia20248 小时前
数据中台从centos升级为国产操作系统后,资源增加字段时,提交报500错误
linux·运维·centos
IT蓝月9 小时前
人工智能-Python网络编程-TCP
网络·python·tcp/ip
木子欢儿9 小时前
debian12安装docker
运维·docker·云原生·容器·eureka
fengxingzhe0089 小时前
OSPFv2协议状态切换(状态机)基本原理-RFC2328
运维·网络·网络协议·面试·ospfv2·ospfv2协议状态机·ospfv2报文交互实例
乐悲蔚蓝湖9 小时前
常见协议位于层数及ACL应用
网络