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

news2024/11/20 23:15:04

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


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

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

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

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

参考文章:

  • 《TCP/IP详解卷一》
  • IEEE RA Guidelines for Use of EUI, OUI, and CID
  • IPv6本地链路地址生成方式_ipv6_addr_gen_mode-CSDN博客
  • RFC 2373: IP Version 6 Addressing Architecture (rfc-editor.org)
  • RFC 2464: Transmission of IPv6 Packets over Ethernet Networks (rfc-editor.org)
  • RFC 4291: IP Version 6 Addressing Architecture (rfc-editor.org)

文章目录

  • 网络网络层之(3)IPv6协议
        • 1. 概述
          • 1.1 基础信息
          • 1.2 IPv6地址简化表示方法
        • 2. IPv6地址
          • 2.1 IPv6地址构成
          • 2.2 IPv6本地链路地址
        • 3. IPv4和IPv6地址转换
          • 3.1 单播地址转换
        • 4. IPv6组播地址
          • 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地址,如下表示:

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/96IPv4映射地址 (IPv4-mapped IPv6 Address),只用于内部主机。
64:ff9b::/96IPv4-IPv6转换地址 (IPv4-IPv6 Translation Address),用于自动IPv4/IPv6转换机制(如NAT64)。

通常一个网络接口上会有多个IPv6地址(本地链路地址+全球单播地址+组播地址等等),而IPv4一般只有一个地址。

2.2 IPv6本地链路地址

链路本地IPv6地址使用接口标识符(IID)作为组成之一,通常直接由接口的链路层MAC地址形成,如下:

在这里插入图片描述

在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链路本地地址实例:

ubuntu->~:$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  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<link>
        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地址,可采用如下的六种格式来进行编码:

在这里插入图片描述

其中64:ff9b::/96是一个非常有名的转换前缀,正好对应这里面的/96情况。除了知名前缀之外,也可以是组织为转换器分配的唯一前缀。标识对应的8位必须全为0,以保持与[RFC4291]指定标识符的兼容性,后缀位被保留,并且也应该设置为0

4. IPv6组播地址
4.1 组播地址格式

IPv6中,前缀ff00::/8已被预留给组播地址,其中后面的112位可用于保存组号,如下所示。

在这里插入图片描述

基本的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::101Internet中的所有NTP服务器

标志位(P/R/T)含义如下:

位字段(标志)描述
R会合点标志(0-常规的,1-包括RP地址)
P前缀标志(0-常规的,1-基于单播前缀的地址)
T临时标志(0-永久分配的,1-临时的)

当P位设置为1时,无须基于每个组的全球性许可,可以采用以下两个方法确定地址:

  • 基于单播前缀的IPv6组播地址分配,提前拿到一个分配的单播前缀,然后同时分配一个有效的组播地址集合。
  • 链路范围的IPv6组播,使用接口标识符,组播地址基于主机的IID标识。

P位设置为1通常也要求T位也为1,上述两种组播地址格式如下所示:

在这里插入图片描述

例如,一个组织分配了一个单播前缀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地址。其格式如下:

在这里插入图片描述

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

Once Day

也信美人终作土,不堪幽梦太匆匆......

如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!

(。◕‿◕。)感谢您的阅读与支持~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1572640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JQuery(一)---【JQuery简介、安装、初步使用、各种事件】

零.前言 在学习JQuery前&#xff0c;您需要具备以下知识&#xff1a; HTML相关知识(DOM)CSS相关知识JavaScript相关知识 一.JQuery 1.1JQuery简介 JQuery是一个JavaScript的“函数库”&#xff0c;不是JavaScript的一个框架&#xff0c;与“VUE、REACT”有本质区别&#x…

Java栈和队列的实现

目录 一.栈(Stack) 1.1栈的概念 1.2栈的实现及模拟 二.队列(Queue) 2.1队列的概念 2.2队列的实现及模拟 2.3循环队列 2.4双端队列&#xff08;Deque&#xff09; 一.栈(Stack) 1.1栈的概念 栈:一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作…

【详细讲解0基础如何进入IT行业】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【HTML】常用CSS属性

文章目录 前言1、字体和文本属性2、边距和填充3、border边框4、列表属性 前言 上一篇我们学习了CSS扩展选择器以及它的继承性&#xff0c;对于页面元素样式设置相信大家都不陌生了。 这一篇我们就来看看具体都有哪些样式可以设置&#xff1f;又该如何设置&#xff1f; 喜欢的【…

爬虫 新闻网站 以湖南法治报为例(含详细注释,控制台版) V2.0 升级自定义查询关键词、时间段

目标网站&#xff1a;湖南法治报 爬取目的&#xff1a;为了获取某一地区更全面的在湖南法治报已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#xff0c;Python3.10&#xff0c; 安装的包&#xff1a;requests&#xff0c;csv&#xff…

Tailwind 4.0 即将到来:前端开发的“速度与激情”

随着前端开发技术的不断进步&#xff0c;我们每天都在寻找更快、更简洁的解决方案来提升我们的开发效率和用户体验。今天&#xff0c;我要为大家介绍一项令人振奋的新技术进展——Tailwind 4.0的来临&#xff01; 对于经常使用Tailwind的朋友们来说&#xff0c;这个消息无疑是激…

java 常见API(Objects)

