IPv4的最大地址空间仅允许有4.3亿个地址。但实际上减去特殊用途的预留地址,比如测试地址、广播地址、内网地址,实际可用的地址空间更加有限。解决IPv4地址耗尽的措施,唯一途径就是开发IP规范的新版本。
IPv6相比IPv4在报文结构和通信方式上有较大改变
IPv4地址被局限在32位,提供2的32次方个地址,IPv6有128位,提供2的128次方个地址
因为IPv6地址是128位的,所以用二进制表示不方便,16个字节,因此IPv6地址用8组2字节的十六进制表示,每组用分号隔开
如:1111:aaaa:2222:bbbb:3333:cccc:4444:dddd
一眼扫过不太容易记住,这也是换取更大地址空间的代价
不过IPv6地址记法的一个特性是一些值为0的组可以省略
1111:0000:2222:0000:3333:4444:5555:6666
上面的地址可以省略掉其中全是0的一个组,让0不可见,如下
1111::2222:0000:3333:4444:5555:6666
然而,一次只能省略一个值为0的组,所以下面的地址是无效的
1111::2222::3333:4444:5555:6666
还有一种简化的方法就是把IPv6地址前置的0都省略掉,如下
1111:0000:2222:0333:0044:0005:ffff:ffff
上面的地址可以简写成下面的地址
1111::2222:333:44:5:ffff:ffff
一个IPv6地址分为网络部分和主机部分,分别称为网络前缀(network prefix)和接口标识符(interface identifier)。这两个部分在地址上的分布取决于IPv6的通信类型。IPv6通信类型有3种类型:单播(unicast)、任播(anycast)和多播(multicast)。
在多数情况下会遇到本地连接之间的单播,就是在单一网络中的一个设备和另一个设备通信。单播本地连接的IPv6格式如下:
在同一网络下和另一个设备通信需要用到本地连接地址。一个本地连接地址的前10个最高有效位被设置为1111111010,紧接着的54位被设置为0 。所以,当你看到一个地址的前半部分是 fe80:0000:0000:0000,这就是一个本地连接地址
本地连接IPv6地址的另一半是接口IP部分,它表明了在网络上唯一的一个主机端点。在以太网中,这是基于MAC地址而来的。然而,MAC地址只有48位。要把64位全部填满,MAC地址先被切成两半,然后值 0xfffe 在两边被当作补码附属上,组成一个唯一标识符。最后,反转第一个字节的第7位比特。
上图的接口ID,原设备的MAC地址是78:31:c1:cb:b2:56,字节0xfffe先被加入到中间然后 8 反转成了a
IPv6地址簇可以用CIDR的记法来表示,与IPv4地址簇记法相似,上面的64位地址空间可以可以表示为一个本地连接地址:
fe80:0000:0000:0000:/ 64
当单播流量在公网上传播时,IPv6的地址会发送变化
当使用这种方式时,全局单播通过将前三位设置为001,加上45位全局路由前缀来标识。全局路由前缀由IANA分配,它可以唯一地标识一个组织的地址空间。接下来的16位是子网ID,它可以用来划分地址,类似于IPv4地址的子网掩码。最后64位被用来当做接口ID,类似于本地连接地址。路由前缀和子网ID可以依据大小而发生变化
版本号:IP协议的版本(IPv6的值为6)
流量优先级:用于Qos(服务质量)中区分特定流量的优先级次序
流标号:用来标识同一个流里的报文,这个部分通常适用在Qos管理中确认报文来自同一路径的同一流
有效载荷长度:表名该IPv6包头部后包含的字节数,包含(扩展头部)
下一个首部:用来指明报头后接的第4层的报文头部的类型,该部分替代了IPv4报文头中的协议字段
跳数限制:定义了一个报文的生命周期,代替IPv4报文头中的TTL
源地址:该报文的来源IP地址
目的地址:该报文的目的IP地址
IPv4
IPv4和IPv6的对比
IPv6不支持广播流量,因为广播被认为是低效的传输机制。没有广播,所以主机之间互相寻找的ARP协议无法使用。
IPv6通过邻居请求(neighbor solicitation)的新特性,利用ICMP6完成工作,是邻居发现协议(NDP)的一项功能
要完成这项工作,ICMP6使用多播,多播是指把信息同时传递给一组目的地址,只有订阅了数据流的主机才会收到和处理数据
多播流量很好地址,有自己保留的IP空间(ff00::/8)
如:地址2001:db8:1:2::1003要和地址2001:db8:1:2::1000的主机通信
在同一网络下通信,源设备必须知道目的设备的mac地址
1 主机 2001:db8:1:2::1003通过多播发送一个邻居请求(ICMPv6 135类型)报文到每一个在网络上的设备
“IP地址是2001:db8:1:2::1000的设备的MAC地址是什么,我的MAC地址是 00:0c:29:2f:80:31”
2 拥有这个IP地址的设备会收到这个消息,并使用邻居通告(ICMPv6 136 类型)回复源主机
“我的网络地址是2001:db8:1:2::1000,并且MAC地址是00:0c:29:2f:a7:55”
3 一旦上面的消息被源主机收到,就可以开始通信了
IPv4报头内置分片支持,要确认报文能够穿过所有MTU值不同的网络。在IPv6里,很少用到分片,故未包含在IPv6报头。
一个传输IPv6报文的设备在发送前会执行MTU探索的过程,该过程会决定报文的最大容量。
IPv6指出了一个非常现实的问题,但转换现有网络架构所需的代价导致普及非常缓慢。要简化这种转换,就需要一些协议让IPv6会话可以在仅支持IPv4的网络中通过隧道传输。因此,隧道意味着IPv6会话是封装在IPv4会话中的,就像其他可以被IPv4封装的协议一样。封装通常通过以下3种方式
路由器到路由器:使用一个隧道来封装IPv6流量,使得来自一边网络的收发主机都可以访问另一边的IPv4网络。这种方法可以让整个网络使用IPv6,网络内部有IPv4节点。
主机到路由器:在路由层封装用来传输从IPv6主机穿过IPv4网络的流量。这种方法允许在IPv4网络里单一支持IPv6的主机访问外部IPv6网络
主机到主机:在两个端点之间封装IPv6流量。这个方法允许两个IPv6端点直接穿过IPv4网络通信。
常见的转换协议:6to4 Teredo ISATAP等