转载请注明以下内容:
来源:公众号【网络技术干货圈】
作者:圈圈
ID:wljsghq
一、IPv6简介
IPv6(Internet Protocol Version 6)是网络层协议的第二代标准协议,也被称为IPng(IP Next Generation)。它是Internet工程任务组IETF(Internet Engineering Task Force)设计的一套规范,是IPv4(Internet Protocol Version 4)的升级版本。
二、IPV4和IPV6对比
针对问题 | IPv4的缺陷 | IPv6的改进 |
---|---|---|
地址空间不足 | Pv4地址采用32比特标识,理论上能够提供的地址数量是43亿(由于地址分配的原因,实际可使用的数量不到43亿)。另外,IPv4地址的分配也很不均衡:美国占全球地址空间的一半左右,而欧洲则相对匮乏;亚太地区则更加匮乏。与此同时,移动IP和宽带技术的发展需要更多的IP地址。目前IPv4地址已经消耗殆尽。针对IPv4的地址短缺问题,也曾先后出现过几种解决方案。比较有代表性的是无类别域间路由CIDR(Classless Inter-Domain Routing)和网络地址转换NAT(Network Address Translator)。但是CIDR和NAT都有各自的弊端和不能解决的问题,由此推动了IPv6的发展。 | IPv6地址采用128比特标识。128位的地址结构使IPv6理论上可以拥有(43亿×43亿×43亿×43亿)个地址。近乎无限的地址空间是IPv6的最大优势。 |
报文格式不合理 | IPv4报头包含可选字段Options,内容涉及Security、Timestamp、Record route等,这些Options可以将IPv4报头长度从20字节扩充到60字节。携带这些Options的IPv4报文在转发过程中往往需要中间路由转发设备进行软件处理,对于性能是个很大的消耗,因此实际中也很少使用。 | IPv6和IPv4相比,去除了IHL、Identifier、Flag、Fragment Offset、Header Checksum、 Option、Padding域,只增加了流标签域,因此IPv6报文头的处理较IPv4更为简化,提高了处理效率。另外,IPv6为了更好支持各种选项处理,提出了扩展头的概念,新增选项时不必修改现有结构,理论上可以无限扩展,体现了优异的灵活性。 |
自动配置和重新编址 | 由于IPv4地址只有32比特,并且地址分配不均衡,导致在网络扩容或重新部署时,经常需要重新分配IP地址,因此需要能够进行自动配置和重新编址,以减少维护工作量。目前IPv4的自动配置和重新编址机制主要依靠DHCP协议。 | IPv6协议内置支持通过地址自动配置方式使主机自动发现网络并获取IPv6地址,大大提高了内部网络的可管理性。 |
路由聚合 | 由于IPv4发展初期的分配规划问题,造成许多IPv4地址分配不连续,不能有效聚合路由。日益庞大的路由表耗用大量内存,对设备成本和转发效率产生影响,这一问题促使设备制造商不断升级其产品,以提高路由寻址和转发性能。 | 巨大的地址空间使得IPv6可以方便的进行层次化网络部署。层次化的网络结构可以方便的进行路由聚合,提高了路由转发效率。 |
对端到端的安全的支持 | IPv4协议制定时并没有仔细针对安全性进行设计,因此固有的框架结构并不能支持端到端的安全。 | IPv6中,网络层支持IPSec的认证和加密,支持端到端的安全。 |
对QoS(Quality of Service)的支持 | 随着网络会议、网络电话、网络电视迅速普及与使用,客户要求有更好的QoS来保障这些音视频实时转发。IPv4并没有专门的手段对QoS进行支持。 | IPv6新增了流标记域,提供QoS保证。 |
对移动特性的支持 | 随着Internet的发展,移动IPv4出现了一些问题,比如:三角路由,源地址过滤等。 | IPv6协议规定必须支持移动特性。和移动IPv4相比,移动IPv6使用邻居发现功能可直接实现外地网络的发现并得到转交地址,而不必使用外地代理。同时,利用路由扩展头和目的地址扩展头移动节点和对等节点之间可以直接通信,解决了移动IPv4的三角路由、源地址过滤问题,移动通信处理效率更高且对应用层透明。 |
PS:三角路由、源地址过滤问题、CIDR和NAT将在其他博文中给出。
三、IPV6基本报文结构
版本号Version:长度为4bit。对于IPv6,该值为6。
流类别Traffic Class:长度为8bit用来标识对应IPv6的通信流类别,或者说是优先级别,主要应用于QoS。类似于IPv4中的ToS(服务类型)字段。
流标签Flow Label:长度为20bit。流标签字段时IPv6数据报中新增的一个字段,占20位,可用来标记报文的数据流类型,以便在网络层区分不同的报文。流标签字段有源节点分配,通过流标签、源地址、目的地址三元组方式就可以唯一标识一条通信流,而不用像IPv4那样需要使用五元组方式(源地址、目的地址、源端口、目的端口和传输层协议号)。这样发动的最大好处有两点:一是流标签可以和任意的流关联,需要标识不同类型的流(可以是非五元组)时,无需对流标签做改动;二是流标签在IPv6基本头中,使用IPSec时此域对转发路由器可见,因此转发路由器可以在使用IPv6报文IPSec的情况下仍然可以通过三元组(流标签、源地址、目的地址)针对特定的流进行QoS(质量服务)处理。
净荷载长度Payload Length:长度为16bit。有效载荷是指紧跟IPv6报头的数据报的其它部分(即扩展报头和上层协议数据单元)。该字段只能表示最大长度为65535字节的有效载荷。如果有效载荷的长度超过这个值,该字段会置0,而有效载荷的长度用逐跳选项扩展报头中的超大有效载荷选项来表示(该字段表述数值为数据报长度减40)。
下一个ipv6首部Next Header:长度为8bit,下一个头部字段用来标识当前报头(或者扩展报头)的下一个头部类型。每种扩展报头都有其对应的值。下一个头部字段内定义的扩展报头类型与IPv4中的协议字段值类似,但在IPv6数据报中,紧接着IPv6报头的可能不是上层协议头部(当没有扩展报头或者为最后一个扩展报头时才是上层协议头),而是IPv6扩展报头。这一机制下处理扩展报头更高效,因为标识了数据报中对应的上层协议或者扩展报头类型,转发路由器只需处理必须处理的扩展报头,提高了转发效率。
跳数限制Hop Limit:长度为8bit。该字段类似于IPv4中的TTL字段,它定义了IP数据报所能经过的最大跳数。每经过一个设备,该数值减去1,当该字段的值为0时,数据报将被丢弃。
源IP地址Source Address:长度为128bit。表示发送节点的IPV6地址。
目的IP地址Destination Address:长度为128bit。表示接收节点的IPV6地址。
PS:节点是主机和路由器的统称。
四、IPV6扩展报头结构
IPv6扩展报头中主要字段解释如下:
Next Header:下一个报头,长度为8bit。与基本报头的Next Header的作用相同。指明下一个扩展报头(如果存在)或上层协议的类型。
Extension Header Len:报头扩展长度,长度为8bit。表示扩展报头的长度(不包含Next Header字段)。
Extension Head Data:扩展报头数据,长度可变。扩展报头的内容,为一系列选项字段和填充字段的组合。
在各字段介绍中我们讲到了,IPv6报文中可以携带可选的IPv6扩展报头。IPv6扩展报头是跟在IPv6基本报头后面的可选报头。由于在IPv4的报头中包含了几乎所有的可选项,因此每个中间路由器都必须检查这些选项是否存在。在IPv6中,这些相关选项被统一移到了扩展报头中,这样中间路由器不必处理每一个可能出现的选项(仅有**“逐跳选项”报头是必须要处理**的),提高了处理器处理数据报文的速度,也提高了其转发的性能。
IPv6扩展报头附加在IPv6报头目的IP地址字段后面,可以有0个,或者多个扩展报头。主要的IPv6扩展报头有一下几类:
目前,RFC 2460中定义了6个IPv6扩展头:逐跳选项报头(0)、目的选项报头(60)、路由报头(43)、分段报头(44)、认证报头(51)、封装安全净载报头(50)。
逐跳选项头(Hop-by-hop Options Header)
本扩展报头类型值为0(在IPv6报头下一个头部字段中定义,下同)。此扩展报头须被转发路径所有节点处理。目前在路由告警,资源预留(RSVP)和与Jumbo帧(Jumbo帧是长度超过65535字节的报文,传输这种报文需要转发路径中所有结点都能正常处理)处理中使用了逐跳选项头,因为路由告警需要通知到转发路径中所有结点。
目的选项头(Destination Options Header)
本扩展报头类型值为60。只可能出现在两个位置:
主要在移动IPv6中使用目的选项头,称为家乡地址选项。家乡地址选项由目的选项头携带,用以移动结点离开“家乡”后通知接受节点此移动结点对应的家乡地址。接受节点收到带有家乡地址选项的报文后,会把家乡地址选项中的源地址(移动节点的家乡地址)和报文中源地址(移动节点的转交地址)交换,这样上层协议始终认为是在和移动节点的家乡地址通信,实现了移动漫游功能。
路由头前,这是此选项头被目的节点和路由头中指定的结点处理;
上层头前(任何的ESP头后),此时只能被目的结点处理。
路由头(Routing Header)
本扩展报头类型值为43,用于源路由选项和移动IPv6。路由报头和IPv4的Loose Source and Record Route选项类似,该报头能够被IPv6源节点用来强制数据包经过特定的设备。
分段报头
本扩展报头类型值为44,用于标识数据报的分段,在IPv4中就有对应的字段。当源节点发送的报文超过传输链路MTU(源节点和目的节点之间传输路径的MTU)时,需要对报文进行分段时使用。
认证报头:
本扩展报头类型值为51,该报头由IPsec使用,提供认证、数据完整性以及重放保护。它还对IPv6基本报头中的一些字段进行保护。
封装安全净载报头:
本扩展报头类型值为50,该报头由IPsec使用,提供认证、数据完整性以及重放保护和IPv6数据报的加密,类似于认证报头。
上层头
这是用来标识数据报中上层协议类型,如TCP、UDP、ICMP(58)等。
注意:目的选项头最多出现两次,一次在路由头前,一次在上层协议头前,其他选项头最多只能出现一次。IPv6节点必须能够处理选项头(逐跳选项头除外,它固定只能紧随基本报头之后)在任意位置出现,以保证互通性。
同一个IPV6报头中各字段出现顺序
路由设备转发时根据基本报头中Next Header值来决定是否要处理扩展头,并不是所有的扩展报头都需要被转发路由设备查看和处理的。当超过一种扩展报头被用在同一个分组里时,报头必须按照下列顺序出现:
IPv6基本报头
逐跳选项扩展报头
目的选项扩展报头(路由扩展头前)
路由扩展报头
分段扩展报头
认证扩展报头
封装安全净载荷扩展报头
目的选项扩展报头(上层头前)
上层协议数据报文
五、IPv6地址
IPv6地址的表示方法:
IPv6地址总长度为128比特,通常分为8组,每组为4个十六进制数的形式,每组十六进制数间用冒号分隔。例如:FC00130F0000876A:130B,这是IPv6地址的首选格式。
为了书写方便,IPv6还提供了压缩格式,以上述IPv6地址为例,具体压缩规则为:
每组中的前导“0”都可以省略,所以上述地址可写为:FC00130F0876A:130B。
地址中包含的连续两个或多个均为0的组,可以用双冒号“::”来代替,所以上述地址又可以进一步简写为:FC00130F:876A:130B。
需要注意的是,在一个IPv6地址中只能使用一次双冒号“::”,否则当计算机将压缩后的地址恢复成128位时,无法确定每个“::”代表0的个数。
IPv6地址的结构:
一个IPv6地址可以分为如下两部分:
网络前缀:n比特,相当于IPv4地址中的网络ID
接口标识:128-n比特,相当于IPv4地址中的主机ID
对于IPv6单播地址来说,如果地址的前三比特不是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表示此接口标识全球唯一。
例如:MAC地址:000E-0C82-C4D4;转换后020EFE82:C4D4。
这种由MAC地址产生IPv6地址接口标识的方法可以减少配置的工作量,尤其是当采用无状态地址自动配置时,只需要获取一个IPv6前缀就可以与接口标识形成IPv6地址。但是使用这种方式最大的缺点是任何人都可以通过二层MAC地址推算出三层IPv6地址。
IPv6的地址分类:
IPv6地址分为单播地址、任意播地址(Anycast Address)、组播地址三种类型。和IPv4相比,取消了广播地址类型,以更丰富的组播地址代替,同时增加了任意播地址类型。
IPv6单播地址:
IPv6单播地址标识了一个接口,由于每个接口属于一个节点,因此每个节点的任何接口上的单播地址都可以标识这个节点。发往单播地址的报文,由此地址标识的接口接收。
IPv6定义了多种单播地址,目前常用的单播地址有:未指定地址、环回地址、全球单播地址、链路本地地址、唯一本地地址ULA(Unique Local Address)。
未指定地址
IPv6中的未指定地址即 0000:0/128 或者::/128。该地址可以表示某个接口或者节点还没有IP地址,可以作为某些报文的源IP地址,例如在邻居请求NS(Neighbor Solicitation)报文的重复地址检测中会出现。源IP地址是::的报文不会被路由设备转发。
环回地址
IPv6中的环回地址即 0000:1/128 或者::1/128。环回与IPv4中的127.0.0.1作用相同,主要用于设备给自己发送报文。该地址通常用来作为一个虚接口的地址(如Loopback接口)。实际发送的数据包中不能使用环回地址作为源IP地址或者目的IP地址。
全球单播地址
全球单播地址是带有全球单播前缀的IPv6地址,其作用类似于IPv4中的公网地址。这种类型的地址允许路由前缀的聚合,从而限制了全球路由表项的数量。
全球单播地址由全球路由前缀(Global routing prefix)、子网ID(Subnet ID)和接口标识(Interface ID)组成,其格式如下如所示:
全球单播地址各字段说明
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比特。
多说两句
为何需要link-local?
答:在一个接口可以配置很多IPv6地址,所以学习路由就有可能出现很多下一跳。所以出现Link Local地址唯一标识一个节点。在本地链路看到下一跳都是对端的Link Local地址。
在网络重新编址过程中,节点和路由器的Link Local地址不会发生变化,可以很容易地做一个修改,不用担心网络不可达。
那么又为什么要配置多个IPV6地址呢?
答:可以配置多个地址是可以使得用户接入不同的网段。因为有时候网络提供商是多个的,而他们都在不同的网段,每个提供商可以提供不同的服务,为了能够享受多种服务,PC和路由器就需要配置多个地址,使得不同网段都能接入。
当一个节点启动IPv6协议栈时,启动时节点的每个接口会自动配置一个链路本地地址(其固定的前缀+EUI-64规则形成的接口标识)。这种机制使得两个连接到同一链路的IPv6节点不需要做任何配置就可以通信。所以链路本地地址广泛应用于邻居发现,无状态地址配置等应用。
以链路本地地址为源地址或目的地址的IPv6报文不会被路由设备转发到其他链路。链路本地地址的格式如下如所示:
唯一本地地址
唯一本地地址是另一种应用范围受限的地址,它仅能在一个站点内使用。由于本地站点地址的废除(RFC3879),唯一本地地址被用来代替本地站点地址。
唯一本地地址的作用类似于IPv4中的私网地址,任何没有申请到提供商分配的全球单播地址的组织机构都可以使用唯一本地地址。唯一本地地址只能在本地网络内部被路由转发而不会在全球网络中被路由转发。唯一本地地址格式如下如所示:
唯一本地地址各字段说明
Prefix:前缀;固定为FC00::/7。
L:L标志位;值为1代表该地址为在本地网络范围内使用的地址;值为0被保留,用于以后扩展。
Global ID:全球唯一前缀;通过伪随机方式产生。
Subnet ID:子网ID;划分子网使用。
Interface ID:接口标识。
唯一本地地址具有如下特点:
具有全球唯一的前缀(虽然随机方式产生,但是冲突概率很低)。
可以进行网络之间的私有连接,而不必担心地址冲突等问题。
具有知名前缀(FC00::/7),方便边缘设备进行路由过滤。
如果出现路由泄漏,该地址不会和其他地址冲突,不会造成Internet路由冲突。
应用中,上层应用程序将这些地址看作全球单播地址对待。
独立于互联网服务提供商ISP(Internet Service Provider)。
IPv6组播地址:
IPv6的组播与IPv4相同,用来标识一组接口,一般这些接口属于不同的节点。一个节点可能属于0到多个组播组。发往组播地址的报文被组播地址标识的所有接口接收。例如组播地址FF02::1表示链路本地范围的所有节点,组播地址FF02::2表示链路本地范围的所有路由器。
IPv6组播地址格式如下图:
一个IPv6组播地址由前缀,标志(Flag)字段、范围(Scope)字段以及组播组ID(Global ID)4个部分组成:
前缀:IPv6组播地址的前缀是FF00::/8。
标志字段(Flag):长度4bit,格式如下:
flgs位的最高1bit为保留,必须设置为0
T位:如果为置0表示永久分配或者是well-known组播地址,如果置1表示临时分配动态的地址,不固定。
P位:如果置1的话表示此组播地址是一个基于单播前缀的ipv6组播地址。默认为0,如果P位设置为1,那么T位必须为1。
R位:如果置1的话表示此组播地址是一个内嵌RP地址的ipv6组播地址。默认为0。
PS:嵌入式RP(Embedded RP)是IPv6 PIM(组播的一个协议)中特有的RP发现机制,该机制使用内嵌RP地址的IPv6组播地址,使得组播路由器可以直接从该地址中解析出RP的地址。
范围字段(Scope):长度4bit,用来限制组播数据流在网络中发送的范围。
二进制 | 十六进制 | 范围类型 |
---|---|---|
0000 | 0 | reserved/保留 |
0001 | 1 | Interface-Local scope/本地接口范围 |
0010 | 2 | Link-Local scope/链路本地范围 |
0100 | 4 | Admin-Local scope/本地管理范围 |
0101 | 5 | Site-Local scope/本地站点范围 |
1000 | 8 | Organization-Local scope/本地组织范围 |
1110 | E | Global scope/全球范围 |
组播组ID(Group ID):长度112bit,用以标识组播组。目前,RFC2373并没有将所有的112位都定义成组标识,而是建议仅使用该112位的最低32位作为组播组ID,将剩余的80位都置0。这样每个组播组ID都映射到一个唯一的以太网组播MAC地址(RFC2464)。
组播组 | IPV6组播地址 |
---|---|
所有节点的组播地址 | FF02000:1 |
所有路由器的组播地址 | FF02000:2 |
所有OSPF路由器组播地址 | FF02000:5 |
所有OSPF的DR路由器组播地址 | FF02000:6 |
所有RIP路由器组播地址 | FF02000:9 |
所有PIM路由器组播地址 | FF02000:D |
被请求节点的组播地址 | FF0200FFXX:XXXX |
被请求节点组播地址:
被请求节点组播地址通过节点的单播或任播地址生成。当一个节点具有了单播或任播地址,就会对应生成一个被请求节点组播地址,并且加入这个组播组。一个单播地址或任播地址对应一个被请求节点组播地址。该地址主要用于邻居发现机制和地址重复检测功能。
IPv6中没有广播地址,也不使用ARP(节点请求是如何高效率去替代IPv4的ARP协议?在其他博文中会提到)。但是仍然需要从IP地址解析到MAC地址的功能。在IPv6中,这个功能通过邻居请求NS(Neighbor Solicitation)报文完成。当一个节点需要解析某个IPv6地址对应的MAC地址时,会发送NS报文,该报文的目的IP就是需要解析的IPv6地址对应的被请求节点组播地址;只有具有该组播地址的节点会检查处理。
被请求节点组播地址由前缀FF02:FF00:0/104和单播地址的最后24位组成。
IPv6任意播地址:
任意播地址标识一组网络接口(通常属于不同的节点)。目标地址是任意播地址的数据包将发送给其中路由意义上最近的一个网络接口。
任意播地址设计用来在给多个主机或者节点提供相同服务时提供冗余功能和负载分担功能。目前,任意播地址的使用通过共享单播地址方式来完成。将一个单播地址分配给多个节点或者主机,这样在网络中如果存在多条该地址路由,当发送者发送以任意播地址为目的IP的数据报文时,发送者无法控制哪台设备能够收到,这取决于整个网络中路由协议计算的结果。这种方式可以适用于一些无状态的应用,例如DNS等。
IPv6中没有为任意播规定单独的地址空间,任意播地址和单播地址使用相同的地址空间。目前IPv6中任意播主要应用于移动IPv6。
注意:IPv6任意播地址仅可以被分配给路由设备,不能应用于主机。任意播地址不能作为IPv6报文的源地址。
子网路由器任意播地址
子网路由器任意播地址是已经定义好的一种任意播地址(RFC3513)。发送到子网路由器任意播地址的报文会被发送到该地址标识的子网中路由意义上最近的一个设备。所有设备都必须支持子网任意播地址。子网路由器任意播地址用于节点需要和远端子网上所有设备中的一个(不关心具体是哪一个)通信时使用。例如,一个移动节点需要和它的“家乡”子网上的所有移动代理中的一个进行通信。
子网路由器任播地址由n bit子网前缀标识子网,其余用0填充。格式如下如所示:
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !