IPv6基础介绍

2023-10-27

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

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

IPv6报文格式 

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

IPv6基本报头

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

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

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扩展报头中主要字段解释如下:

  • 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地址压缩格式

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

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

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

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

IPv6地址类型

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

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

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

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

IPv6单播地址

全球单播地址

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

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

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

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

链路本地地址

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

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

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

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

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

唯一本地地址

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

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

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

字段解释:

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。

说明

在单播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组播地址的前缀是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拷贝而来。

被请求节点组播地址

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

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

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

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

IPv6任播地址

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IPv6基础介绍 的相关文章

  • 若依框架 路由带参数跳转有缓存的解决方法

    若依框架的话 直接打开src api router index js路由配置项 path storage component Layout hidden true redirect noredirect children path orde
  • 关于SpringCloudAlibaba,看阿里这篇笔记真香

    Spring Cloud Alibaba 是国产的微服务开发一站式解决方案 与原有 Spring Cloud 兼容的同时对微服务生态进行扩展 通过添加少量的配置注解 便可实现更符合国情的微服务架构 相比 Spring Cloud 官方标准
  • C++中"endl"和"\n"的区别

    换行符 endl 该符号与 n 的区别 endl 除了具备 n 的功能外 还调用输出流flush函数 刷新缓冲区 让数据直接写入文件或者屏幕上 这两种都可以用的 不过如果需要立即显示 比如输入到显示器的场合 最好用 endl 如果不需要立即
  • 《蓝桥杯真题》:2020年单片机省赛(第十一 / 11届第一场)

    2020年单片机省赛 有关题目 实现代码 main c 写法一 写法二 iic h iic c 有关题目 实现代码 注意 代码实现方面 从eeprom读出数据的过程中要注意不跟和从pcf8591读取数据一样 不需要rd eeprom 0x0
  • go之构建简单的web服务器3.0

    引入etcd模块 实现对etcd的增删改 目录架构如下 etcd go代码 package storage import context time fmt errors clientv3 go etcd io etcd client v3

随机推荐

  • C与PHP的联系与区别

    联系 1 PHP是C语言实现的一个应用软件 PHP的程序执行 最终也是调用C函数 很多时候 一些要优化性能的工作可以通过对PHP进行C扩展来实现 区别 0 PHP是面向对象语言 C是面向过程的函数过程式语言 1 PHP是弱类型语言 使用变量
  • 【Inno Setup】Inno Setup覆盖安装前执行卸载、获取原安装路径

    Inno Setup Inno Setup覆盖安装前执行卸载 获取原安装路径 分享下目前用到的一个简单的 Inno Setup 安装包制作脚本 主要功能有3个 安装前检测是否已安装 如果是覆盖安装则提示是否先进行卸载 程序卸载时不会自动卸载
  • Navicat Premium下sql导入中文乱码解决方案

    最近帮客户导数据比较多 用阿里云感觉不方便 Navicat Premium还是好用 但是数据稻城excel就会乱码 解决方案 1 看图说话 右键选中 2 三条SQL完成 mysql gt show databases Database in
  • 「Python 面试」第六次面试

    1 说一说 Redis 是什么 Redis 是一种 Key Value 的内存型 非关系型数据库 属于 NoSQL 的一种 Redis 的读写速度特别快 特别适合读写频繁的场景 Redis 支持主从复制 支持数据持久化 2 知道 Redis
  • MMD相关制作

    1 导入可转换mmd和vmd 动作数据 的插件 导入后unity中为 2 导入模型和vmd和音频 3 在unity中点击模型右边弹出的协议全打勾并应用 4 其中的mmd动作数据转换成功 点击人物把rig下第一个选择Huamoid点击应用 再
  • Vue中nextTick使用

    1 语法 this nextTick 回调函数 2 作用 在下一次Dom更新结束后执行其指定的回调函数 3 使用场景 当数据改变后 要基于更新后的新Dom进行某些操作时 要在nextTick所指定的回调函数中执行
  • 查询oracle所用用户,查询所有用户(oracle查询所有用户)

    查询所有用户 oracle查询所有用户 2020 07 24 11 10 05 共10个回答 1 查询oracle中所有用户信息select fromdba users 2 只查询用户和密码selectusername passwordfr
  • 数据结构---桶排序

    桶排序 第一步 第二步 第三步 第四步 JAVA实现 时间复杂度 空间复杂度总结 每一个桶 bucket 代表一个区间范围 里面可以承载一个或多个元素 第一步 就是创建这些桶 并确定每一个桶的区间范围 我们这里创建的桶数量等于原始数列的元素
  • python Matplotlib库基础

    目录 Matplotlib 数据可视化入门 Pyplot 绘图 自定义配置文件 rcParams 创建绘图窗口 绘制子图 绘制饼图 绘制折线图 绘制条形图 绘制散点图 绘制热点图 绘制箱型图 绘制分类图背景 显示绘图窗口 DataFrame
  • FATFS文件系统f_mkfs函数详解

    1 f mkfs参数 参数path 要挂载 卸载的逻辑驱动器号 使用设备根路径表示 参数opt 系统的格式 如图所示 若需要格式化为FAT32文件系统 则选择FM FAT32即可 若需要格式化为exFAT文件系统 则应该开将宏定义 defi
  • kNN做回归任务

    kNN回归 kNN常用作分类任务 但是也可以做回归任务 做法 使用kNN计算某个数据点的预测值时 模型会从训练数据集中选择离该数据点最近的k个数据点 并且把他们的y值取均值 把该均值作为新数据点的预测值 代码 此次代码演示使用数据库中的鸢尾
  • AI业务强劲增长,百度迎来了“推卒过河”的纵横时刻

    文 螳螂观察 作者 陈淼 科技创新面临的处境与机遇大多与中国象棋中的 卒 相似 单次只能走一步 不像其他棋子一次能走多步 然而一旦 推卒过河 卒 就可纵可横 能发挥出极大的作用 因此 也就有了 过河走卒胜似车 的谚语 这种境遇像极了今天在人
  • linux下执行shell脚本报“ $'\r':command not found…”错误

    1 现象 在linux下执行脚本有时会出现错误如下 r command not found 2 原因分析 脚本本身却没有错误 是由于脚本在windows下打开过编辑过 因为在windows下的换行是回车 换行 r n 而在linux下的换行
  • BeautifulSoup解析通过js生成内容的本地html文件

    问题 当本地html文件中的元素都是由js生成时 我们无法通过beautifulsoup进行解析 思路 1 通过webdriver的无头浏览器 不在桌面打开浏览器的情况下 通过浏览器引擎加载html文件 2 获取浏览器的页面资源 3 将资源
  • 命名Java变量

    Java变量的命名规则 在面向对象编程中 对于包 类 方法和常量的命名都是有规则的 例如 英文大小写的区分 1 包的命名 包的命名都是由小写字母组成 为了保障每个Java包命名的唯一性 应在自己定义的包的名称前加上唯一的前缀 例如 edu
  • java solr功能代码

    package com wlsq search center util import org apache solr client solrj SolrQuery import org apache solr client solrj im
  • 《数据结构》02-线性结构3 Reversing Linked List

    题目 Given a constant K and a singly linked list L you are supposed to reverse the links of every K elements on L For exam
  • dns备用服务器信息,dns服务器地址(dns首选和备用填多少)

    dns服务器地址 DNS是计算机域名体系 DomainNameSystem或DomainNameService 的缩写 它是由解析器以及域名服务器组成的 域名服务器是指保存有该网络中所有主机的域名和对应IP地址 并具有将域名转换为IP地址功
  • CocosCreator Java传参数到JS

    最近正在接GooglePlay内购 在传参数回CocosCreator的环境的时候 没有调用到JS的方法 其中错误的写法是 app runOnGLThread new Runnable Override public void run Co
  • IPv6基础介绍

    IPv4理论上仅仅能够提供的地址数量是43亿 但是由于地址分配机制等原因 实际可使用的数量还远远达不到43亿 因特网的迅猛发展令人始料未及 同时也带来了地址短缺的问题 针对这一问题 曾先后出现过几种解决方案 比如CIDR和NAT 但是CID