概述
定义
IPv6(Internet Protocol Version 6)是网络层协议的第二代标准协议,也被称为IPng(IP Next Generation)。它是IETF(Internet工程任务组)设计的一套规范,是IPv4(Internet Protocol Version 4)的升级版本。
IPv6地址的书写格式
IPv6的128位IP地址有以下两种表示形式。
- X:X:X:X:X:X:X:X
- 在这种形式中,128位的IPv6地址被分为8组,每组的16位用4个十六进制字符(0~9,A~F)来表示,组和组之间用冒号(:)隔开。其中每个“X”代表一组十六进制数值。比如下面这个IPv6地址:
2001:db8:130F:0000:0000:09C0:876A:130B
为了书写方便,每组中的前导“0”都可以省略,所以上述地址可写为:
2001:db8:130F:0:0:9C0:876A:130B。 - 另外,地址中包含的连续两个或多个均为0的组,可以用双冒号“::”来代替,这样可以压缩IPv6地址书写时的长度,所以上述地址又可以进一步简写为:
2001:db8:130F::9C0:876A:130B。
在一个IPv6地址中只能使用一次双冒号“::”,否则当计算机将压缩后的地址恢复成128位时,无法确定每段中0的个数。
- 在这种形式中,128位的IPv6地址被分为8组,每组的16位用4个十六进制字符(0~9,A~F)来表示,组和组之间用冒号(:)隔开。其中每个“X”代表一组十六进制数值。比如下面这个IPv6地址:
- X:X:X:X:X:X:d.d.d.d
IPv4映射IPv6地址。地址格式为:0:0:0:0:0:FFFF:IPv4-address。该地址用来将IPv4节点的地址表示为IPv6地址。
其中“X”代表高阶的六组数字,用十六进制数来表示每组的16比特。“d”代表低阶的四组数字,用十进制数表示每组的8比特。后边的部分(d.d.d.d)其实就是一个标准的IPv4地址。
IPv6地址的结构
一个IPv6地址可以分为如下两部分:
- 网络前缀:n比特,相当于IPv4地址中的网络ID
- 接口标识:128-n比特,相当于IPv4地址中的主机ID
地址2001:DB8:6101:1::E0:F726:4E58 /64的构成如图1所示。
图1 地址2001:DB8:6101:1::E0:F726:4E58 /64的构成示意图
IPv6的地址分类
IPv6主要有三种地址,分为单播地址、任播地址(Anycast Address)、组播地址三种类型。和IPv4相比,取消了广播地址类型,以更丰富的组播地址代替,同时增加了任播地址类型。
IPv6单播地址IPv6单播地址标识了一个接口,由于每个接口属于一个节点,因此每个节点的任何接口上的单播地址都可以标识这个节点。发往单播地址的报文,由此地址标识的接口接收。 IPv6定义了多种单播地址,目前常用的单播地址有:未指定地址、环回地址、全球单播地址、链路本地地址、唯一本地地址ULA(Unique Local Address)。
- 单播地址(Unicast):唯一标识一个接口,类似于IPv4的单播地址。发送到单播地址的数据包将被传输到此地址所标识的唯一接口。
配置的全球单播地址不能与该地址对应的网络前缀相同,因为该类型的地址是设备预留的子网路由器任播地址。对于前缀长度是127位的IPv6地址,不受该规则限制。 - 未指定地址 IPv6中的未指定地址即 0:0:0:0:0:0:0:0/128 或者::/128。该地址可以表示某个接口或者节点还没有IP地址,可以作为某些报文的源IP地址(例如在NS报文的重复地址检测中会出现)。源IP地址是::的报文不会被路由设备转发。
- 环回地址 IPv6中的环回地址即 0:0:0:0:0:0:0:1/128 或者::1/128。环回与IPv4中的127.0.0.1作用相同,主要用于设备给自己发送报文。该地址通常用来作为一个虚接口的地址(如Loopback接口)。实际发送的数据包中不能使用环回地址作为源IP地址或者目的IP地址。
- 全球单播地址 全球单播地址是带有全球单播前缀的IPv6地址,其作用类似于IPv4中的公网地址。这种类型的地址允许路由前缀的聚合,从而限制了全球路由表项的数量。 全球单播地址由全球路由前缀(Global routing prefix)、子网ID(Subnet ID)和接口标识(Interface ID)组成,其格式如图2所示: 图2 全球单播地址格式
Global routing prefix:全球路由前缀。由提供商(Provider)指定给一个组织机构,通常全球路由前缀至少为48位。目前已经分配的全球路由前缀的前3bit均为001。 Subnet ID:子网ID。组织机构可以用子网ID来构建本地网络(Site)。子网ID通常最多分配到第64位。子网ID和IPv4中的子网号作用相似。 Interface ID:接口标识。用来标识一个设备(Host)。
- 链路本地地址 链路本地地址是IPv6中的应用范围受限制的地址类型,只能在连接到同一本地链路的节点之间使用。它使用了特定的本地链路前缀FE80::/10(最高10位值为1111111010),同时将接口标识添加在后面作为地址的低64比特。 当一个节点启动IPv6协议栈时,启动时节点的每个接口会自动配置一个链路本地地址(其固定的前缀+EUI-64规则形成的接口标识)。这种机制使得两个连接到同一链路的IPv6节点不需要做任何配置就可以通信。所以链路本地地址广泛应用于邻居发现,无状态地址配置等应用。 以链路本地地址为源地址或目的地址的IPv6报文不会被路由设备转发到其他链路。链路本地地址的格式如图3所示: 图3 链路本地地址格式
- 唯一本地地址 唯一本地地址是另一种应用范围受限的地址,它仅能在一个站点内使用。由于本地站点地址的废除(RFC3879),唯一本地地址被用来代替本地站点地址。 唯一本地地址的作用类似于IPv4中的私网地址,任何没有申请到提供商分配的全球单播地址的组织机构都可以使用唯一本地地址。唯一本地地址只能在本地网络内部被路由转发而不会在全球网络中被路由转发。唯一本地地址格式如图4所示: 图4 唯一本地地址格式
Prefix:前缀;固定为FC00::/7。 L:L标志位;值为1代表该地址为在本地网络范围内使用的地址;值为0被保留,用于以后扩展。 Global ID:全球唯一前缀;通过伪随机方式产生。 Subnet ID:子网ID;划分子网使用。 Interface ID:接口标识。 唯一本地地址具有如下特点:
- 具有全球唯一的前缀(虽然随机方式产生,但是冲突概率很低)。
- 可以进行网络之间的私有连接,而不必担心地址冲突等问题。
- 具有知名前缀(FC00::/7),方便边缘设备进行路由过滤。
- 如果出现路由泄漏,该地址不会和其他地址冲突,不会造成Internet路由冲突。
- 应用中,上层应用程序将这些地址看作全球单播地址对待。
- 独立于互联网服务提供商ISP(Internet Service Provider)。
IPv6任播地址任播地址标识一组网络接口(通常属于不同的节点)。目标地址是任播地址的数据包将发送给其中路由意义上最近的一个网络接口。
任播地址设计用来在给多个主机或者节点提供相同服务时提供冗余功能和负载分担功能。目前,任播地址的使用通过共享单播地址方式来完成。将一个单播地址分配给多个节点或者主机,这样在网络中如果存在多条该地址路由,当发送者发送以任播地址为目的IP的数据报文时,发送者无法控制哪台设备能够收到,这取决于整个网络中路由协议计算的结果。这种方式可以适用于一些无状态的应用,例如DNS等。
IPv6中没有为任播规定单独的地址空间,任播地址和单播地址使用相同的地址空间。目前IPv6中任播主要应用于移动IPv6。
- 任播地址(Anycast):用来标识一组接口(通常这组接口属于不同的节点)。发送到任播地址的数据包被传输给此地址所标识的一组接口中距离源节点最近的一个接口(最“近”的一个,是指根据路由协议的距离度量)。
应用场景:当移动主机需要与它的“home”子网上的移动代理之一通信时,它将用该子网路由设备的任播地址。
具体地址规定:任播地址没有独立的地址空间,它们可使用任何单播地址的格式。因此,需要一种语法来区别任播地址和单播地址。
对于接口标识全为0的IPv6地址,标准协议中定义为子网路由器任播地址(Subnet-Router anycast address)。如图2所示,subnet prefix是单播IPv6地址前缀,由用户配置单播IPv6地址时指定。
图2 子网路由器任播地址格式
IPv6组播地址IPv6的组播与IPv4相同,用来标识一组接口,一般这些接口属于不同的节点。一个节点可能属于0到多个组播组。发往组播地址的报文被组播地址标识的所有接口接收。例如组播地址FF02::1表示链路本地范围的所有节点,组播地址FF02::2表示链路本地范围的所有路由器。
一个IPv6组播地址由前缀,标志(Flag)字段、范围(Scope)字段以及组播组ID(Global ID)4个部分组成:
- 前缀:IPv6组播地址的前缀是FF00::/8。
- 标志字段(Flag):长度4bit,目前只使用了最后一个比特(前三位必须置0),当该位值为0时,表示当前的组播地址是由IANA所分配的一个永久分配地址;当该值为1时,表示当前的组播地址是一个临时组播地址(非永久分配地址)。
- 范围字段(Scope):长度4bit,用来限制组播数据流在网络中发送的范围,该字段取值和含义的对应关系如图5所示。
- 组播组ID(Group ID):长度112bit,用以标识组播组。目前,RFC2373并没有将所有的112位都定义成组标识,而是建议仅使用该112位的最低32位作为组播组ID,将剩余的80位都置0。这样每个组播组ID都映射到一个唯一的以太网组播MAC地址(RFC2464)。
IPv6组播地址格式如图5所示:
图5 IPv6组播地址格式
- 被请求节点组播地址
被请求节点组播地址通过节点的单播或任播地址生成。当一个节点具有了单播或任播地址,就会对应生成一个被请求节点组播地址,并且加入这个组播组。一个单播地址或任播地址对应一个被请求节点组播地址。该地址主要用于邻居发现机制和地址重复检测功能。
IPv6中没有广播地址,也不使用ARP。但是仍然需要从IP地址解析到MAC地址的功能。在IPv6中,这个功能通过邻居请求NS(Neighbor Solicitation)报文完成。当一个节点需要解析某个IPv6地址对应的MAC地址时,会发送NS报文,该报文的目的IP就是需要解析的IPv6地址对应的被请求节点组播地址;只有具有该组播地址的节点会检查处理。
被请求节点组播地址由前缀FF02::1:FF00:0/104和单播地址的最后24位组成。
IPv6报文格式
IPv6报文由IPv6基本报头、IPv6扩展报头以及上层协议数据单元三部分组成。
上层协议数据单元一般由上层协议报头和它的有效载荷构成。有效载荷是指紧跟IPv6基本报头的数据包,包含IPv6扩展报头。例如,有效载荷可以是一个ICMPv6报文、一个TCP6报文或一个UDP6报文。
IPv6基本报头
IPv6基本报头有8个字段,固定大小为40字节,每一个IPv6数据报都必须包含报头。基本报头提供报文转发的基本信息,会被转发路径上面的所有设备解析。
IPv6基本报头格式如图1所示。
图1 IPv6基本报头格式
IPv6和IPv4相比,去除了IHL、Identification、Flags、Fragment Offset、Header Checksum、Options、Padding域,只增了流标签域,因此IPv6报文头的处理较IPv4大大简化,提高了处理效率。另外,IPv6为了更好支持各种选项处理,提出了扩展头的概念,新增选项时不必修改现有结构就能做到,理论上可以无限扩展,体现了优异的灵活性。下面为读者介绍IPv6扩展报头的一些信息。
ICMPv6
ICMPv6(Internet Control Message Protocol for the IPv6)是IPv6的基础协议之一。
在IPv4中,Internet控制报文协议ICMP(Internet Control Message Protocol)向源节点报告关于向目的地传输IP数据包过程中的错误和信息。它为诊断、信息和管理目的定义了一些消息,如:目的不可达、数据包超长、超时、回应请求和回应应答等。在IPv6中,ICMPv6除了提供ICMPv4常用的功能之外,还是其它一些功能的基础,如邻接点发现、无状态地址配置(包括重复地址检测)、PMTU发现等。
ICMPv6的协议类型号(即IPv6报文中的Next Header字段的值)为58。ICMPv6的报文格式如图1所示:
图1 ICMPv6报文格式
报文中字段解释如下:
- Type:表明消息的类型,0至127表示差错报文类型,128至255表示消息报文类型。
- Code:表示此消息类型细分的类型。
- Checksum:表示ICMPv6报文的校验和。
ICMPv6错误报文的分类
ICMPv6错误报文用于报告在转发IPv6数据包过程中出现的错误。ICMPv6错误报文可以分为以下4种:
- 目的不可达错误报文
在IPv6节点转发IPv6报文过程中,当设备发现目的地址不可达时,就会向发送报文的源节点发送ICMPv6目的不可达错误报文,同时报文中会携带引起该错误报文的具体原因。
目的不可达错误报文的Type字段值为1。根据错误具体原因又可以细分为:- Code=0:没有到达目标设备的路由。
- Code=1:与目标设备的通信被管理策略禁止。
- Code=2:未指定。
- Code=3:目的IP地址不可达。
- Code=4:目的端口不可达。
- 数据包过大错误报文
在IPv6节点转发IPv6报文过程中,发现报文超过出接口的链路MTU时,则向发送报文的源节点发送ICMPv6数据包过大错误报文,其中携带出接口的链路MTU值。数据包过大错误报文是Path MTU发现机制的基础。
数据包过大错误报文的Type字段值为2,Code字段值为0。 - 时间超时错误报文
在IPv6报文收发过程中,当设备收到Hop Limit字段值等于0的数据包,或者当设备将Hop Limit字段值减为0时,会向发送报文的源节点发送ICMPv6超时错误报文。对于分段重组报文的操作,如果超过定时时间,也会产生一个ICMPv6超时报文。
时间超时错误报文的Type字段值为3,根据错误具体原因又可以细分为: - Code=0:在传输中超越了跳数限制。
- Code=1:分片重组超时。
- 参数错误报文
当目的节点收到一个IPv6报文时,会对报文进行有效性检查,如果发现问题会向报文的源节点回应一个ICMPv6参数错误差错报文。
参数错误报文的Type字段值为4,根据错误具体原因又可以细分为:- Code=0:IPv6基本头或扩展头的某个字段有错误。
- Code=1:IPv6基本头或扩展头的NextHeader值不可识别。
- Code=2:扩展头中出现未知的选项。
ICMPv6信息报文的分类
ICMPv6信息报文提供诊断功能和附加的主机功能,比如多播侦听发现和邻居发现。常见的ICMPv6信息报文主要包括回送请求报文(Echo Request)和回送应答报文(Echo Reply),这两种报文也就是通常使用的Ping报文。
- 回送请求报文:回送请求报文用于发送到目标节点,以使目标节点立即发回一个回送应答报文。回送请求报文的Type字段值为128,Code字段的值为0。
- 回送应答报文:当收到一个回送请求报文时,ICMPv6会用回送应答报文响应。回送应答报文的Type字段的值为129,Code字段的值为0。
Path MTU
在IPv4网络中,报文如果过大,则需要分片进行发送,所以在每个节点发送报文之前,设备都会根据发送接口的最大传输单元MTU(Maximum Transmission Unit)对报文进行分片。在IPv6网络中,为了减少中间转发设备的处理压力,中间转发设备不对IPv6报文进行分片,报文的分片值在源节点进行。当中间转发设备的接口收到一个报文后,如果发现报文长度比转发接口的MTU值大,则会将其丢弃;同时将转发接口的MTU值通过ICMPv6报文的“Packet Too Big”消息发给源节点,源节点以该值重新发送IPv6报文,这样带来了额外流量开销。PMTU发现协议可以动态发现整条传输路径上各链路的MTU值,减少由于重传带来的额外流量开销。
PMTU发现协议是通过ICMPv6的Packet Too Big报文来完成的。首先源节点假设PMTU就是其出接口的MTU,发出一个试探性的报文,当转发路径上存在一个小于当前假设的PMTU时,转发设备就会向源节点发送Packet Too Big报文,并且携带自己的MTU值,此后源节点将PMTU的假设值更改为新收到的MTU值继续发送报文。如此反复,直到报文到达目的地之后,源节点就能知道到达目的地的PMTU了。
PMTU的工作过程如图1所示。
图1 PMTU原理
整条传输路径需要通过4条链路,每条链路的MTU分别是1500、1500、1400、1300,当源节点发送一个分片报文的时候,首先按照PMTU为1500进行分片并发送分片报文,当到达MTU为1400的出接口时,设备返回Packet Too Big错误,同时携带MTU值为1400的信息。源节点接收到之后会将报文重新按照PMTU为1400进行分片并再次发送一个分片报文,当分片报文到达MTU值为1300的出接口时,同样返回Packet Too Big错误,携带MTU值为1300的信息。之后源节点重新按照PMTU为1300进行分片并发送分片报文,最终到达目的地,这样就找到了该路径的
最后
以上就是义气身影为你收集整理的IPV6知识定义IPv6的地址分类IPv6报文格式的全部内容,希望文章能够帮你解决IPV6知识定义IPv6的地址分类IPv6报文格式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复