IPv4包头包含可选字段Options,内容涉及Security、Timestamp、Record route等,这些Options可以将IPv4包头长度从20 Byte扩充到60 Byte。携带这些Options的IPv4报文在转发过程中往往需要中间路由转发设备进行软件处理,对于性能是个很大的消耗,因此实际中也很少使用。
IPv6将这些Options从IPv6基本包头中剥离,放到了扩展包头中,扩展包头被置于IPv6基本包头和上层协议数据单元之间。一个IPv6报文可以包含0个、1个或多个扩展包头,仅当需要路由器或目的节点做某些特殊处理时,才由发送方添加一个或多个扩展头。与IPv4不同,IPv6扩展头长度任意,不受40 Byte限制,这样便于日后扩充新增选项。这一特征加上选项的处理方式使得IPv6选项能得以真正的利用。但是为了提高处理选项头和传输层协议的性能,扩展包头总是8 Byte长度的整数倍。
当使用多个扩展包头时,前面包头的Next Header字段指明下一个扩展包头的类型,这样就形成了链状的包头列表。
当超过一种扩展包头被用在同一个IPv6报文里时,包头必须按照下列顺序出现:
逐跳选项包头:主要用于为在传送路径上的每跳转发指定发送参数,传送路径上的每台中间节点都要读取并处理该字段。
目的选项包头:携带了一些只有目的节点才会处理的信息。
路由包头:IPv6源节点用来强制数据包经过特定的设备。
分段包头:当报文长度超过MTU(Maximum Transmission Unit,最大传输单元)时就需要将报文分段发送,而在IPv6中,分段发送使用的是分段包头。
认证包头(AH):该包头由IPsec使用,提供认证、数据完整性以及重放保护。
封装安全净载包头(ESP):该包头由IPsec使用,提供认证、数据完整性以及重放保护和IPv6数据包的保密。
单播地址(Unicast Address):标识一个接口,目的地址为单播地址的报文会被送到被标识的接口。在IPv6中,一个接口拥有多个IPv6地址是非常常见的现象。除了全球单播地址、唯一本地地址、链路本地地址这三种地址之外,IPv6还有一些特殊单播地址的存在:
未指定地址: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的数据包实际上就是发给本地,可用于本地协议栈环回测试。
组播地址(Multicast Address):标识多个接口,目的地址为组播地址的报文会被送到被标识的所有接口。只有加入相应组播组的设备接口才会侦听发往该组播地址的报文。
任播地址(Anycast Address):任播地址标识一组网络接口(通常属于不同的节点)。目标地址是任播地址的数据包将发送给其中路由意义上最近的一个网络接口。
IPv6没有定义广播地址(Broadcast Address)。在IPv6网络中,所有广播的应用层场景将会被IPv6组播所取代。
接口标识的长度为64 bit,用于标识链路上的接口。在每条链路上,接口标识必须唯一。接口标识有许多用途,最常见的用法就是黏贴在链路本地地址前缀后面,形成接口的链路本地地址。或者在无状态自动配置中,黏贴在获取到的IPv6全球单播地址前缀后面,构成接口的全球单播地址。
IEEE EUI-64(64-bit Extended Unique Identifier)规范
这种由MAC地址产生IPv6地址接口标识的方法可以减少配置的工作量,尤其是当采用无状态地址自动配置时,只需要获取一个IPv6前缀就可以与接口标识形成IPv6地址。
使用这种方式最大的缺点就是某些恶意者可以通过二层MAC推算出三层IPv6地址。
IPv6组播地址各字段值对应的组播组类型和范围:
Flags:
0000表示永久分配或众所周知 ;
0001表示 临时的。
Scope:
0:预留;
1:节点本地范围;单个接口有效,仅用于Loopback通讯。
2:链路本地范围;例如FF02::1。
5:站点本地范围;
8:组织本地范围;
E:全球范围;
F:预留。
被请求节点组播组地址的应用场景举例:在IPv6中,ARP及广播都被取消,当设备需要请求某个IPv6地址对应的MAC地址时,设备依然需要发送请求报文,但是该报文是一个组播报文,其目的IPv6地址是目标IPv6单播地址对应的被请求节点组播地址,由于只有目标节点才会侦听这个被请求节点组播地址,所以该组播报文可以被目标节点所接收,同时不会占用其他非目标节点的网络性能。
任播过程涉及一个任播报文发起方和一个或多个响应方。
任播报文的发起方通常为请求某一服务(例如,Web服务)的主机。
任播地址与单播地址在格式上无任何差异,唯一的区别是一台设备可以给多台具有相同地址的设备发送报文。
网络中运用任播地址有很多优势:
业务冗余。比如,用户可以通过多台使用相同地址的服务器获取同一个服务(例如,Web服务)。这些服务器都是任播报文的响应方。如果不是采用任播地址通信,当其中一台服务器发生故障时,用户需要获取另一台服务器的地址才能重新建立通信。如果采用的是任播地址,当一台服务器发生故障时,任播报文的发起方能够自动与使用相同地址的另一台服务器通信,从而实现业务冗余。
提供更优质的服务。比如,某公司在A省和B省各部署了一台提供相同Web服务的服务器。基于路由优选规则,A省的用户在访问该公司提供的Web服务时,会优先访问部署在A省的服务器,提高访问速度,降低访问时延,大大提升了用户体验。
任意播地址设备不能访问其它ipv6地址设备,因为回不了包。
第一个和第四个地址是被请求节点组播地址
FF02::1 链路中所有设备都接收,类似于v4中的224.0.0.1
FF02::2 链路中所有的路由器都接收,类似于v4中的224.0.0.2
手工配置和无状态不需要手动开ipv4 add auto link,会自动产生。
有状态自动配置接收端必须要有这条命令先,他不会自动产生。
DHCP配置时,地址池中必须要exc…手动排除掉网关地址,不像v4会自动排除。
无状态自动配置是IPv6的一个亮点功能,它使得IPv6主机能够非常便捷地接入到IPv6网络中,即插即用,无需手工配置繁冗的IPv6地址,无需部署应用服务器(例如DHCP服务器)为主机分发地址。无状态自动配置机制使用到了ICMPv6中的路由器请求报文(Router Solicitation)及路由器通告报文(Router Advertisement)。
地址解析过程中使用了两种ICMPv6报文:邻居请求(Neighbor Solicitation)和邻居通告(Neighbor Advertisement)。
重复地址检测使用ICMPv6 NS和ICMPv6 NA报文确保网络中无两个相同的单播地址,所有接口在使用单播地址前都需要做DAD。
IPv6支持地址有状态(stateful)和无状态(stateless)两种自动配置方式,通过ICMPv6 RA报文中的M标记(Managed Address Configuration Flag)和O标记(Other Stateful Configuration Flag)来控制终端自动获取地址的方式。
有状态地址配置(DHCPv6 ),M=1,O=1:
采用DHCPv6协议,IPv6客户端将从DHCPv6服务器端获取完整的128 bit IPv6地址,同时包括DNS、SNTP服务器等地址参数。
此外,DHCPv6服务器端将会记录该地址的分配情况(这也是为什么被称为有状态)。
此方法配置较为复杂,且对DHCPv6服务器端的性能要求较高。
有状态地址配置多用于公司内部有线终端的地址分配,便于对地址进行管理。
无状态地址配置,M=0,O=0:
采用ICMPv6协议
使能了ICMPv6 RA功能的路由器会周期性的通告该链路上的IPv6地址前缀。
另一种情况,主机发送路由器查询(ICMPv6 RS)报文,路由器回复RA报文告知该链路IPv6地址前缀。
主机根据路由器回应的RA报文,获得IPv6地址前缀信息,使用该地址前缀,加上本地产生的接口标识,形成单播IPv6地址。
若主机还想获得其他配置信息,可以通过DHCPv6来获得除地址外的其他信息。当使用这种方式时,M=0,O=1。
假设R1为已在线设备,IPv6地址为2001::FFFF/64。PC上线之后,也配置了相同的IPv6地址,在正式使用这个地址之前,PC会对此地址做DAD,过程如下:
PC向链路上以组播的方式发送一个NS报文,该NS的源IPv6地址为“::”,目的IPv6地址为要进行DAD的2001::FFFF对应的被请求节点组播地址,也就是FF02::1:FF00:FFFF。这个NS里包含着要做DAD的目标地址2001::FFFF。
链路上的节点都会收到这个组播的NS报文,没有配置2001::FFFF的节点接口由于没有加入该地址对应的被请求节点组播组,因此在收到这个NS的时候默默丢弃。而R1在收到这个NS后,由于它的接口配置了2001::FFFF地址,因此接口会加入组播组FF02::1:FF00:FFFF,而此刻所收到的报文又是以该地址为目的地址,因此它会解析该报文,它发现对方进行DAD的目标地址与自己本地接口地址相同,于是立即回送一个NA报文,该报文的目的地址是FF02::1,也就是所有节点组播地址,同时在报文内写入目标地址2001::FFFF,以及自己接口的MAC地址。
当PC收到这个NA后,它就知道2001::FFFF在链路上已经有人在用了,因此将该地址标记为Duplicate(重复的),该地址将不能用于通信。若未收到NA报文,则PC判断这个IPv6地址可以用,DAD机制有点类似于IPv4中的免费ARP检测重复地址。
IPv6的地址解析不再使用ARP,也不再使用广播方式,而采用和DAD相同的NS和NA报文解析数据链路层地址。
假设PC想要解析R1的2001::2这个地址对应的MAC地址,详细过程如下:
PC将发送一个NS报文达到这个目的。这个NS报文的源地址是2001::1,目的地址则是2001::2对应的被请求节点组播地址。
R1接收此NS报文,根据报文内的源IPv6地址和源MAC,记录下PC这个邻居,同时根据自身的IPv6和MAC,回复单播NA报文。
PC收到此NA报文之后,获取其中的源IPv6地址和源MAC。这样双方都可以建立一条关于对方的邻居信息表项。