IPv6寻址、数据报与IPv4共存
为什么需要IPv6
IPv4地址只有32位,最多约43亿个。随着因特网的迅速发展,可分配的IPv4地址块早已耗尽。CIDR和NAT(见4.3节和4.5节)大大推迟了地址耗尽的时间,但它们都只是权宜之计。IPv6把地址长度扩展到128位:
这个数量足以为地球上的每一台设备分配大量地址。
IPv6地址的表示
IPv6地址写成8组,每组16位,用4位十六进制数表示,组与组之间用冒号隔开,例如:
2001:0db8:0000:0000:0000:ff00:0042:8329这样写太长,因此有两条缩写规则:
- 每组的前导0可以省略:
2001:db8:0:0:0:ff00:42:8329。 - 一串连续的全0组可以用两个冒号“::”代替:
2001:db8::ff00:42:8329。“::”在一个地址中只能出现一次,否则无法确定每一处各省略了几组。
当地址中有多串连续的全0组时,推荐折叠最长的一串;长度相同时折叠第一串;单独的一个0组一般不折叠。展开时,用8减去已经写出的组数,就是“::”代表的全0组个数。
与CIDR一样,IPv6用“地址/前缀长度”表示网络前缀。最常见的子网前缀是/64:前64位是网络前缀,后64位是接口标识(interface ID)。
| 地址或前缀 | 类型 | 说明 |
|---|---|---|
| ::/128 | 未指定地址 | 主机还没有地址时使用,类似IPv4的0.0.0.0 |
| ::1/128 | 环回地址 | 类似IPv4的127.0.0.1 |
| fe80::/10 | 链路本地地址 | 只在一条链路上有效,路由器不转发 |
| fc00::/7 | 唯一本地地址 | 用于机构内部,类似IPv4的私有地址 |
| ff00::/8 | 多播地址 | 发送给一组接口 |
| 2000::/3 | 全球单播地址 | 在因特网上可路由 |
IPv6没有广播地址,原来需要广播的功能都改用多播实现。
亲手缩写IPv6地址
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
IPv6数据报格式
IPv6首部的长度固定为40字节:
| 字段 | 长度 | 作用 |
|---|---|---|
| 版本 | 4位 | IPv6为6 |
| 流量类型 | 8位 | 与IPv4的服务类型字段类似 |
| 流标签 | 20位 | 标识属于同一“流”的数据报,便于路由器给予相同的处理 |
| 有效载荷长度 | 16位 | 首部之后的字节数 |
| 下一个首部 | 8位 | 数据部分交给哪个协议,或者后面跟着哪种扩展首部,作用与IPv4的协议字段相同 |
| 跳限制 | 8位 | 每经过一台路由器减1,减为0时丢弃,作用与IPv4的TTL相同 |
| 源地址、目的地址 | 各128位 | 发送方和接收方的IPv6地址 |
与IPv4相比,IPv6做了几项重要的简化:
- 不在路由器上分片。如果数据报太大,路由器把它丢弃,并向源主机发送ICMPv6“分组过大”报文;需要分片时只能由源主机完成。
- 取消首部检验和。链路层和传输层都有差错检测,路由器也就不必在每一跳重新计算检验和。
- 选项移到扩展首部中,用“下一个首部”字段串接起来。固定长度的首部让路由器处理得更快。
从IPv4过渡到IPv6
因特网上有数十亿台只支持IPv4的设备,不可能在某一天让所有设备同时切换到IPv6,因此两种协议必须长期共存。
双栈(dual stack)方法让节点同时实现IPv4和IPv6,与IPv4节点通信时使用IPv4,与IPv6节点通信时使用IPv6。
隧道(tunneling)方法用于连接被IPv4网络隔开的IPv6“孤岛”。隧道入口的双栈路由器把整个IPv6数据报作为一个IPv4数据报的数据部分,IPv4首部的目的地址是隧道出口,协议字段为41。途中的IPv4路由器只处理外层的IPv4首部,并不知道里面装着IPv6数据报。隧道出口收到后去掉IPv4首部,取出原来的IPv6数据报继续转发。
用IPv4隧道运送IPv6数据报
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
压缩、展开并分类IPv6地址
(a)写出下列地址的推荐压缩形式和地址类型:
fe80:0000:0000:0000:0204:61ff:fe9d:f1562001:0db8:0000:0001:0000:0000:0000:0001
(b)展开为完整的8个4位十六进制组:
ff02::1:22001:db8:a::1
(c)某组织获得一个/48前缀,它可以划分出多少个/64子网?
用Python展开与压缩IPv6地址
不借助ipaddress完成转换本身,编写expand(text)返回完整的8组形式,编写compress(full)返回推荐的缩写形式(去掉前导0,把第一串最长、且至少两组的连续全0组写成“::”)。用2001:db8::ff00:42:8329、fe80::204:61ff:fe9d:f156、::1和2001:0db8:0000:0001:0000:0000:0000:0001测试,ipaddress只用来核对答案。