IPv6协议结构


网络协议分析 IPv6协议部分

[TOC]

网络协议分析之IPv6协议基础

#	掌握IPv6协议栈的常用命令
#	掌握lPv6单播地址的使用方法

IPv6的特征:

IPv6地址:

IPv6地址空间:
IPv6地址空间分配情况
>

IPv6地址有三种表示形式:首选地址,压缩格式和内嵌IPv4的IPv6地址格式

首选格式

128位地址用16位边界分成8组,每个组转换成4位十六进制数用冒号分隔,称为冒号十六进制

压缩格式

零压缩:连续为0的组可以压缩为::(双冒号)

删除每组的前导0, 把连续的一段0压缩为:: ,在一个IPv6地址中::只能出现一次

零压缩只能在给定地址中使用一次,不能使用零压缩来包括某个组的一部分

IPv4的IPv6地址格式:

在IPv4和IPv6的混合环境中,IPv6地址中的最低32位可以用于表示lPv4地址,即:X:X:X:X:X:d.d.d.d,其中X表示16进制整数,而d表示十进制整数

IPv6格式前缀(FP, Format Prefix)
  • 类似于IPv4中的CIDR表示法,IPv6地址被分成两个部分:子网前缀和接口标识符
  • IPv6地址前缀格式为:IPv6地址/前缀长度
    • 1030:0:0:0:C9B4:FF12:48AA:1A2B/60,用于路由的前缀长度为60位。
    • 前缀是地址的一部分,这部分或者有固定的值,或者是路由或子网的标识。64位前缀用来表示节点所在的单个子网,所有子网都有相应的64位前缀。任何少于64位的前缀,或者是一个路由前缀,或者是包含了部分IPv6地址空间的一个地址范围

IPv6地址结构

  • 全球路由前缀:识别分配给一个站点的某个特殊地址或地址范围
  • 子网ID:用于识别站点中的某个链路,一个子网ID与一个链路相关联,也可以将多个子网ID分配给一个链路
  • 接口ID:用于识别和指明链路上的一个接口,并且接口ID在该链路上必须是唯一的

接口标识的生成:由IEEE EUI - 64规范自动生成,设备随机生成,或手工配置。

EUI - 64规范(Extended Unique ldentifier)

  • 将48比特的MAC地址转化为64比特的接口标识,因此理论上可多达264个不同的物理接口
  • 转换方法:在MAC地址的中间插入4位16进制数FFFE,再把从最高位开始的第7位U/L位取反(置1)
IPv6地址的分配

IPv6地址是分配给接口的,在IPv6网络中一个接口可以有一个或多个IPv6地址(单播地址、任播地址和多播地址)

一个节点的每个接口都需要至少一个单播地址。同时,一个单播地址只能与一个网络接口相关联

IPv6地址类别

单播地址(Unicast Address):用来标识单一网络接口。送往一个单播地址的包将被传送至该地址标识的接口上。

组播地址(Multicast Address):用来标识一组网络接口(通常属于不同的节点)。送往一个组播地址的包将被传送至有该地址标识的所有接口上。
任播(泛播)地址(Anycast Address):用来标识一组网络接口。送往泛播地址的包将被传送至该地址标识的接口之一(路由距离“最近”的接口)。它是IPv6引入的新的地址类型。

单播地址

单播地址包括全球单播地址、链路本地地址、站点本地地址、特殊地址、兼容地址、NSAP地址

可聚类全球单播地址

相当于IPv4公共地址,有3个部分:

  • ISP分配的前缀

  • 站点拓扑,组织机构使用ISP分配的一个48位前缀,可以用前缀的49—64位共16位把网络划分为子网,最多可以划分65535个子网

  • 接口ID:低64位用于标识接口

