关于IPv6,大概每个人都多多少少使用过,现在越来越多的机构的也在使用IPv6,但是总是觉得接触到的东西都没有真正清晰的说明Pv6到底是怎么回事,所以决定写个文章理一下思路。
IPv6是Internet Protocol Version 6的缩写,是对应IPv4的下一代IP协议。IPv4的问题大家都清楚,地址空间小,分配不灵活,协议本身的设计又缺乏安全性,网络发展过程中层出不穷的协议也让IPv4的解决有些吃力,QoS更是难以解决的大问题。所以IPv6应运而生。
一、表示方式
关于IPv6的发展历程不多说,先聊聊IPv6的表示方式。
IPv6的长度是128bit,是IPv4的32bit长度的四倍,目前有三种表示方式:
1、冒分十六进制表示法
格式为 X:X:X:X:X:X:X:X,其中每个X代表16个bit,以十六进制显示,如:
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
这种表示方式中前导的0可以省略表示(每个X中前面连续的0可以省略不写,若整个X都为0,则用一个0表示整个X),如:
2001:0DB8:0000:0023:0008:0800:200C:417A→ 2001:DB8:0:23:8:800:200C:417A
2、0位压缩表示法
在某些情况下,一个IPv6地址中问可能包含很长的一段0,可以把连续的一段0压缩为“::”。但为保证地址解析的唯一性,地址中”::”只能出现一次,例如:
FF01:0:0:0:0:0:0:1101 → FF01::1101
0:0:0:0:0:0:0:1 → ::1
0:0:0:0:0:0:0:0 → ::
3、内嵌IPv4地址表示法
为了实现IPv4-IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为:X:X:X:X:X:X:d.d.d.d,前96bit采用冒分十六进制表示,而最后32bit地址则使用IPv4的点分十进制表示,例如::192.168.0.1与::FFFF:192.168.0.1就是两个典型的例子 。
二、地址结构
IPv6分为单播、任播、组播,相比IPv4去掉了广播。每种播报方式的地址结构都不同,这里只讲详细讲单播的IPv6的地址结构。
IPv6的结构也是从高位开始解析,如下:
未知地址(全0)::/128,相当于IPv4的0.0.0.0;
环回地址::1/128相当于IPv4的127.0.0.1;
组播地址不多说;
链路本地地址相当于IPv4的局域网或者内网地址,只能在局域网内使用。
除了这些开头的地址都是全网单播地址(相当于可以在互联网上使用的IPv4地址)。
1、接口标识
接口标识用于标识一个连接,在每一个子网前缀下应该是唯一的,同一个接口标识不建议用于几个不同的节点上,在越大的范围下是唯一的就越好。有时候,接口标识肯会被从它所在的那一层派生出来,比如同一个接口标识可能会被用在同一个节点的多个子网前缀不一样的接口上。
注意,接口标识的唯一性和IPv6地址的唯一性是两码事,比如一个全网单播的IPv6地址可能会使用一个局部范围内唯一的接口标识,而一个链路连接的地址可能会用一个全网范围内唯一的接口标识。
除了二进制000开头的地址外,所有的接口标识都是64bit长,格式符合EUI-64。
如果从mac地址这类通用的token转换过来的,那么EUI-64格式的接口标识应该是全网唯一的。下图是接口标识前三个字节的格式,其中'u'的位置,如果是1表示这个标识是全网唯一的,如果是0则表示这个标识是局部范围的。'g'用来表示个体或组,'c'是所在网络的网名。
2、单播地址格式
全网单播地址的一般格式如下:
global routing prefix是分配给站点(一级子网/链路)的,subnet ID是子网号,标识站点内的连接,之后是接口标识的剩余部分(n+m等于64)。
3、v6内嵌v4的地址格式
IPv4兼容IPv6格式
这种模式将v4地址嵌入v6地址中用于兼容v6和v4地址,具体例子如下:
其中IPv4必须是公网地址(不能是内网地址)。不过这种老方法现在已经基本被弃用了。
IPv4映射到IPv6地址
4、链路连接v6单播地址格式
链路连接地址用在链路内连接的时候,格式如下:
这种地址格式多用于自动寻址、邻居发现算法或者没有路由器的时候。
路由器不会转发任何链路内的信息到链路外。
5、站点连接v6单播地址格式
站点地址用于站点内部寻址用于在站点内部进行寻址,因此不需要全局前缀,不过这种地址已经被弃用了。
最新的标准已经不支持这种地址格式了,subnet ID有值的时候只能是全网单播。但是已经这样部署的地址还可以使用,只是将其解析为全网单播的地址。