IPv6简介
IPv6(Internet Protocol Version 6)是网络层协议的第二代标准协议,也被称为IPng(IP Next Generation)。它是Internet工程任务组IETF(Internet Engineering Task Force)设计的一套规范,是IPv4(Internet Protocol Version 4)的升级版本。
目的:
IPv4协议是目前广泛部署的因特网协议。在因特网发展初期,IPv4以其协议简单、易于实现、互操作性好的优势而得到快速发展。但随着因特网的迅猛发展,IPv4设计的不足也日益明显,IPv6的出现,解决了IPv4的一些弊端。相比IPv4,IPv6具有如下优势:
IPv4与IPv6的对比表:
IPv6地址
IPv6地址的表示方法:
IPv6地址总长度为128比特,通常分为8组,每组为4个十六进制数的形式,每组十六进制数间用冒号分隔。例如:FC00:0000:130F:0000:0000:09C0:876A:130B,这是IPv6地址的首选格式。
为了书写方便,IPv6还提供了压缩格式,以上述IPv6地址为例,具体压缩规则为:
每组中的前导“0”都可以省略,所以上述地址可写为:FC00:0:130F:0:0:9C0:876A:130B。
地址中包含的连续两个或多个均为0的组,可以用双冒号“::”来代替,所以上述地址又可以进一步简写为:FC00:0:130F::9C0:876A:130B。
需要注意的是,在一个IPv6地址中只能使用一次双冒号“::”,否则当计算机将压缩后的地址恢复成128位时,无法确定每个“::”代表0的个数。
IPv6地址的结构:
一个IPv6地址可以分为如下两部分:
网络前缀:n比特,相当于IPv4地址中的网络ID
接口标识:128-n比特,相当于IPv4地址中的主机ID
对于IPv6单播地址来说,如果地址的前三bit不是000,则接口标识必须为64位;如果地址的前三位是000,则没有此限制。
接口标识可通过三种方法生成:手工配置、系统通过软件自动生成或IEEE EUI-64规范生成。其中,EUI-64规范自动生成最为常用。
IEEE EUI-64规范是将接口的MAC地址转换为IPv6接口标识的过程。如下图所示,MAC地址的前24位(用c表示的部分)为公司标识,后24位(用m表示的部分)为扩展标识符。从高位数,第7位是0表示了MAC地址本地唯一。转换的第一步将FFFE插入MAC地址的公司标识和扩展标识符之间,第二步将从高位数,第7位的0改为1表示此接口标识全球唯一。
图:EUI-64规范示意图
例如:MAC地址:000E-0C82-C4D4;转换后020E:0CFF:FE82:C4D4。
这种由MAC地址产生IPv6地址接口标识的方法可以减少配置的工作量,尤其是当采用无状态地址自动配置时,只需要获取一个IPv6前缀就可以与接口标识形成IPv6地址。但是使用这种方式最大的缺点是任何人都可以通过二层MAC地址推算出三层IPv6地址。
IPv6的地址分类:
IPv4地址分为单播地址、组播地址和广播地址。IPv6中去掉了广播地址,增加了任播地址,也就是说,IPv6地址被分为单播地址、组播地址和任播地址。
单播地址用于标识一个接口,发往该目的地址的报文会被送到被标识的接口。
组播地址用于标识多个接口,发往该目的地址的报文会被送到被标识的所有接口。
任播地址用于标识多个接口,发往该目的地址的报文会被送到被标识的所有接口中最近的一个接口上。这里关于最近的理解,可以理解为从下标数起,最小的那个。任播地址与单播地址使用同一个地址空间,也就是说,由路由器决定该数据包是做任播转发还是单播转发。
单播地址可分为下面几类:
1. 未指定地址:::/128,即地址全为0。
2. 环回地址 :::1/128,相当与IPv4中的127.0.0.1。
3. 全球单播地址,类似于IPv4中的公网地址。
4. 内嵌IPv4地址的IPv6地址 如 :::ffff:192.168.10.1。当需要将IPv4单播地址与IPv6全球单播地址建立联系的时候一般使用这种地址,分为两种。一种是IPv4兼容IPv6地址,另一种是IPv4映射IPv6地址。
IPv4兼容IPv6地址构成形式是96位0加上32位IPv4地址,如 ::192.168.1.1,这种地址最初用于IPv4和IPv6之间的过渡计划,但现在已经不再需要。
IPv4映射IPv6地址构成形式是80位0加上16位1,再加上IPv4地址,如::ffff:192.168.1.1。
5. 本地链路地址,前缀固定fe80::/64,如 fe80::e0:f726:4e68。凡是源地址或目的地址包含由本地链路地址的报文,路由器不应当转发它。这样的报文只能在LAN中互通。
6. 本地站点地址,前缀fec0::/10,紧接着54位子网ID,作用相当于IPv4中的私网地址,如fec0::e0:f726:4e68。只能在本站内使用,不能在公网上使用。
图:组播地址
最重要的字段要属于最后的组ID(Group-ID)字段了。该字段长度为112位,用以标识组播组,我们知道112位最多可以生成2112个组ID。目前,RFC2373并没有将所有的112位都定义成组标识,而是建议仅使用该112位的最低32位组ID,将剩余的80位都置0。
任播地址:
这是IPv6特有的地址类型,它用来标识一组网络接口(通常属于不同的节点)。目标地址是任播地址的数据包将发送给其中路由意义上最近的一个网络接口。适合于“One-to-One-of-Many”(一对组中的一个)的通讯场合。接收方只需要是一组接口中的一个即可,如移动用户上网就需要因地理位置的不同,而接入离用户最近的一个接收站,这样才可以使移动用户在地理位置上不受太多的限制。
任播地址从单播地址空间中进行分配,使用单播地址的任何格式。因而,从语法上,任播地址与单播地址没有区别。被分配具有任播地址的节点必须得到明确的配置,从而知道它是一个任播地址。目前,任播地址仅被用做目标地址,且仅分配给路由器
IPv6报文格式
IPv6报文由IPv6基本报头、IPv6扩展报头以及上层协议数据单元三部分组成。
上层协议数据单元一般由上层协议报头和它的有效载荷构成,有效载荷可以是一个ICMPv6报文、一个TCP报文或一个UDP报文。
图:IPv6基本报文头部格式
IPv6报头格式中主要字段解释如下:
Version:版本号,长度为4bit。对于IPv6,该值为6。
Traffic Class:流类别,长度为8bit。等同于IPv4中的TOS字段,表示IPv6数据报的类或优先级,主要应用于QoS。
Flow Label:流标签,长度为20bit。IPv6中的新增字段,用于区分实时流量,不同的流标签+源地址可以唯一确定一条数据流,中间网络设备可以根据这些信息更加高效率的区分数据流。
Payload Length:有效载荷长度,长度为16bit。有效载荷是指紧跟IPv6报头的数据报的其它部分(即扩展报头和上层协议数据单元)。该字段只能表示最大长度为65535字节的有效载荷。如果有效载荷的长度超过这个值,该字段会置0,而有效载荷的长度用逐跳选项扩展报头中的超大有效载荷选项来表示。
Next Header:下一个报头,长度为8bit。该字段定义紧跟在IPv6报头后面的第一个扩展报头(如果存在)的类型,或者上层协议数据单元中的协议类型。
Hop Limit:跳数限制,长度为8bit。该字段类似于IPv4中的Time to Live字段,它定义了IP数据报所能经过的最大跳数。每经过一个设备,该数值减去1,当该字段的值为0时,数据报将被丢弃。
Source Address:源地址,长度为128bit。表示发送方的地址。
Destination Address:目的地址,长度为128bit。表示接收方的地址。
IPv6和IPv4相比,去除了IHL、identifiers、Flags、Fragment Offset、Header Checksum、 Options、Paddiing域,只增了流标签域,因此IPv6报文头的处理较IPv4大大简化,提高了处理效率。另外,IPv6为了更好支持各种选项处理,提出了扩展头的概念,新增选项时不必修改现有结构就能做到,理论上可以无限扩展,体现了优异的灵活性。下面为读者介绍IPv6扩展报头的一些信息。
IPv6报文抓包示例:
图:IPv6报文抓包示例
IPv6扩展头部:
在IPv4中,IPv4报头包含可选字段Options,内容涉及security、Timestamp、Record route等,这些Options可以将IPv4报头长度从20字节扩充到60字节。在转发过程中,处理携带这些Options的IPv4报文会占用设备很大的资源,因此实际中也很少使用。
IPv6将这些Options从IPv6基本报头中剥离,放到了扩展报头中,扩展报头被置于IPv6报头和上层协议数据单元之间。一个IPv6报文可以包含0个、1个或多个扩展报头,仅当需要设备或目的节点做某些特殊处理时,才由发送方添加一个或多个扩展头。与IPv4不同,IPv6扩展头长度任意,不受40字节限制,这样便于日后扩充新增选项,这一特征加上选项的处理方式使得IPv6选项能得以真正的利用。但是为了提高处理选项头和传输层协议的性能,扩展报头总是8字节长度的整数倍。
当使用多个扩展报头时,前面报头的Next Header字段指明下一个扩展报头的类型,这样就形成了链状的报头列表。如下图所示,IPv6基本报头中的Next Header字段指明了第一个扩展报头的类型,而第一个扩展报头中的Next Header字段指明了下一个扩展报头的类型(如果不存在,则指明上层协议的类型)。
图:IPv6扩展报头格式
IPv6扩展报头中主要字段解释如下:
Next Header:下一个报头,长度为8bit。与基本报头的Next Header的作用相同。指明下一个扩展报头(如果存在)或上层协议的类型。
Extension Header Len:报头扩展长度,长度为8bit。表示扩展报头的长度(不包含Next Header字段)。
Extension Head Data:扩展报头数据,长度可变。扩展报头的内容,为一系列选项字段和填充字段的组合。
目前,RFC 2460中定义了6个IPv6扩展头:逐跳选项报头、目的选项报头、路由报头、分段报头、认证报头、封装安全净载报头.
1.逐跳选项报头:
(代表该报头的Next Header字段值=0)
该选项主要用于为在传送路径上的每跳转发指定发送参数,传送路径上的每台中间节点都要读取并处理该字段。逐跳选项报头目前的主要应用有以下三种:
a>用于巨型载荷(载荷长度超过65535字节)。
b>用于设备提示,使设备检查该选项的信息,而不是简单的转发出去。
c>用于资源预留(RSVP)。
2.目的选项报头:
(代表该报头的Next Header字段值=60)
目的选项报头携带了一些只有目的节点才会处理的信息。目前,目的选项报文头主要应用于移动IPv6。
3.路由报头:
(代表该报头的Next Header字段值=43)
路由报头和IPv4的Loose Source and Record Route选项类似,该报头能够被IPv6源节点用来强制数据包经过特定的设备。
4.分段报头:
(代表该报头的Next Header字段值=44)
同IPv4一样,IPv6报文发送也受到MTU的限制。当报文长度超过MTU时就需要将报文分段发送,而在IPv6中,分段发送使用的是分段报头。
5.认证报头:
(代表该报头的Next Header字段值=51)
该报头由IPsec使用,提供认证、数据完整性以及重放保护。它还对IPv6基本报头中的一些字段进行保护。
6.封装安全净载报头:
(代表该报头的Next Header字段值=50)
该报头由IPsec使用,提供认证、数据完整性以及重放保护和IPv6数据报的保密,类似于认证报头。
IPv6扩展报头规约:
当超过一种扩展报头被用在同一个分组里时,报头必须按照下列顺序出现:
IPv6基本报头
逐跳选项扩展报头
目的选项扩展报头
路由扩展报头
分段扩展报头
认证扩展报头
封装安全有效载荷扩展报头
目的选项扩展报头
上层协议数据报文
路由设备转发时根据基本报头中Next Header值来决定是否要处理扩展头,并不是所有的扩展报头都需要被转发路由设备查看和处理的。
除了目的选项扩展报头可能出现一次或两次(一次在路由扩展报头之前,另一次在上层协议数据报文之前),其余扩展报头只能出现一次。
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的报文格式下图所示:
图:ICMPv6报文格式
报文中字段解释如下:
Type:表明消息的类型,0至127表示差错报文类型,128至255表示消息报文类型。
Code:表示此消息类型细分的类型。
Checksum:表示ICMPv6报文的校验和。
ICMPv6报文抓包示例:
图:ICMPv6报文抓包示例
ICMPv6错误报文的分类:
ICMPv6错误报文用于报告在转发IPv6数据包过程中出现的错误。ICMPv6错误报文可以分为以下4种:
*目的不可达错误报文
在IPv6节点转发IPv6报文过程中,当设备发现目的地址不可达时,就会向发送报文的源节点发送ICMPv6目的不可达错误报文,同时报文中会携带引起该错误报文的具体原因。
目的不可达错误报文的Type字段值为1。根据错误具体原因又可以细分为:
Code=0:没有到达目标设备的路由。
Code=1:与目标设备的通信被管理策略禁止。
Code=2:未指定。
Code=3:目的IP地址不可达。
*数据包过大错误报文
在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信息报文的分类
回送请求报文:回送请求报文用于发送到目标节点,以使目标节点立即发回一个回送应答报文。回送请求报文的Type字段值为128,Code字段的值为0。
回送应答报文:当收到一个回送请求报文时,ICMPv6会用回送应答报文响应。回送应答报文的Type字段的值为129,Code字段的值为0。
其他报文:
邻居发现ND:
Type=133 路由器请求 RS(Router Solicitation)
Type=134 路由器公告 RA(Router Advertisement)
Type=135 邻居请求 NS(Neighbor Solicitation)
Type=136 邻居通告 NA(Neighbor Advertisement)
Type=137 重定向(Redirect)
多播侦听发现协议MLD:
Type=130 多播听众查询
Type-131 多播听众报告
Type=132 多播听众退出
————————————————
转自:CSDN博主