全球单播地址报文格式:

  • FP字段:格式前缀,3位,目前值为"001",标识这是可集聚全球单播地址
  • TLAID字段:顶级集聚标识符,13位,包含最高级地址选路信息,即网络互连中最大的选路信息,可得到最大8192个不同的顶级路由
  • RES字段:8位,保留。最终可能会用于扩展顶级或下一级集聚标识符字段。
  • NLAID字段:下一级集聚标识符,24位,该标识符被一些机构用于控制顶级集聚以安排地址空间,这些机构能按照他们自己的寻址分级结构来将此24位字段切开用
  • SLAID字段:站点级集聚标识符,16位,获得48位前缀的组织机构用来安排内部网络结构,若字段全部用作平面地址空间,则最多可有65535个不同子网
  • 接口标识符字段:64位,IEEE EUI-64接口标识符

链路本地地址具有固定的地址格式,由设备自动生成,范围限制在同一本地链路的节点之间,在邻居发现等IPv6机制中或者没有路由器的网络上用到该类型的地址

  • 链路本地地址的组成包括一个特定的前缀FE80::/64和低64位的EUI-64接口ID

  • 节点启动IPv6协议栈时,节点的每个接口会自动分配一个链路本地地址,这种机制的特点是连接在同一链路上的两个IPv6节点不需要做任何配置就可以通信

  • 路由器在源端和目的端对具有链路本地地址的包不予处理,因为永远也不会转发这些包

在lPv6中,一个有可聚类全球单播地址的节点在本地链路上,使用默认IPv6路由器的链路本地地址,而不使用路由器的可聚类全球单播地址。如果必须发生网络重新编址,即单播可聚类全球前缀更改为一个新的单播可聚类全球前缀时,总能使用链路本地地址到达默认路由器。在网络重新编址过程中,节点和路由器的链路本地地址不会发生变化

站点本地地址(Site-local)

站点本地地址也是应用范围受限的地址,类似于IPv4专用地址,可供没有申请到可聚类全球单播地址的组织机构使用

  • 站点本地地址不是自动生成的
  • 前48位是固定的,其中前10位是固定的二进制位组合1111111011,后面是38位0(FEC0:/48),接着是提供单位构建子网的16位的子网ID字段,最后是EUI-64接口ID
  • 站点本地地址能用在内联网中传送数据,但不允许从站点直接选路到全球Internet。站点内的路由器只能在站点内转发包,而不能把包转发到站点外去。
特殊地址和保留地址
  • IPv6地址空间中,第一个1/256的大部分空的地址空间用作特殊地址,包括:
    1. 未指定地址:全0地址,当没有有效地址时,可采用该地址。作为源地址使用,不能被路由器转发。可以表示为0:0:0:0:0:0:0:0或::
    2. 回返地址:除了最低位外,全为0,即0:0:0:0:0:0:0:1或::1。
    3. 嵌有IPv4地址的IPv6地址:一类允许IPv6节点访问不支持IPv6的IPv4节点(IPv4映象地址),另一类允许IPv6路由器用隧道方式,在IPv4网络上传送IPv6包(IPv4兼容地址)
  • NSAP和IPX地址分配
    • lPng的目标之一是要统一整个网络世界,使IP、IPX和OSI网络间能进行互操作。为了支持这种互操作性,IPv6为OSI和IPX各保留了1/128地址空间。IPX地址格式尚未精确定义
    • NSAP地址分配的描述见RFC1888 (OSI NSAP和IPv6)

多播地址:

多播指的是源节点发送的单个数据报可以被指明的多个目的节点收到

  • IPv6协议中的多播地址用最高8位是11111111(FF)来标识多播地址
  • 多播地址只能用作目的地址。
  • 标识字段:地址格式中的第1个字节为全"1"(FF),标识其为多播地址

  • 标志字段:占4位。目前只定义了第4位,用"0"表示该地址是由Internet编号机构指定的熟知多播地址,1表示特定场合使用的临时多播地址

  • 范围字段:占4位,用来限制多播数据流在网络中发送的范围,见下表

  • 组标识符字段:占112位,用于标识多播组,最多可以编码2112个组的ID。
