网络网络层之(3)IPv6地址

网络网络层之(3)IPv6协议

Author: Once Day Date: 2024年4月2日

一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦...

漫漫长路,有人对你微笑过嘛...

全系列文档可参考专栏:通信网络技术_Once-Day的博客-CSDN博客

参考文章:


文章目录

  • 网络网络层之(3)IPv6协议
        • [1. 概述](#1. 概述)
          • [1.1 基础信息](#1.1 基础信息)
          • [1.2 IPv6地址简化表示方法](#1.2 IPv6地址简化表示方法)
        • [2. IPv6地址](#2. IPv6地址)
          • [2.1 IPv6地址构成](#2.1 IPv6地址构成)
          • [2.2 IPv6本地链路地址](#2.2 IPv6本地链路地址)
        • [3. IPv4和IPv6地址转换](#3. IPv4和IPv6地址转换)
          • [3.1 单播地址转换](#3.1 单播地址转换)
        • [4. IPv6组播地址](#4. IPv6组播地址)
          • [4.1 组播地址格式](#4.1 组播地址格式)
          • [4.1 特殊组播地址](#4.1 特殊组播地址)
1. 概述
1.1 基础信息

IPv6地址是互联网协议第六版(Internet Protocol Version 6)的一部分,它是为了解决IPv4地址耗尽问题而设计的新一代互联网地址协议。

IPv6地址使用128位地址长度,相较于IPv4的32位,大幅增加了地址空间,可以为地球上几乎每一粒沙子分配一个唯一的网络地址。

它通常使用十六进制表示,并且通过冒号(:)分隔成8组,每组4个十六进制数。例如,一个IPv6地址可能看起来像这样:2001:0db8:85a3:0000:0000:8a2e:0370:7334

IPv6很多地方规则与IPv4一致,因此本文不再描述那些与IPv4一样的内容,而是谈谈IPv6比较独特的地方。

1.2 IPv6地址简化表示方法

IPv6地址由于其128位的长度,以标准方式表示时非常长,因此在实际使用中,人们通常会采用简化表示法来减少地址的复杂性。IPv6地址简化的基本规则包括以下方面[RFC4291]:

  1. 省略前导零:在IPv6地址的每个16位字段中,可以省略字段起始部分的所有零。例如,"0042"可以简化为"42","0A00"可以简化为"A00"。

  2. 双冒号缩写:在IPv6地址中,一连串的零可以被替换为"::"(双冒号)。这个简化规则只能使用一次,因为多次使用会造成地址不明确。例如,2001:0db8:0000:0000:0000:0000:1428:57ab可以被简化为2001:0db8::1428:57ab。如果地址中有多个零段,通常会将最长的连续零段替换为"::"以进行最大程度的简化。

  3. 在IPv6格式中嵌入IPv4地址可以采用混合符号形式,紧接着IPv4部分的地址块的值为ffff,地址其与部分使用点分四组格式。如::ffff:10.0.0.1表示由IPv4地址(10.0.0.1)映射的IPv6地址。

  4. IPv6地址的低32位通常采用点分四组表示法,例如::0102:f001可以表示为::1.2.240.1,称为IPv4兼容的IPv6地址。

例如,完整的IPv6地址2001:0db8:0000:0000:0000:0000:0000:0001可以被简化为2001:0db8::1

需要注意的是,"::"不能用于省略单个零段,因为这会导致地址的歧义。

RFC5952\]制定了一些规则,以缩小选择范围,减少不必要的混淆。 1. 前导的零必须被压缩,例如`2001::0001`变成`2001::1`。 2. `::`用于影响最大的地方,以压缩最多的零,如果多个块中包含等长度的零,顺序靠前的块将被替换为`::`。 3. a到f的十六进制数字应该使用小写表示。 在URL等场景下,IPv6的冒号会和端口号冲突,因此需要使用括号包围IPv6地址,如下表示: ```yacas https://[2001:6666]:443 ``` ##### 2. IPv6地址 ###### 2.1 IPv6地址构成 IPv6地址比IPv4长了四倍,因此能表示的地址数目范围非常大,也没有像IPv4一样分为A/B/C/D类地址。 IPv6吸取了IPv4子网划分的优点,直接一步到位,使用CIDR表示,通过前缀表示法,来划分许多特殊地址范围,如`fe80::/10`范围内的地址全都是本地链路地址,不能用于公共互联网。 IPv6也没有广播地址,因此不用像IPv4一样去区分子网号和主机号,直接根据地址范围划分作用。 常见IPv6地址范围划分如下: | 前缀 | 描述 | |-----------------|------------------------------------------------------------------------------| | `::/0` | 默认路由条目,不用于寻址。 | | `::/128` | **未指定地址** (Unspecified Address),可用于源IP地址。 | | `::1/128` | **环回地址** (Loopback Address),类似于IPv4中的127.0.0.1。 | | `fc00::/7` | **唯一本地地址** (Unique Local Address, ULA),不用于公共互联网。 | | `fe80::/10` | **链路本地地址** (Link-Local Address),只在单个链路上有效,不会被路由器转发到其他链路。 | | `ff00::/8` | **多(组)播地址** (Multicast Address),仅作为目的IP地址使用。 | | `::ffff:0:0/96` | **IPv4映射地址** (IPv4-mapped IPv6 Address),只用于内部主机。 | | `64:ff9b::/96` | **IPv4-IPv6转换地址** (IPv4-IPv6 Translation Address),用于自动IPv4/IPv6转换机制(如NAT64)。 | 通常一个网络接口上会有多个IPv6地址(本地链路地址+全球单播地址+组播地址等等),而IPv4一般只有一个地址。 ###### 2.2 IPv6本地链路地址 链路本地IPv6地址使用接口标识符(IID)作为组成之一,通常直接由接口的链路层MAC地址形成,如下: ![在这里插入图片描述](https://file.jishuzhan.net/article/1778800030606430210/7299e120790bc55e17b3afd3b1748f61.webp) 在IEEE标准中,EUI表示扩展唯一标识符,分成EUI-64和EUI-48版本。以太网中常用的是EUI-48的短格式版本,两者区别是其长度不一样。 EUI-48也就是常说的MAC地址,其第一个字节最低倒数第二位(U/G)表示该MAC地址是全局MAC地址还是本地MAC地址。 EUI-48通过在第三个字节和第四个字节中插入两个字节(0xFFFE)可以转化成EUI-64地址,再取反(U/G)位,便可以用于链路本地IPv6地址的接口标识符组成。**反转目的是将原来的全局MAC地址变成本地MAC地址,正好对应链路本地IPv6地址含义**。 例如,接口MAC地址是`00:11:22:33:44:55`,那么其IPv6链路本地地址是`fe80::0211:22ff:fe33:4455`。 下面是Linux设备上的IPv6链路本地地址实例: ```yacas ubuntu->~:$ ifconfig eth0 eth0: flags=4163 mtu 1500 inet 10.0.4.17 netmask 255.255.252.0 broadcast 10.0.7.255 inet6 fe80::5054:ff:fe85:f022 prefixlen 64 scopeid 0x20 ether 52:54:00:85:f0:22 txqueuelen 1000 (Ethernet) RX packets 52199351 bytes 16755548321 (16.7 GB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 47234618 bytes 12477606055 (12.4 GB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` Mac地址是`52:54:00:85:f0:22`,有`0x52=b'01010010`,这是一个本地MAC地址,取反之后,即`52:54:00:85:f0:22`。 然后添加`0xFFFE`,便构造出实际的链路本地IPv6地址`fe80::5054:ff:fe85:f022`。 对于其他链路层或者IP隧道协议,会使用各自独特的标识符来创建,例如隧道IP地址。 注意,这里细心的人也许发现了,`52:54:00:85:f0:22`是个本地MAC地址,反转之后不就变成了全局MAC地址呢? 确实如此,这是实践带来的问题,上述设备是qemu虚拟设备,因此使用了本地MAC地址。在\[RFC 4291\]中,明确表示EUI-64地址反转`U/G`位后,其含义仅供参考,不强行要求对应本地链路含义。 **简单来说,修改后的EUI-64地址能对应上"链路本地"含义最好,不能对应也不算是错误,只是一串描述符而已**。 ##### 3. IPv4和IPv6地址转换 ###### 3.1 单播地址转换 在一些IPv6和IPv4过渡的网络中,需要在IPv4和IPv6之间进行转换,相关内容可以参考\[RFC6144\]和\[RFC6052\]。 该方案使用一种特殊地址格式,称为嵌入IPv4的IPv6地址,可采用如下的六种格式来进行编码: ![在这里插入图片描述](https://file.jishuzhan.net/article/1778800030606430210/e334db9b0214a802be063078bf632729.webp) 其中`64:ff9b::/96`是一个非常有名的转换前缀,正好对应这里面的`/96`情况。除了知名前缀之外,也可以是组织为转换器分配的唯一前缀。**标识对应的8位必须全为0,以保持与\[RFC4291\]指定标识符的兼容性,后缀位被保留,并且也应该设置为0**。 ##### 4. IPv6组播地址 ###### 4.1 组播地址格式 IPv6中,前缀`ff00::/8`已被预留给组播地址,其中后面的112位可用于保存组号,如下所示。 ![在这里插入图片描述](https://file.jishuzhan.net/article/1778800030606430210/42330abd68e20233c7212d36c37fe8a7.webp) 基本的IPv6组播格式包含4个标志位: * `0`,保留位。 * `R`,包含会合点。 * `P`,使用单播前缀。 * `T`,临时的地址。 4位的范围值用于表示组播的范围(全球/本地等),如下所示: | 范围值 | 描述 | |-----------------|----------| | 0/3/4/6/7/9-d/f | 保留和未分配的值 | | 1 | 接口和机器本地 | | 2 | 链路和子网本地 | | 5 | 站点本地 | | 8 | 组织本地 | | e | 全球 | 例如,对于IANA分配的NTP服务协议组播地址,可以跨越多个地址范围,即可变范围的组播地址`ff0x::101`,如下所示: | 地址 | 描述 | |-------------|--------------------| | `ff01::101` | 同一机器中的所有NTP服务器 | | `ff02::101` | 同一链路/子网中的所有NTP服务器 | | `ff04::101` | 某些管理定义范围内的所有NTP服务器 | | `ff05::101` | 同一站点中的所有NTP服务器 | | `ff08::101` | 同一组织中的所有NTP服务器 | | `ff0e::101` | Internet中的所有NTP服务器 | 标志位(P/R/T)含义如下: | 位字段(标志) | 描述 | |---------|-------------------------| | R | 会合点标志(0-常规的,1-包括RP地址) | | P | 前缀标志(0-常规的,1-基于单播前缀的地址) | | T | 临时标志(0-永久分配的,1-临时的) | 当P位设置为1时,无须基于每个组的全球性许可,可以采用以下两个方法确定地址: * 基于单播前缀的IPv6组播地址分配,提前拿到一个分配的单播前缀,然后同时分配一个有效的组播地址集合。 * 链路范围的IPv6组播,使用接口标识符,组播地址基于主机的IID标识。 P位设置为1通常也要求T位也为1,上述两种组播地址格式如下所示: ![在这里插入图片描述](https://file.jishuzhan.net/article/1778800030606430210/04c744f8ac426ecad0b30259aa747eed.webp) 例如,一个组织分配了一个单播前缀`3ffe:ffff:1::/48`,同时也会分配一个基于单播的组播前缀`ff3x:30:3ffe:ffff:1::/96`。 * `x`表示组播范围可以由该组织自行选择,例如链路本地(2)和组织本地(8)。 * `3`表明P和T位同时设置,这个地址是基于单播前缀的IPv6组播地址分配,并且是动态的。 * `30`是指单播地址前缀长度为48,然后后面接着单播前缀`3ffe:ffff:1`。 在创建唯一的链路本地范围的组播地址,可以使用接口标识符IID构建组播地址,前缀长度需要固定为255,范围只能为接口本地和链路本地。 当R和P字段设置为1时,表示组播路由协议需要知道一个会合点(RP),即可以处理一个或者多个组播组的组播路由器的IP地址。其格式如下: ![在这里插入图片描述](https://file.jishuzhan.net/article/1778800030606430210/65c01d29c0b55c6c8f85c5d17938181f.webp) RIID字段值是RP的IP地址的低4位,其余部分用零填充。 例如,对于组播地址`ff75:940:2001:db8:dead:beef:f00d:face`,其范围为5(站点本地),RIID值为9,前缀长度为64(0x40),所以单播前缀为`2001:db8:dead:beef/64`,RP地址则为`2001:db8:dead:beef::9`。 ###### 4.1 特殊组播地址 这些地址用于IPv6协议的不同方面,包括路由协议、网络管理以及特定的网络服务。例如,ff02::1地址用于标识同一链路上的所有节点,而ff02::2用于标识同一链路上的所有路由器。Solicited-Node地址有助于IPv6邻居发现过程,它是通过在IPv6地址的最后24位前添加ff02::1:ff前缀来构造的。 | 组播地址 | 范围 | 描述 | |---------------------|--------|-----------------| | `ff01::1` | 节点 | 所有节点 | | `ff01::2` | 节点 | 所有路由器 | | `ff01::fb` | 节点 | mDNSv6 | | `ff02::1` | 链路 | 所有节点 | | `ff02::2` | 链路 | 所有路由器 | | `ff02::4` | 链路 | DVMRP路由器 | | `ff02::5` | 链路 | OSPFIGP | | `ff02::6` | 链路 | 基于OSPFIGP设计的路由器 | | `ff02::9` | 链路 | RIPng路由器 | | `ff02::a` | 链路 | EIGRP路由器 | | `ff02::d` | 链路 | PIM路由器 | | `ff02::16` | 链路 | 支持MLDv2的路由器 | | `ff02::6a` | 链路 | 所有探测器 | | `ff02::6d` | 链路 | LL-MANET路由器 | | `ff02::fb` | 链路 | mDNSv6 | | `ff02::1:2` | 链路 | 所有DHCP代理 | | `ff02::1:3` | 链路 | LLMNR | | `ff02::1:ffxx:xxxx` | 链路 | 请求节点地址范围 | | `ff05::2` | 站点 | 站点本地作用域的所有路由器 | | `ff05::fb` | 站点 | mDNSv6 | | `ff05::1:3` | 站点 | 所有DHCP服务器 | | `ff0x::` | 可变的 | 保留 | | `ff0x::fb` | 可变的 | mDNSv6 | | `ff0x::101` | 可变的 | NTP | | `ff0x::133` | 可变的 | 聚合服务器访问协议 | | `ff0x::18c` | 可变的 | 所有AC的地址 | | `ff3x::/32` | (特殊范围) | SSM块 | ![Alt](https://file.jishuzhan.net/article/1778800030606430210/b46f38c696823aac479ed3eb78afee1c.webp) ### Once Day ***也信美人终作土,不堪幽梦太匆匆......*** **如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!** **(。◕‿◕。)感谢您的阅读与支持\~\~\~**

相关推荐
巴巴_羊1 小时前
前端面经 计网 http和https区别
网络协议·http·https
LyaJpunov4 小时前
HTTPS全解析:从证书签发到TLS握手优化
网络协议·http·https
你曾经是少年4 小时前
HTTPS
网络协议·http·https
2501_915918414 小时前
多账号管理与自动化中的浏览器指纹对抗方案
websocket·网络协议·tcp/ip·http·网络安全·https·udp
firshman_start5 小时前
第十五章,SSL VPN
网络
Johnstons6 小时前
AnaTraf:深度解析网络性能分析(NPM)
前端·网络·安全·web安全·npm·网络流量监控·网络流量分析
落——枫6 小时前
路由交换实验
网络
网络空间小黑6 小时前
常见WEB漏洞----暴力破解
计算机网络·安全·web安全·网络安全·系统安全·网络攻击模型·安全架构
Johny_Zhao6 小时前
K8S+nginx+MYSQL+TOMCAT高可用架构企业自建网站
linux·网络·mysql·nginx·网络安全·信息安全·tomcat·云计算·shell·yum源·系统运维·itsm
Thebluewinds6 小时前
一周学完计算机网络之三:1、数据链路层概述
计算机网络