IPv6知识学习
背景
在2011年的时候,IANA(互联网地址分配机构)将最后的ipv4地址全部分配出去,至此,市面上解决IP地址分配的方法更多使用了CIDR和NAT等技术,为了解决IP地址分配不足等问题,我们迫切的需要一种技术,能够满足Ipv4的功能,还能够满足未来产业的IP地址需求,而Ipv6可以从根本上解决这个问题。各行各业,政府号召以及市场的需求,推动了Ipv6的发展
IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址。
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地址格式
网络前缀:n比特,相当于IPv4地址中的网络ID
接口标识:128-n比特,相当于IPv4地址中的主机ID
接口标识可通过三种方法生成:
1、手动配置
2、系统软件自动配置
3、IEEE EUI-64规范生成
其中EUI-64的规则:
简单来说就是利用mac地址的唯一性,首先将mac地址中的第7个bit取反,然后在中间插入0xFFFE,而后组成的64bit字节,即为接口标识
举一个小例子(以EUI-64生成的IPv6地址)
IPv6的地址分类
IPv6地址分为单播地址、任播地址、组播地址三种类型。和IPv4相比,取消了广播地址类型,以更丰富的组播地址代替,同时增加了任播地址类型。
单播地址:
IPv6单播地址表示了一个接口,任何发往这个接口的报文,都用这个IPv6地址,相当于一个房子的门
IPv6定义了多种单播地址,目前常用的单播地址有:未指定地址、环回地址、全球单播地址、链路本地地址、唯一本地地址ULA(Unique Local Address)。
- 未指定地址:IPv6中的未指定地址即 0:0:0:0:0:0:0:0/128 或者::/128。该地址可以表示某个接口或者节点还没有IP地址,可以作为某些报文的源IP地址(例如在NS报文的重复地址检测中会出现)。源IP地址是::的报文不会被路由设备转发。
- 环回地址:IPv6的环回地址为::1/128,作用基本与IPv4的127:0:0:1的作用类似,用于设备给自己发送数据包
- 全球单播地址:这个地址是带有全球单播地址前缀的的IPv6地址,类似IPv4的公网地址,实现了路由聚合。
全球单播地址由全球路由前缀(Global routing prefix)、子网ID(Subnet ID)和接口标识(Interface ID)组成,其格式如下如所示:
001:目前已经分配了的前3个bit都是001
Global routing prefix(全球路由前缀):ISP分配的前缀,一般来说是分配到第48个bit
Subnet ID(子网ID):拿到全球路由前缀之后,第48bit以及第64bit中间的16个bit来划分子网
除开前面的64位,后面的64位就是接口标识,结合起来就是一个完整的IPv6地址
4.链路本地地址:
很显然链路本地的意思就是仅仅在同一本地链路的节点之间使用,而本地链路的特定前缀是FE80::/10(可以看看我们工作电脑的ifconfig,fe80::就是链路本地地址的意思)
当一个接口启动IPv6协议栈的时候,每个接口会自动配置一个链路本地地址,这样在同一链路下,IPv6无需配置就可以进行通讯,所以链路本地地址用于很多邻居发现和无状态配置呢
并且以链路本地地址位目的或者源端口的报文都不会转发到其他链路去
5.唯一本地地址:
独立于ISP提供的IPv6地址,固定前缀为FC00::/7
第8位bit为1,值为0的被保留,目前没有使用第8位为0的唯一本地地址
其中也含有Global ID,但是是伪随机产生的,相同的概率是2的四十次方,所以说冲突的概率很小很小,避免了路由泄露造成的影响
组播地址:
ipv6的组播与ipv4的组播类似,将包发往一个特定的组,使其不会影响无关的主机或者路由,组播地址的前缀是FF00::/8
一般来说,每个接口必须为分配给它的单播地址加入一个组播地址,用于DAD协议的地址重复检测以及地址解析的功能(代替ARP)
一个自动生成的组播地址为:网络前缀 + FF + mac地址后六位
任播地址:
任播地址标识了一组网络接口,如果一个目标地址是是一个任播地址的话,那么将会把这个数据包发给路由意义上最近的一个接口(可以实现负载均衡),任播没有特殊的前缀(除了前面几个特殊前缀都可以),并且除开自定义的子网前缀来标识子网,其余全部用0来填充
简而言之:单播地址用于指定唯一的网络接口;多播地址用于向一组接口发送数据;任播地址用于标识一组接口中的某一个接口,该地址被发送到该组中最接近的接口。
IPv6报文
IPv6报文由IPv6基本报头、IPv6扩展报头以及上层协议数据单元三部分组成。
IPv6报文头部格式
由上图可以看出,IPv4报头包含可选字段Options,这些Options可以将IPv4报头长度从20字节扩充到60字节。携带这些Options的IPv4报文在转发过程中往往需要中间路由转发设备进行软件处理。
而IPv6的报头长度更为简洁,删除了IHL、Identification、Flags、Fragment Offset、Header Checksum、Options、Padding等字段,固定长度为40字节,固定的长度使得报文在复杂的网络环境下提高效率。
IPv6的地址是IPv4地址的四倍,但是IPv6的头部却只有最小IPv4头部长度的两倍,并且IPV6中选项部分的出现方式也有所变化,使路由器可以简单路过选项而不做任何处理,加快了报文处理速度。
新增或者更改过的字段
Traffic Class:
8位,指示IPv6数据流通信类别或优先级。功能类似于IPv4的服务类型(TOS/QOS)字段。
Flow Label:
20位,这个字段是为了给实时数据报交付和QoS提供更多的支持。该字段用于某些对连接的服务质量有特殊要求的通信,诸如音频或视频等实时数据传输。如果一组数据流具有相同的源地址、目的地址、hop-by-hop和routing,那么这组数据流可能共享flow label。由此可见,IPv6结点可以仅通过flow label,不检查其它属性值,即可知道如何处理和转发这组数据流。
Payload Length:
16位负载长度。负载长度包括扩展头和上层PDU,16位最多可表示65535字节负载长度。超过这一字节数的负载,该字段值置为“0”,Payload Length的值等于PDU+扩展包头的长度 。 总而言之,该字段的值=报文总长度-40
Next Header:
8位,指明识别紧跟在IPv6头后的包头类型,如扩展头或某个传输层协议头。ps:扩展包头中仍然含有扩展包头字段,用于下一扩展包头的说明。
Hop Limit:
IPv6用包在路由器之间的转发次数来限定包的生命期。包每经过一次转发,该字段减1,减到0时就把这个包丢弃。
扩展头部详情说明
Next Header的值说明
1、跳选项报头(代表该报头的Next Header字段值=0)
该选项主要用于为在传送路径上的每跳转发指定发送参数,传送路径上的每台中间节点都要读取并处理该字段。逐跳选项报头目前的主要应用有以下三种:
用于巨型载荷(载荷长度超过65535字节)。
用于设备提示,使设备检查该选项的信息,而不是简单的转发出去。
用于资源预留(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扩展头部规则
路由设备转发时根据基本报头中Next Header值来决定是否要处理扩展头,并不是所有的扩展报头都需要被转发路由设备查看和处理的。
除了目的选项扩展报头可能出现一次或两次(一次在路由扩展报头之前,另一次在上层协议数据报文之前),其余扩展报头只能出现一次。
当超过一种扩展报头被用在同一个分组里时,报头必须按照下列顺序出现:
IPv6基本报头
逐跳选项扩展报头
目的选项扩展报头
路由扩展报头
分段扩展报头
认证扩展报头
封装安全有效载荷扩展报头
目的选项扩展报头
上层协议数据报文
IPv6原理
ICMPv6
ICMPv6是IPv6的基础协议之一,用于传递报文转发中产生的错误和信息,更多是实现于邻居发现协议(NDP),以及应用于PMTU等机制等。
ICMPv6的协议号码为58,而这个协议包基本上是被用作于IPv6基本包头的下一包头字段,当一个IPv6基本包头或者扩展包头的Next Header字段为58的时候,说明下一包头字段为ICMPv6协议。
但是ICMPv6协议被认定为IPv6的上层协议,我们通过扩展包头规则可以得知,ICMPv6协议必须出现在所有扩展包头之后。
ICMPv6协议的报文格式
ICMPv6的常见功能:
ICMPv6在完成ICMP协议的常用功能之外,也增加了一些NDP,地址重复检测,PMTU发现等功能,我们也可以通过报文中的type与code类型抓包来查看时什么错误
差错报文type:
type=1 #目的不可达 destination unreachable
code=0 # 未达到目标路由
code=1 # 与目标的通信被管理阻止
code=2 # 未指定 code=3 # 地址不可达 code=4 # 端口不可达
type=2 #数据包过大 (路径MTU发现)
code=0
type=3 #超时
code=0 # 超过跳数的限制
code=1 # 分片重组超时
type=4 #参数问题
code=0 # 错误报头字段
code=1 # 无法识别Next Header类型
信息报文type:
type=128 #回送请求报文 Echo Requst
#大概就是请求目的端口收到之后立即回复
type=129 #回送应答报文 Echo Reply
#大概就是type=128的报文的
type=130 #多播听众查询
type=131 #多播听众报告
type=132 #多播听众退出 #其实就是多播侦听发现协议实现的过程
type=133 #路由请求
type=134 #路由公告
type=135 #邻居请求
type=136 #邻居公告
type=137 #重定向
type 133~137 #其实就是邻居发现协议的实现
之后为大家介绍NDP以及更多关于IPv6的知识噢
版权归原作者 无言无语的星空 所有, 如有侵权,请联系我们删除。