IPv6具有特别含义的特殊多播地址
  • FF01::1表示节点本地范围内所有节点多播地址;
  • FF02::1表示链路本地范围内所有节点多播地址;
  • FF01:2表示节点本地范围内所有路由器多播地址;
  • FF02::2表示链路本地范围内所有路由器多播地址;
  • FFO5::2表示站点本地范围内所有路由器多播地址。
  • IPv6多播地址中有一种特殊用途的请求节点(Solicited-node)多播地址,主要用于重复地址检测(DAD)和获取邻居节点的链路层地址。请求节点多播地址由前缀FFO2::1:FFO0:0/104和单播地址的最后24位组成。

当节点预订多播地址时,它声明要成为多播的一个成员,于是任何本地路由器将以该节点的名义预订多播地址。同一网络上的其他节点要发送信息到该多播地址时,IP多播包将被封装到链路层多播数据传输单元中,发送给每个订户。从本地网以外来的多播,用同样方法处理,只是传递给路由器,由路由器把包转发给预订节点。

路由器不转发广播包,但对多播而言只要路由器以其它节点的名义预订多播地址,就能有选择地转发多播包

任播地址

任播地址是IPv6协议特有的地址类型

多个节点共享一个任播地址,但只有一个节点接收给任播地址的数据报。适合于一对一组中的一个(One to One of Many)的通信需求

任播地址用来标识通常属于不同节点的一组网络接口,路由器把目标地址是任播地址的数据报发送给离该路由器"最近"的一个接口

  • 任播地址只能用作IPv6数据报的目的地址,只能分配给IPv6路由器
  • 任播对某些类型的服务特别有用,尤其是对于C/S之间不需要有特定关系的服务,如DNS、NTP等

任播地址是从单播地址空间中划分出来的,与单播地址有相同的格式,当一个单播地址属于多个接口时,就是任播地址。因为任播地址在形式上与单播地址无法区分开,一个任播地址的每个成员,必须显式地加以配置,以便识别任播地址

子网路由器任播地址格式:

子网前缀部分设置为路由器所在子网的前缀,地址的其余位设置为0,发送到这个地址上的数据包会被发送到该子网中的一个路由器上

预留的任播地址(RFC 2526)

  • 在每个子网内,接口标识符值0—127是为子网任播地址分配而保留的,0—125和127为保留,126用于移动lPv6家园代理(Mobile lPv6 Home Agents)的任播
  • 预留的任播地址不能分配给单播地址,它们的结构按是否含EUl-64分为两类

节点必须的IPv6地址

路由器必须的IPv6地址:

IPv6地址配置技术

路由器地址配置

与IPv4方法类似,管理员手工为接口配置一个IPv6地址,并指定前缀长度

主机地址配置
  • 考虑到主机用途的多样性,采用自动配置方法,常用的自动配置技术包括:有状态自动配置协议(DHCPv6)和无状态自动配置协议。

手工配置和检测

  1. 建议用于服务器和重要网络设备
  2. 接口地址配置的内容包括:128位IPv6地址和前缀长度
  3. IPv6地址配置到接口上以后,需要检测所配置的地址在链路上是否唯一
    • IPv6重复地址检测DAD,属于邻居发现(ND,Neighbor Discovery)协议的功能

自动配置

  • 赋予主机自己的地址参数,包括地址前缀、接口ID
  • 赋予主机其它的相关参数,包括路由器地址、跳数、MTU…

自动配置过程

  1. 接口初始化,然后产生“tentative”(实验性)地址

  2. 对“tentative”地址进行重复地址检测(DAD)

  3. 接口产生link-local地址,具备IP连接能力

  4. 决定采用何种自动配置技术

    • 由Router Advertisement报文及主机配置来决定
    • 无状态自动配置(stateless autoconfiguration)
    • 有状态自动配置(stateful autoconfiguration)
  5. 获得全球地址

即插即用
  • lPv6用两种不同机制来支持即插即用,即BOOTP和DHCP。这些协议支持“状态自动配置”,即服务器必须管理和保存每个节点的状态信息