定义 API就是别人定义好的工具类和工具包目的&#xff1a;避免重复造轮子&#xff0c;提升开发效率&#xff0c;更加专注于实现业务逻辑 Object 类 object类是所有类的祖宗类&#xff0c;所有的类型都是可以使用Object的方法的 最常见的三个方法&#xff1a; toString:print就会…

蓝桥杯每日一题:约数个数(质因数)

题目描述&#xff1a; 输入 n 个整数&#xff0c;依次输出每个数的约数的个数。 输入格式 第一行包含整数 n。 第二行包含 n 个整数 ai。 输出格式 共 n 行&#xff0c;按顺序每行输出一个给定整数的约数的个数。 数据范围 1≤n≤1000, 1≤ai≤10^9 输入样例&#xff…

coreldraw是什么软件?最新中文2024版本cdr有哪些功能

CorelDRAW&#xff0c;通常也被称为CDR&#xff0c;是由加拿大Corel公司出品的一款平面设计软件。该软件以其强大的矢量图形制作和排版功能而著称&#xff0c;主要面向绘图设计师和印刷输出人员。 CorelDRAW提供了丰富的绘图工具&#xff0c;包括圆形、矩形、多边形、方格、螺…

FJSP:小龙虾优化算法(Crayfsh optimization algorithm,COA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem&#xff0c;FJSP&#xff09;&#xff0c;是一种经典的组合优化问题。在FJSP问题中&#xff0c;有多个作业需要在多个机器上进行加工&#xff0c;每个作业由一系列工序组成&a…

Linux-线程知识点

目录 线程与进程区别pthread库接口介绍pthread_createpthread_self和syscall(SYS_gettid);pthread_equal测试主线程的栈空间大概是多大pthread_setname_nppthread_exitpthread_join为什么要连接退出的线程 pthread_detach 线程与进程区别 进程是一个动态的实体&#xff0c;有自…

java之static详细总结

static也叫静态&#xff0c;可以修饰成员变量、成员方法。 成员变量 按照有无static分为两种&#xff1a; 类变量&#xff1a;static修饰&#xff0c;属于类&#xff0c;与类一起加载一次&#xff0c;在内存中只有一份&#xff0c;会被类的全部对象共享实例变量&#xff08;…

【C++ STL有序关联容器】set 集合

文章目录 【 1. 基本原理 】【 2. set 的定义 】2.1 调用默认构造函数&#xff0c;创建空的 set 容器2.2 在创建 set 容器的同时&#xff0c;对其进行初始化2.3 拷贝构造的方式创建2.4 取已有 set 容器中的部分元素&#xff0c;来初始化新 set 容器2.5 修改排序规则的方式创建 …

web安全学习笔记(6)

记一下第十节课的内容。 一.PHP语言中的if else判断 语法和c语言中非常类似&#xff0c;不再赘述&#xff0c;也可以使用if...elseif...elseif...else 1.True和False 2.&#xff0c;和 一个等号是赋值 两个等号是比较 三个等号是全等&#xff08;内容相等&#xff0c;数…

职场中的情绪管理:如何应对工作中的愤怒情绪?

在职场中&#xff0c;我们常常会遇到一些让我们感到愤怒的事情。或许是同事的不配合&#xff0c;或许是上司的不理解&#xff0c;又或许是客户的无理取闹。然而&#xff0c;作为一个职业人&#xff0c;我们需要学会如何管理自己的情绪&#xff0c;尤其是愤怒情绪&#xff0c;以…

linux文件权限与数字转化

chmod命令——change mode&#xff0c;可以对特定文件文件夹权限进行更改 这里我们看到&#xff0c;当执行了chmod u-x try.sh后&#xff0c;try文件底色变为白色&#xff0c;即为其执行权限被“减去” 在linux系统中&#xff0c;权限的减去是通过权限的数字表示来实现的&#…

elment UI el-date-picker 月份组件选定后提交后台页面显示正常,提交后台字段变成时区格式

需求&#xff1a;要实现一个日期的月份选择<el-date-picker :typeformData.dateType :value-formatdateFormat v-modelformData.leaveFactoryDateplaceholder选择月份></el-date-picker>错误示例&#xff1a;将日期显示类型(type)dateType或将日期绑定值的格式(val…

016——DHT11驱动开发(基于I.MX6uLL)

目录 一、 模块介绍 1.1 简介 1.2 电路描述 1.3 通信协议 二、 驱动程序 三、 应用程序 四、 上机实验 一、 模块介绍 1.1 简介 DHT11 是一款可测量温度和湿度的传感器。比如市面上一些空气加湿器&#xff0c;会测量空气中湿度&#xff0c;再根据测量结果决定是否继续加…

P8749 [蓝桥杯 2021 省 B] 杨辉三角形

[蓝桥杯 2021 省 B] 杨辉三角形 题目描述 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如下数列&#xff1a; 1 , 1 , 1 , 1 , 2 , 1 , 1 , 3 , 3 , 1 , 1 , 4 , 6 , 4 , 1 , … 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1, …

LeetCode 1483.树节点的第 K 个祖先:树上倍增

【LetMeFly】1483.树节点的第 K 个祖先&#xff1a;树上倍增 力扣题目链接&#xff1a;https://leetcode.cn/problems/kth-ancestor-of-a-tree-node/ 给你一棵树&#xff0c;树上有 n 个节点&#xff0c;按从 0 到 n-1 编号。树以父节点数组的形式给出&#xff0c;其中 paren…