计算机网络课程总结--IPV6
本文主要讲述 IPV6 的一些基础知识,包括 IPV6 的术语,地址,一些基本协议以及从IPV4过渡到IPV6的的一些技术等。
IPV6的出现最主要的原因是因为 IPV4 存在着一些不足,主要有
- 地址不足
- 端到端模式无法实施(NAT)
- Qos和性能问题
- 配置复杂
- 安全问题
- 路由表的膨胀
- 移动性支持不足
其中最主要的就是地址不足。
在介绍IPV6的具体知识前,首先了解IPV6中的一些基本术语
从上图可知,IPV6 中有以下术语
- 领节点:不跨越网段的两台主机
- 局域网段:交换机某个端口下的网络
- 链路:路由器某个端口下的网络
- 子网(site):一个机构管辖的所有网络(不同于IPV4中的子网)
IPV6地址
IPV4地址
讲述IPV6地址前,首先回顾一下IPV4地址,IPV4的地址长度为32位,通过点分十进制表示,点分十进制的规则如下
- 将32位IP地址分为4个8位组
- 每个8位组之间用圆点 “.” 分隔
- 每个8位组转化为对应的十进制数
每个地址被划分为网路地址和主机地址两部分。地址可分为ABCD四类,每一类的地址范围如下图所示
IPV6地址表示
IPV6 地址长度是128位,通过冒分16进制表示,冒分16进制将128位划分为8组,组与组之间通过冒号隔开,每一组16位,用四个16进制数表示,如下所示
但是这样表示出来的地址往往在8各组中有很多组是全0的,为了书写的简便,定义了以下的规则: 1)忽略前导0, 2)忽略全0,用双冒号代替,注意一个地址最多只能有一个双冒号
如下是运用了这两条规则的一个简单例子
除此之外,IPV6中通过/XX
表示地址前缀,替代了IPV4中子网掩码的概念。
IPV6中的地址根据其作用域可以分为单播地址(Unicast Address),组播地址(Multicast Address)和任播地址(Anycast Address)三大类。IPV6中没有广播地址的概念。
单播地址
IPV6 单播地址用于唯一标识支持 IPV6 的设备上的接口,与 IPV4 类似,源 IPV6 地址必须是单播地址。在IPV6中,单播地址分为六类
- 链路本地地址(Link Local Address)
- 环回地址(Loopback Address )
- 未指定地址(Unspecified Address)
- 站点本地地址(Site Local Address)
- IPV4兼容地址(IPV4 Compatible Address )
- 可聚合全球单播地址(Aggregate Global Unicast Address)
链路本地地址
IPV4也有链路本地地址(169.254.0.0/16),但是在IPV4中,该地址的主要被用于地址自动配置:当主机不能从DHCP服务器处获得IP地址时,它会使用链路本地地址作为自己的地址。
但是在IPV6中,链路本地地址用于与同一链路(同一个路由器端口下的网络)中的其他设备通信,而且也只能用于同一链路中,因此,路由器不会转发具有本地链路源地址或目的地址的数据包。需要注意的是,每个支持 IPV6 的网络接口均需要有链路本地地址。有了链路本地地址,就可以与与同一子网中的其他支持 IPV6 的设备通信,包括与默认网关(路由器)通信。所以假如只需要在局域网内通信,可以不需要全局单播地址。
支持 IPV6 的主机在启动时自动创建 IPV6
链路本地地址。链路本地地址格式为 FE80::/64
,如下图所示
链路本地地址前64位为FE80:0:0:0
,后64位为EUI-64地址,EUI-64地址通过mac地址变换过来,变换规则如下所示
注意上图中前24位mac地址中用 u 标记的位表示要对原来的位取反。如下为一个简单的例子
链路本地地址的用途包括: 1)主机使用本地路由器的链路本地地址作为默认网关 IPV6 地址。 2)路由器使用链路本地地址交换动态路由协议消息。 3)转发 IPV6 数据包时,路由器的路由表使用链路本地地址确定下一跳路由器。
环回地址
与IPV4的127.0.0.1类似,在IPV6中对应为::1/128
或简单的
::1
。
通过环回地址启用 ping 命令,从而测试本地主机的 IP 协议是否正确安装。
未指定地址
未指定地址是全 0 地址,使用压缩格式表示为 ::/128
或
::
。
未指定地址不能分配给接口,仅可作为 IPV6 数据包的源地址。 未指定地址的作用在于当设备尚无永久 IPV6 地址时或数据包的源地址与目的地址不相关时,使用未指定地址用作源地址。
站点本地地址
站点本地地址是IPV6的私网地址,就像IPV4中的私网保留地址(10.0.0.0/8
,
172.16.0.0/12
,192.168.0.0/16
)一样。站点本地地址的前缀范围为
FC00::/10
。
最初的 IPV6 规范定义了用于特定用途的本地站点地址,但是因为站点本地地址规范中有很多不明之处,因此,IETF 已经弃用本地站点地址,开始倾向于唯一本地地址。
IPV4兼容地址
兼容IPV4的IPV6地址,用于过渡时期在IPV4网络上建立自动隧道,以传输IPV6数据包。其中高96位设为0,后面的32位的IPV4地址,即地址为::IPV4
.
可聚合全球单播地址
可聚合全球单播地址是由IANA分配的可在全球路由的公网IP,地址由格式前缀
001
标识,设计目标是聚合或汇总该地址以便产生有效的路由基础结构
从上图可知,ISP商分配的前缀位为前48位,Site部分则是由ISP下一级的组织机构用于划分子网,最后是64位的接口ID。
接口ID的产生方式有三种 1. EUI-64(前面讲述过,通过mac生成) 2. 随机生成 3. 手工配置
组播地址
IPV6中没有广播的概念,IPV6中通过组播代替广播。
IPV6中组播地址前八位均为1,因此组播地址总是以ff
开头,具体的组播地址格式如下
其中
Flags:用来表示permanent(0000)或transient(0001)组播组
Scope:表示组播组的范围 >0:预留 1:节点本地范围 2:链路本地范围 5:站点本地范围
Group ID:组播组ID
一些众所周知的组播地址如下图所示
除此之外还有有一种特殊的组播地址:Solicited-node节点地址(被请求节点组播地址),主要用于重复地址检测和获取邻居节点的链路层地址。
地址构成为
前104位:FF02::1:FF/104
(64个零)
后24位:单播地址的后24位
凡是单播地址后24位相同的接口会自动加入相应的请求节点组播组,如下为一个实例
关于组播更详细的信息可参考这篇文章。
任播地址
在IP网络上通过一个任播地址标识一组提供特定服务的主机,同时服务访问方并不关心提供服务的具体是哪一台主机(比如DNS或者镜像服务),访问该地址的报文可以被IP网络路由到这一组目标中的任何一台主机上,一般来说,目标地址为任播地址的数据报将发送给最近的一个服务主机。
综合上面提到的地址,可以知道一个接口上可以具有的IPV6地址如下所示
地址类型 | 具体地址 |
---|---|
链路本地地址 | FE80::/10 |
环回地址 | ::1/128 |
所有节点组播地址 | FF01::1,FF02::1 |
可聚合全球单播地址 | 2000::/3 |
被请求节点组播地址 | FF02::1:FF00:/104 |
主机所属组播地址 | FF00::/8 |
IPV6地址配置
IPV6中地址配置方式有三种 1. 手工配置 2. 无状态地址自动配置(ND协议) 3. 有状态地址自动配置(DHCPv6)
手动配置一般不常用,各系统均有自己的配置方式,这里不详细展开。下面主要讨论自动配置的两种方式。
无状态地址自动配置(ND协议)
无状态地址自动配置指的是无须任何配置即可和外界通信,达到了真正的即插即用。 无状态地址自动配置通过ND(Neighbor Discovery,邻居发现)协议实现,主要包括如何自动获取地址以及实现重复地址检测(DAD)
RS和RA
ND协议中有两种重要的消息:RS和RA。其中,RS(Router Solicitation)由主机发出,作用是促使路由器发送RA(Router advertisment)消息,RA消息中包含了路由器前缀等信息,主机会利用路由器的前缀加上自己的EUI-64地址作为自己的IPV6地址。这两种消息都是以ICMPv6报文的形式出现,也是5种ND协议消息中的两种。具体过程如下图所示
注意RS消息的目的地址是FF02::2
,也就是主机先整个链路的路由器请求RA消息,RA消息的目的地址是FF01::1
,也就是路由器向整个链路的主机发送RS消息。
因此为了避免RS泛滥,节点启动时最多只能发送3个RS,而路由器也会主动周期性地发送RA(默认值200秒)。主机在收到路由器的RA之后,自动设置默认路由器,建立默认路由器列表、前缀列表及其它参数。
需要注意的是,自动配置的IPV6地址在系统中有一个生存周期,跟优先时间和有效时间有关,对应着以下4种状态
在使用的时候需要遵循以下规则
1.在Preferred Lifetime
周期内的前缀生成的地址,任何上层应用都可不受限制地使用
2.在超过 Preferred Lifetime
但未超过Valid Lifetime
周期内的前缀生成的地址,正在使用该地址的上层应用可继续使用,但任何新的上层应用不能使用这个地址
3.在超过Valid Lifetime
周期内的前缀构造的地址,任何上层应用都不能使用该地址
一个链路本地地址的优先时间和有效时间是无限的,即永不超时!
NS和NA
在自动配置地址后需要检测该地址在链路上是否与其他地址重复(链路上的主机的mac地址可能重复,从而EUI-64重复),该过程称为DAD(Duplicate Address Detection),所有的IPV6单播地址,不管是自动配置还是手动配置,都必须要通过DAD。
结合上面地址的生存周期,一个地址在分配给一个接口之后且通过重复地址检测之前称为tentative地址,即试验地址。
DAD机制是ND协议的一部分,因此通过ND协议中的NS/NA
两种消息实现。DAD的基本流程:
1. 节点组播发送NS(Neighbor Solicitation)消息 2. 如果收到NA(Neighbor
Advertisment)消息,就证明地址重复 3.
如果尝试若干次发送请求,都没有收到邻居通告,即可启用该地址
过程如下所示
注意上面的NS消息的目的地址是被请求节点的组播地址,就是单播地址最后24位相同的主机都会加入的一个组播。而NA消息的目的地址是FF02::1
,原因是NS消息中的源地址是未指定地址,发出NA的主机并不知道NS是由那一台主机发出的。
当其他主机收到NS后,会有以下两种情形 1)NS接收者如果发现其中的目标地址对它而言是tentative的,则主动放弃使用这个地址; 2)NS接收者如果发现其中的目标地址是一个它正在使用的地址,则发送NA消息,请求发起者 将放弃使用这个试验地址
结合上面的RS和RA,4中ND消息交互入下
前缀重新编制
前缀重新编制允许网络从以前的前缀平稳地过渡到新的前缀,提供对用户透明的网络重新编址能力。
在前缀重新编址时,路由器会继续通告当前前缀,只是优先时间和有效时间被减小到接近0,同时,路由器开始通告新的前缀,这样,链路中至少有两个前缀共存。
节点收到优先时间和有效时间被减小到接近0的RA时,会发现当前前缀的生命周期较短,停止使用;同时开始用新的前缀配置接口,并进行DAD,通过后,获得新的地址使用。
在转换期间,节点有两个单播地址使用,旧的地址基于旧的前缀,用以维持以前已经建立的连接;新的地址,基于新的前缀,用来建立新的连接。当旧的前缀的有效时间递减为0时,旧的前缀完全废止,此时,RA中只包含新的前缀
有状态地址自动配置(DHCPv6)
有状态的自动配置依赖于DHCPv6实现,DHCPv6是DHCP的升级版本。
但是既然有了无状态自动配置,为什么还需要DHCPv6呢?主要有以下几个原因
- 需要动态指定DNS服务时
- 当不希望MAC地址成为IPV6地址的一部分时(安全性)
- 当需要良好的扩展性时
在讲述DHCPv6前,先介绍一下原始的DHCP协议
DHCP的过程非常自然,主要包括下面三步 1)DHCP客户发送广播请求 2)DHCP服务器单播应答 3)DHCP客户接收应答,获取IP等信息
具体过程使用四种package来实现这个过程
1)DHCP客户机在本地发送DHCP DISCOVER
广播包;
2)DHCP服务器单播发送携带租约信息的DHCP OFFER
包;
3)DHCP客户机确认租约信息并发送DHCP REQUEST
广播包;
4)DHCP服务器单播送回DHCP ACK
確认完成IP地址租用
DHCP有三种地址分配机制: 1)自动分配方式-由DHCP分配一个永久的IP 2)手动分配方式-网络管理员预先安排分配,由DHCP转达 3)动态分配方式-由DHCP分配具有租约期的IP
相比于DHCP,DHCPv6有了以下的改变 1.
使用UDP来交换报文,端口546/547(V4:67/68) 2.
使用本地链路地址或其它机制获得的地址来发送和接收DHCPv6报文 3.
没有了广播,客户机只需发送给保留的链路范围组播地址(FF02::1:2,all dhcp
relay agents and servers ) 4.
DHCP中使用的四种package在DHCPv6中依次变为DHCP Solicit
,
DHCP Advertis
, DHCP Request
,
DHCP Relay
.
其过程如下所示:
当客户端已经记录了地址和其他配置信息,只需要DNS server、NTP server等信息的时候,可以通过DHCPv6快速配置来快速获得所需地址。这个过程只需要两个消息的交互,过程如下所示:
IPV6报文
IPV6的报文主要由三部分组成 1. 基本头(固定40字节,v4不固定,为20~60字节范围内) 2. 拓展头(可选,0~n字节,v4中没有) 3. 有效负载(即上层传输数据)
基本头(与v4对比)
v4与v6的报文对比如下所示
且v4的报文的具体字段如下所示
v6的报文的具体字段如下所示
v6在v4字段的基础上有删除,也有修正的项,其中
修正的项有
- 服务类型→业务等级
- TTL→跳数限制
- 数据总长度→净荷长度(因为头部固定长度为40个字节)
- 地址32位→128位
- 协议→下一个头(next header,也是指示具体的协议的,不要被名称误导)
删除的项有
- 报头长
- 标志和分段偏移量(与分片相关)
- 报头校验和
增加的项为
- 流标记
下图是一个抓取到的ICMPv6的具体package
拓展头
除此之外,IPV6将一些IP层的可选功能实现在上层封装和IPV6基本头部之后的扩展头部中,主要的扩展报头有:
- 逐跳选项
- 路由报头
- 分段报头
- 认证报头
- 封装安全有效载荷报头
- 目标选项
每一种扩展报头其实也有自己特定的协议号,例如:路由报头为43,AH报头为51。上图中抓到的ICMPv6包的协议号为58(0x3a转为10进制),其他一些常见的协议号如下所示
协议号 | 含义 |
---|---|
0 | 逐跳扩展头 |
1 | ICMPv4 |
6 | TCP |
17 | UDP |
43 | 路由扩展头(使数据分组经过指定的中间节点) |
58 | ICMPv6 |
89 | OSPF |
每一个基本报头和扩展报头的NextHeader
字段标识后面紧接的内容,如下图所示
ICMPv6协议
ICMPv6协议与回声请求、抑制消息、重定向、参数错误等功能相关,相关的命令为ping
、traceroute
ICMP报文格式为Type+Code+CheckSum
,其报文的格式以及在整个分组的位置如下所示
ICMPv6报文类型可分为两种 (1)差错报文(Type=0~127):通告IPV6分组传输中出现的错误。如目标不可达、数据包超长、超时、参数问题 (2)信息报文(Type=128~255):提供诊断和附加的主机功能。如回声请求(Type=128)和应答(Type=129),ND协议等
ICMPv6的三个实际应用为
ping
tracert(HopLim与v4中的TTL意思相同) >第一个请求:HopLim=1 第一跳路由器收到,发送超时(HopLim=0)消息 得到第一跳路由器的信息 第二个请求:HopLim=2 第二跳路由器收到,发送超时消息 得到第二跳路由器的信息 注意:HopLim的最大值为30,且为了让每一个请求都返回超时信息,通常设置ICMPv6报文的端口不可达。
PMTU发现:通过试探的方式发现路径允许的最大的MTU,如下为一个简单的过程。
1)源机向目的机发送MTU=1500字节的IPV6数据包 2)路由器B向源发送超长消息,指定MTU=1400字节 3)源机向目的机发送MTU=1400字节的IPV6数据包 4)路由器C向源发送超长消息,指定MTU=1300字节 5)源机向目的机发送MTU=1300字节的IPV6数据包 6)此后,该路径的MTU都使用1300字节
IPV6路由
在讲述IPV6的路由之前先回顾IPV4的路由,IPV4的路由可以分为两大类:同一网络的路由和不同网络的路由。
同一网络间主机的通信主要依赖于ARP协议,根据目标IP查询其对应的mac地址,然后两者便可通信,中间可以不经过路由器。
不同网络间的通信则需要借助路由器,其过程如下所示
而对于 IPV6 的路由也可分为两种情况: on-link:源机和目的机在同一链路的数据转发 off-link:源机和目的机不在同链路的数据转发
通过地址前缀判断源和目的是否在同一链路。
on-link
处于同一链路的两条主机要通信就要知道对方的mac地址,在IPV4中通过ARP实现,ARP是通过广播实现的,但是IPV6中并没有广播的概念。在IPV6中,通过ND协议来完成这个地址解析的工作。
ND协议在我们介绍无状态地址自动配置的时候已经介绍过,但是除了无状态地址自动配置外,ND协议还被用于地址解析和路由重定向。
ND协议共有五种报文,五种报文都是以ICMPv6报文的形式出现,如下图所示
其地址解析过程如下:
1)首先查找邻居缓存表(IPV6 nc),没有则进行地址解析 (类似于查找ARP表) 2)源主机发送组播NS报文,该报文的目的地址为目标IPV6地址所对应的被请求节点组播地址(Solicited-node),在其中也包含了自己的链路层地址 3)目标主机收到NS报文后,就会了解到发送主机的IPV6地址和相应链路层地址;同时由于目标主机正在使用报文内的目标地址,所以会目标主机向源主机单播发一个邻接点公告报文(NA),该报文中包含自己的链路层地址。
这里需要注意的是最后的NA报文是单播的,而在无状态地址自动配置中NA报文是组播,原因在于无状态地址自动配置的时候发送NS的主机还没有有效的地址,而这里的主机已经有了,只是要找到另外一台主机的mac地址而已。
下图便是上面提的地址解析过程
off-link
当源和目的不在同一链路的时候,需要考虑两个问题
1.主机发给哪个路由器?(主机-路由器) 2.路由器发给哪个路由器?(路由器-路由器)
对于第一个问题,支持IPV6的主机有一个数据结构DestinationCache
,要发送数据到某个目的地址的时候,首先查询这个数据结构,如果查不到,就查路由表,让后将查到的信息记录在这个数据结构中。
如果查询到的目的地址是on-link的,将目的地址本身加入DC表的nexthop域;如果目的地址是off-link的,将路由表中的下一跳加入DC的nexthop域。
在这个过程中,会涉及到重定向的问题,重定向的作用其实就是给主机发送更好的路由。下图为一个简单的例子
当 PC1 要与 PC2 通信时,首先会先向 RT1 查询,RT1查询后发现RT2可以直接提供这个路由,于是RT1告诉PC1以后如果要与PC2通信直接找RT2就好了,效率会更高,这就是路由重定向。
实际中,RT1发现报文的出口和入口相同或者源地址跟报文下一跳同属一个网段,则发出重定向报文,重定向报文就是ND报文中的最后一种报文(其他四种是RS,RA,NS,NA)
对于问题2,也就是路由器与路由器之间的传输,就需要依靠路由表了。路由表中的路由根据是否需要人工配置而分为静态路由和动态路由,其中静态路由需要人工配置,动态路由则通过协议学习,在IPV6中的动态路由协议主要有RIPng
,OSPFv3
和BGP4+
。
RIPng保留了RIP的主要特点
- 距离矢量采用跳数,16跳为不可达
- 工作机制不变;
- 仍然采用水平分割、毒性逆转、触发更新等技术减少路由环的发生
主要改变的地方:
- 组播代替广播:主机不再受骚扰
- 下一跳信息由单独的
R Table Entry
表示 (RTE) - 安全考虑:不单独设置验证,由IPV6本身保证
- 只用于IP网络:不再支持其他网络协议
同样,OSPFv3保留了OSPFv2的主要工作机理
- 采用链路状态数据库
- 与邻接路由器同步
- DR选举、SPF算法、area区域支持
主要改变的地方
- 地址信息从LSA中移除;(LSU载荷中包含地址信息)
- RouterID仍然采用32位,但不再跟地址有关
- 重新定义了LSA(如增加了link-LSA、Intra-Area-Prefix-LAS等,即LSDB的内容发生了变化)
- 不再支持认证
过渡技术
从IPV4到IPV6的过渡被认为要经过三个阶段
过渡的技术共分为三类
- 双栈:网络设备上运行IPV6/IPV4双协议栈
- 隧道:IPV6网络上承载IPV4分组,或相反
- 翻译/转换:地址、分组、端口的转换
双栈
一般基础设施设备,如路由器、交换机、公用服务器等,需要运行和支持双栈,非基础设置则可运行单协议或双协议。
隧道
根据创建方式可以大致分为两类 1)手动隧道:事前配置 2)自动隧道:创建和拆除都依赖当前网络条件
根据实际的网络环境又可以分为两类隧道
- IPV6分组通过IPV4网络的隧道
- IPV4分组通过IPV6网络的隧道
IPV6分组通过IPV4网络时,IPV6分组作为数据部分搭载到IPV4分组中,在这种情形下,IPV4分组头部的protocol=41
,如下图所示。
根据IPV4网络位置的不同,在不同的位置建立
IPV4分组通过IPV6网络的情况跟上面一样。
翻译/转换
翻译/转换就是从IPV4转换到IPV6,或反过来,不仅发生在网络层,还有传输层和应用层。如下图所示是一个翻译/转换的例子。
注意:当双栈和隧道都无法使用的时候,才使用翻译/转换技术;适用纯IPV4节点和纯IPV6节点间的通信。