有状态自动配置与无状态自动配置

  • 有状态自动配置的问题在于:用户必须保持和管理特殊的自动配置服务器以管理所有“状态”
  • 对于个人或者小型机构,无状态自动配置是较容易的解决方案。这种机制允许个人节点确定自己的IP配置,而不必向服务器显式请求各节点的信息
同时使用无状态及有状态两种配置方式
  • 两种类型自动配置方式的合作比单独使用其中一种更易于实现Internet网络连接的即插即用
    • 可以使用无状态自动配置生成一个IPv6地址,然后对附加参数使用有状态的自动配置
  • 无状态自动配置要简单的多,为什么还要使用状态自动配置?
    • 无状态自动配置对得到IP地址的节点提供最低程序的监视,任一节点可以连接到链路,通过路由器通告来获知网络和子网信息,并构造有效的链路地址
    • 如果有DHCP服务器的支持,那么机构可以更紧密地控制网络可配置的节点。同时,只有由网络管理员明确授权的节点才能通过DHCP服务器来配置

IPv6协议结构

#	掌握IPv6的报头格式
#	掌握分片报头的格式及用途
#	理解IPv6数据包的拆分、重组过程

IPv6数据包结构

由固定首部(base header)和有效载荷(payload)组成:首部长度变为固定的40字节,称为基本首部,所有的扩展首部和上层数据合起来叫做数据报的有效载荷或净负荷

  • 取消不必要的功能,首部的字段数减少到只有8个
  • 取消了首部检验和字段,加快了路由器处理数据报的速度
  • 基本首部的后面允许有零个或多个扩展首部。
IPv6数据包结构示意图
#### 基本首部
基本首部各字段含义:
  • 版本:4位,指明了协议的版本,对IPv6该字段总是6。
  • 区分服务:8位,以前叫做通信流类别,6表示IPv6数据包的类或优先级。类似于IPv4的服务类型字段。
  • 流标号:20位,流是互联网络上从特定源点到特定终点的一系列数据报。数据流由流标号和源节点的地址唯一标识。所有属于同一个流的数据报都具有同样的流标号、源lP地址和目的IP地址
  • 有效载荷长度:16位,指明IPv6数据报除基本首部以外的字节数(所有扩展首部都算在有效载荷之内),其最大值是64KB。如果使用逐跳选项扩展头的特大净荷选项,就能传送更大的数据包,此时有效载荷长度置0
  • 下一个首部:8位,如果IPv6数据报没有扩展首部,它相当于IPv4的协议字段;如果IPv6数据报有扩展首部,它指出第一个扩展首部的类型
  • 跳数限制:8位,与IPv4的TTL类似。源节点在数据报发出时即设定跳数限制。路由器在转发数据报时将跳数限制字段中的值减1。当跳数限制的值为零时,将此数据报丢弃
  • 源地址:128位,定义了源主机的IP地址
  • 目的地址:128位,定义了目的主机的IP地址。如果出现路由头,这个地址不是最终的接收数据包的主机的IPv6地址,而是路由报头列表中的第一个路由器地址

IPv6拓展首部:

  • 它代替了IPv4报头及其选项,增强了IPv6的功能,使其可以支持未来的需求
  • 扩展首部留给路径两端的源站和目的站主机来处理,中间路由器都不处理扩展首部(除路由选择和逐跳选项扩展首部),大大提高了路由器的处理效率
  • lPv6数据包中可以包含零个或多个具有不同的长度扩展报头。IPv6报头中的下一个报头字段,指向第一个扩展报头。每个扩展报头中,都包含下一个报头字段,指向下一个扩展报头。最后一个扩展报头指出上层协议数据单元的类型,上层协议可以是TCP协议、UDP协议或者ICMPv6协议等。
六种扩展首部:

逐跳选项扩展首部(Hop-by-Hop Options Header),路由选择扩展首部(Routing Header),分片扩展首部(Fragment Header),认证扩展首部(Authentication Header),目的站选项扩展首部(Destination Header)和封装安全有效载荷扩展首部(Encapsulated Security Payload Header)

注:每个扩展首部的长度应为8个字节的整数倍,是为了满足扩展首部对齐的要求

逐跳选项扩展首部
  • 逐跳选项扩展首部中最实质的是逐跳选项字段的内容,该字段描述了数据分组转发的特性。从源节点到目的节点的路由上的每个节点,即每个转发包(数据报)的路由器都检查逐跳选项中的信息
  • 由于它需要每个中间路由器进行处理,所以只在绝对必要的时候才会出现
  • 必须紧跟在IPv6基本首部后,若存在逐跳选择首部,基本首部中下一个首部字段值为0

逐跳选项:

  • 巨型净荷选项:净荷超过65535字节
  • 路由器警告选项:用于多播侦听发现和资源存储协议

RFC2460中已经将这两个选项废弃。

路由选择扩展首部

路由选择扩展首部代替了IPv4中所实现的源选路。源选路允许用户指定数据报的路径,即到达目的地沿途必须经过的路由器
·前一个首部中的下一个首部字段值为43

RFC2460中定义了一种类型,即类型0,只有列表中的路由器才处理路由选择扩展首部,其它路由器不必处理

路由选择扩展操作过程

  • 源节点构造数据报必须经过的路由器列表,构造类型0选路首部(路由器列表、最终目的地址、剩余段数)
  • IPv6基本首部的目的地址是路由器列表中的第一个路由器地址,而不是包的最终目的地址。最终目的地址是路由选择扩展首部数据字段的最后一个地址
  • 在地址列表中的节点接收到该包之后,对IPv6基本首部和路由选择扩展首部进行处理:
    • 剩余段数为0,则此路由器节点是该包的最终目的地址
    • 若此节点不是该包的最终目的地址,将它自己的地址从IPv6首部目的地址字段取出,用路由选择列表中的下一个节点地址代替,同时将剩余段数字段值减1,并把包发送到下一个节点
    • 重复此过程,直到包到达其最终目的地址。
分段扩展首部

当源节点发送的IPv6数据报比到达目的节点所经过路径上的最小MTU(PMTU)还要大时,需要对这个数据报进行分段

IPv6协议通过分段扩展首部实现数据报的分段,只允许源节点对数据报进行分段,简化了中间节点对数据报的处理
前一个首部中的下一个首部字段值为44
需要进行分段的原始数据报在源节点被分为一系列分段数据报发送出去,每个分段数据报的大小应与传输路径上的最小MTU适应

RFC2460中规定最小MTU值为1280字节

对于IPv6固定首部和传输过程中必须由路由器处理的扩展首部如路由选择、逐跳选项扩展首部,不允许分段

  • 可分段的部分包括:载荷、只能在到达最终目的地址时才处理的扩展首部

  • 将原始数据报中的可分段部分从左到右分成若干片,除最后一个分段外,每一片的长度是8个的整数倍。

  • 每个分段单独封装为一个IPv6数据报。

身份认证扩展首部

为IPv6数据包和IPv6报头中那些经过IPv6网络传输后值不会改变的字段,提供了数据验证、数据完整性和反重放保护

前一个首部中的下一个首部字段值为51

封装安全有效载荷扩展首部
  • 封装安全有效载荷(ESP)报头和尾部提供了数据机密性、数据验证性、数据完整性,以及对已封装有效载荷的重放保护服务。ESP报头并不为出现在它之前的IPv6报头或扩展报头提供安全服务
  • 前一个首部中的下一个首部字段值为50
目的站选项扩展首部
  • 目的站选项扩展首部携带只需要目的站点检验的可选信息,IPv6目的地址字段所列的第一个目的主机,以及路由选择扩展首部所列的后续目的主机都要处理这个可选信息
  • 前一个首部中的下一个首部字段值为60
  • 以下两种方式使用目的选项头:
    • 如果存在路由报头,则目的选项报头指定了在每个中间目标都要转发或处理的选项,此时目的选项头出现在路由报头之前
    • 如果不存在路由报头,或者目的选项头出现在路由头之后,则目的选项报头中指定了在最终目标处要转发或处理的洗项

文章作者: 十二惊惶
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 十二惊惶 !
  目录