IPv6简介
什么是IPv6
IPv6,Internet Protocol version 6(网际协议第六版),IPv4的升级版本。和IPv4类似,IPv6是一种逻辑编址方案,用于网络层主机到主机的通信。
为什么使用IPv6
IPv4初期由于其协议简单、易于物理实现等优势,被广泛使用。随着互联网技术迅速发展,IPv4在很多方面已经无法满足现有需求,IPv6的问世解决了IPv4的很多弊端。
IPv4的局限性/IPv6的优势
- 地址空间
IPv4的理论可用地址数为2的32次方约43亿个,已经无法满足巨量终端的入网需求,只能依靠NAT等技术减少公网IP的使用。实际上在2019年11月25日欧洲RIPE NCC宣布IPv4地址正式耗尽。
IPv6地址采用128bit标识,理论上可用地址数是2的128次方,为全部IPv4地址的2的96次方倍,拥有近乎无限的地址空间。
- 安全
IPv4在设计上并没有考虑网络层的安全问题,当时认为安全是上层才需要负责的。
IPv6集成了IPSec,支持IPSec的认证和加密。由于充足的地址空间,使得层次化地址分配成为可能,容易溯源。对于攻击者,在有限的时间内,无法遍历巨量的IPv6地址。
- 通信模型
由于NAT的大量使用,破坏了端到端的模型,由此衍生了一些列繁琐的配置(如端口映射)
IPv6地址充足,无需使用NAT。
- 路由聚合
互联网在世界各地发展并不均衡,所以IPv4在分配时各地区所获得的地址并不连续。这会导致每个地区的公网路由无法被聚合,路由表会相当庞大,对路由设备性能要求极高。
IPv6可以很方便的进行层次化网络部署,方便路由聚合,提高转发效率。
- 配置
IPv4没有重编功能,网卡原则上职能配置一个IPv4地址,而一个网卡可以配置多个并重的IPv6问题,简化重编值的复杂性。
IPv6内置自动配置,可使得主机自动发现网络并获取IPv6地址,提高管理效率。
- 处理效率
IPv4包头字段相对较多,对网络设备有一定性能要求
IPv6去除了标志位、段偏移、头部校验和、选项等字段,只增加流标签域方便做QoS,因此IPv6报头更为简化,提高处理效率。
IPv6地址
IPv6地址结构
一个IPv6地址由128个bit组成。一个十六进制数可以表示4个bit,通常用32个16进制数四个一组表示IPv6地址。如:
1 | 2001:0db8:02de:0000:0000:0000:0000:0e13/64 |
在一个IPv6地址中分为前缀和接口号两个部分。前缀和IPv4中网络号类似,用于标识一个网络;接口号和IPv4中主机号类似,用于标识终端。上述IPv6地址所在的网络是:
1 | 2001:0db8:02de:0000:0000:0000:0000:0000/64 |
IPv6地址表示
IPv6地址的简化表示
IPv6地址采用冒号分十六进制的方式表示。128bit长的IPv6地址可以表示8组4个十六进制数,用冒号隔开(如上述IPv6地址)。
其中,
每一组的前导0可以省略
连续的0可以用::来省略
一个IPv6地址中只能使用一次::来省略连续的0(不然无法唯一确定连续0的个数)。
如上述IPv6地址可简写为:
1 | 2001:db8:2de::e13/64 |
URL的IPv6表示
在URL中,需要使用[]来确定IPv6地址,如:
1 | http://[2001:ab:123::cdef]:8080/index.html |
IEEE EUI-64规范
IEEE EUI-64规范定义了如何将网络接口的MAC地址转换为IPv6接口标识。网卡物理地址由48bit组成,使用十六进制可表示为:
1 | 0050:A1AB:CDEF |
MAC地址的前24位(0050A1)为厂商标识,后24位(ABCDEF)为扩展标识符。从高位数,第7位是0表示了MAC地址本地唯一。
MAC转换位IPv6接口方法:
将48位的MAC地址从中间分开,插入一个固定数值FFFE
1 | 0050:A1AB:CDEF-->0050:A1FF:FEAB:CDEF |
然后将第7个比特位反转,如果原来是0,就变为1,如果原来是1,就变为0
1 | 0050:A1FF:FEAB:CDEF-->0250:A1FF:FEAB:CDEF |
这种由MAC地址产生IPv6地址接口标识的方法可以减少配置的工作量,尤其是当采用无状态地址自动配置时,只需要获取一个IPv6前缀就可以与接口标识形成IPv6地址。但是使用这种方式最大的缺点是任何人都可以通过二层MAC地址推算出三层IPv6地址。
IPv6地址分类
IPv6没有广播的概念,所以没有ARP包,也没有广播地址。IPv6地址分为单播、组播和任意播。
单播
单播地址用于一对一的连接,主要有以下几种类型
可聚合全球单播地址(Aggregate Global Unicast Address)
可聚合全球单播地址类似于IPv4的公网地址,可在全球路由。目前前三位为001的IPv6地址被用作可聚合全球单播地址,即2000:/3,占了12.5%的IPv6地址空间
IPv6全球可路由地址的分配
由于IPv6采用分级编址,IPv6全球可路由地址前缀由地址分配机构逐级向下分配:
前缀长度 | 适用场景 |
---|---|
32 | RIR/NIR(区域/国家互联网注册机构)分配给有 ASN 的运营商、互联网公司、大型企业。是地址最小分配单元(再小就不给了)。 |
40 | 运营商向有多个(256个以内)站点和数据中心的大型企业分配的前缀 |
44 | 运营商向有多个(16个以内)站点和数据中心的中型企业分配的前缀 |
48 | 运营商向中小客户分配的常见前缀长度。或大中企业内一个站点的前缀 |
56 | 宽带运营商给家庭用户和小微企业分配的最小前缀长度(最大子网大小) |
64 | 末端设备子网,/64 是很多协议硬性要求的(IPv6 无广播风暴风险) |
127 | 路由器点对点链路,此处不是为了节约地址而是防止一种资源耗尽型攻击 |
链路本地地址(Link-Local Address)
链路本地地址是一个只在本链路有效的IPv6地址。在一个节点启用IPv6后,每个接口都会生成以一个链路本地地址。链路本地地址前10bit固定,为
1 | fe80::/10 |
其后64位通常根据EUI-64格式来构造,但也有的终端是根据一定算法生成(出于安全原因),如:windows。
链路本地地址唯一标识一个节点,在本地链路看到下一跳都是对端的Link Local地址,在网络重新编址过程中,节点和路由器的Link Local地址不会发生变化,可以很容易地做一个修改,不用担心中断。
唯一本地地址 (Unique Local Address)
唯一本地地址类似于IPv4私网地址,今能在站点本地使用。由于站点本地地址被废除,唯一本地地址用来代替站点本地地址。
固定前缀为
1 | FC00::/7 |
其中,
L为标志位,值为1表示该地址为在本地网络范围内使用的地址;为0被保留,相当于只有FD00::/8被使用
Global ID为全球唯一前缀;随机产生
Subnet ID为子网ID;用于划分子网
Interface ID;接口标识
唯一本地地址拥有全球唯一前缀,可以在私有网络之间通信。
*站点本地地址 (Site-Local Address)已弃用
IPv6的保留地址,类似于IPv4的私网地址,只能在站点本地使用,无法在公网路由。站点本地地址占整个地址空间0.1%。
站点本地地址前10bit固定,为
1 | FEC0::/10 |
后54为左右子网标识,最后64为用于接口标识。
未指定地址 (Unspecified Address)
未指定地址表示地址未被指定,或者表示默认路由(所有路由),形式如下:
1 | 0:0:0:0:0:0:0:0 或 :: |
环回地址 (Loopback Address)
换回地址表示节点自己,在本节点有效,和IPv4类似,形式如下:
1 | 0:0:0:0:0:0:0:1 或::1 |
IPv4映射的IPv6地址 (IPv4-Mapped IPv6 Address)
IPv4映射的IPv6地址是包含IPv4的IPv6地址,用于双栈的本地范围
其中高80bit为0,后跟16bit的1,在跟IPv4地址,如:
IPv4地址
1 | 100.100.100.100 |
的IPv4映射的IPv6地址为
1 | ::ffff:6464:6464 |
*IPv4兼容地址 (IPv4-Compatible IPv6 Address) 已弃用
IPv4兼容的IPv6地址是包含IPv4的IPv6地址,用于在IPv4网络上建立自动隧道,传输IPv6包
其中高96比特设置为0,后面设置为32bit的IPv4地址,如:
IPv4地址
1 | 100.100.100.100 |
的IPv4兼容的IPv6地址为
1 | ::6464:6464 |
这种机制不太完善,后被弃用
组播
组播用于一对多的通信、
组播前缀固定FF00::/8,占用约0.38%的IPv6地址空间
其中,
FF为前8位固定值
Flag标志位0000永久保留
Scope传播范围
Scope定义了组播地址的范围,取值与范围如下:
十六进制 | 范围 |
---|---|
1 | 本地接口 |
2 | 本地链路 |
3 | 本地子网 |
4 | 本地管理 |
5 | 本地站点 |
8 | 组织机构 |
E | 全球 |
RFC2373建议将后112的前80为置0,后32位为组播的组ID
被请求节点组播地址 (Solicited-Node Multicast Address)
被请求节点组播地址根据每一个单播和任意播地址生成一个对应的组播地址,并加入该组播组。被请求节点组播地址只在本地有效。被请求节点组播地址用于邻居发现和DAD地址重复检测。
被请求节点组播地址固定前缀为FF02::1:FF00:0000/104,将IPv6地址的后24位填充到被请求节点组播地址的接口标识就组成了改IPv6地址的被请求节点组播地址。如:
1 | 2001::ABCD:ABCD/64 |
对应的被请求节点组播地址为
1 | FF02::1:FFCD:ABCD/104 |
如图,在路由器的一个接口上开启IPv6功能,然后查看该接口的ipv6的状态
1 | int e0/0 |
显示结果如下:
其中可以看到IPv6使能后,接口生成了链路本地地址,为FE80::A8BB:CCFF:FE00:200,并为它生成了被请求节点组播地址FF02::1:FF00:200
由于被请求节点组播地址是可以根据IPv6地址容易计算出来的,当需要解析链路上IPv6的二层地址时,可以通过NS报文发送至改IPv6的被请求节点组播地址,实现了类似IPv4中的ARP解析功能。
任意播
任意播本质是单播。任意播标识一组设备,需在网络设备如路由器上定义一个单播IPv6地址为任意播地址,当路由器收到目的地址为任意播地址时,会将其转发到最近的任意播地址。这种机制在网络层面上起到了类似于CDN的作用,就近分配任务。
IPv6没有为任意播单独定义地址空间,任意播和单播使用相同地址空间,任意播不可以作为源IPv6地址。
IPv6报文格式
IPv6报文由IPv6基本报头、IPv6扩展报头和上层协议数据三部分组成
IPv6基本报头
IPv6报头格式如下
其中
Version,为版本号,固定为6
Traffic Class,为流类别,与IPv4中TOS类似,定义流的类别
Flow Label,为流标签,新增字段,区分实时流量,网络设备可根据这个字段更高效的转发
Payload Length,为有效载荷长度,16bit,表示出基本头以外的载荷(拓展头和上层数据)长度,超过65535会置0
Next Header,为下一个报头,即紧跟在基本报头后的协议类型(可以是拓展报头也可以是上层协议)
Hop Limit,为跳数限制,类似于IPv4中的TTL,定义了IPv6数据包可以经过的最大跳数
Source Address,为源IPv6地址
Destination Address,为目的IPv6地址
IPv6拓展报头
IPv4中,IPv4报头包含可选字段Options,这些选项会增加IPv4报头长度,校验和也会改变,在实际中很少使用。
IPv6不使用Options字段,改用拓展报头。IPv6拓展报头位于IPv6基本报头与上层数据之间,根据需要可任意添加0个或多个拓展报头。下一级拓展报头通过上一级报头的Next Header字段指明协议类型。拓展报头格式如下:
RFC2460中定义了6种IPv6拓展头
IPv6拓展头 | Next Header | 作用 |
---|---|---|
逐跳选项 | 0 | 巨型载荷;设备提示;RSVP |
目的选项 | 60 | 携带目的节点才会处理的信息 |
路由 | 43 | 携带IPv6路由信息,强制指定数据包经过特点设备 |
分段 | 44 | IPv6也受MTU限制,通过分段拓展报头进行分段 |
认证 | 51 | 由IPsec使用,提供认证、完整性和重放等保护 |
封装安全净载 | 50 | 由IPsec使用,类似于AH |
IPv6大包ping分段拓展头抓包结果如下:
可以看到,IPv6基本头中的Next Header为分段拓展头协议号44,IPv6拓展报头中的Next Header指向ICMPv6协议号58
当超过一种扩展报头被用在同一个IPv6报文里时,不是所有的拓展报头都需要被处理,但报头必须按照下列顺序出现:
- IPv6基本报头
- 逐跳选项扩展报头
- 目的选项扩展报头
- 路由扩展报头
- 分段扩展报头
- 认证扩展报头
- 封装安全有效载荷扩展报头
- 目的选项扩展报头
- 上层协议数据报文
目的选项拓展报头可能出现1或2次,其它拓展报头只能出现一次。