IPv4 与 IPv6 对比
2019 年 11 月 25 日,欧洲 RIPE NCC 宣布 IPv4 地址耗尽。
这意味着:从此以后,新入网的设备,再也分不到公网 IPv4 地址了。
你可能觉得无所谓——我又不是新设备。但你有没有想过:为什么家里要用 NAT?为什么手机流量这么贵?为什么物联网设备越来越多却用得好好的?
答案都和 IPv4 vs IPv6 有关。
IPv4 的困境
IPv4 地址是 32 位,理论上只有 2^32 ≈ 42 亿个地址。
但实际上:
- 每个网络要预留两个地址(网络地址和广播地址)
- 私有地址不能用于公网
- 一些地址段被保留或用于特殊用途
实际可分配的公网 IPv4 地址只有约 37 亿个,而全球人口 80 亿——远远不够。
应对措施
为了延缓 IPv4 耗尽的速度,业界采取了一系列「续命」手段:
- NAT(网络地址转换):让多个私有 IP 共享一个公网 IP
- DHCP 动态分配:用完就回收,让地址复用
- 地址回收:把早年的浪费地址收回
- CIDR(无类别域间路由):更灵活地分配地址
但这些只是延缓,无法从根本上解决问题。
IPv6:地址问题的终极答案
IPv6 把地址长度从 32 位扩展到 128 位。
这个数字有多大?给你个直观感受:
IPv4: 2^32 ≈ 43 亿
IPv6: 2^128 ≈ 340 润(3.4 × 10^38)340 润是什么概念?比宇宙中的原子数还多。理论上,IPv6 可以为地球上的每一粒沙子分配一个 IP 地址。
IPv6 地址格式
IPv6 地址用冒号分隔的 8 组 16 进制数:
2001:0db8:85a3:0000:0000:8a2e:0370:7334简化规则
1. 每组的前导零可省略:
0000 → 0
00db → db
2. 连续的全零组可用 :: 替代(只能出现一次):
2001:0db8:85a3:0000:0000:8a2e:0370:7334
→ 2001:db8:85a3::8a2e:370:7334
3. 示例:
完整:2001:0db8:0000:0000:0000:0000:0000:0001
简化:2001:db8::1 ← 本地回环地址IPv6 地址类型
单播(Unicast) → 一对一,包发给一个接口
├─ 全球单播 → 类似公网 IP,全网唯一
│ 2000::/3 (2000-3fff)
├─ 链路本地单播 → 仅本地链路有效
│ fe80::/10
└─ 唯一本地单播 → 私有地址,类似 10.x.x.x
fc00::/7
组播(Multicast) → 一对多,包发给一组接口
ff00::/8 (ff00-ffff)
任播(Anycast) → 一对最近的一个
从路由角度看是单播,从投递角度看是最近的IPv6 没有广播!
IPv6 用组播替代了广播。广播在 IPv4 中用于 ARP、DHCP 等,但容易引发广播风暴和安全性问题。
IPv6 中:
- ARP → 替代为邻居发现协议(NDP)
- DHCP → 有状态 DHCPv6 或无状态的 SLAAC
- 广播地址 → 组播地址
ff02::1(所有节点)
核心对比
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 位(4 字节) | 128 位(16 字节) |
| 地址数量 | ≈ 43 亿 | ≈ 340 润 |
| 表示方法 | 点分十进制 | 冒号十六进制 |
| 子网掩码 | 支持(CIRD) | 前缀长度固定 |
| 分片处理 | 端系统和路由器都可分片 | 仅发送端分片,路径 MTU 发现 |
| 首部字段 | 可变长度(20-60 字节) | 固定 40 字节 |
| 安全 | 依赖 IPsec(可选扩展) | 内置 IPsec |
| NAT | 必须(地址不够) | 可选(地址够用) |
| 组播 | 支持 | 支持(更强大) |
| 广播 | 支持 | 不支持 |
| 移动性 | 支持但复杂 | 原生支持 |
| 头部校验和 | 有 | 无(依赖上层校验) |
IPv6 的优势
1. 地址近乎无限
地球上的沙子都能分到 IP 地址,更别说物联网设备了。
2. 简化头部
IPv6 头部固定 40 字节,字段从 12 个减到 8 个,路由器处理更快。
IPv4 头部(至少 20 字节):
┌─────────┬─────────┬───────────┬──────────────────┬─────────────┐
│ 版本 4 │ IHL │ TOS │ 总长度 │ │
├─────────┼─────────┼───────────┼──────────────────┼─────────────┤
│ 标识 │ 标志 │ 片偏移 │ TTL │ 协议 │
├─────────┼─────────┼───────────┼──────────────────┼─────────────┤
│ 头部校验和│ 源地址(32位) │ │
├────────────────────────────────────────────────────┤
│ 目的地址(32位) │ │
└────────────────────────────────────────────────────┘
IPv6 头部(固定 40 字节):
┌─────────┬─────────┬───────────────────────────────┐
│ 版本 6 │ 流量类别│ 流标签 │
├─────────┼─────────┼───────────────────────────────┤
│ 负载长度 │ 下一头部│ 跳数限制 │
├────────────────────────────────────────────────────┤
│ 源地址(128位) │
├────────────────────────────────────────────────────┤
│ 目的地址(128位) │
└────────────────────────────────────────────────────┘3. 即插即用(无状态地址自动配置 SLAAC)
设备接入 IPv6 网络后,能自动获得 IP 地址,无需 DHCP 服务器。
1. 主机生成链路本地地址(fe80::/10 + EUI-64)
2. 发送邻居请求(Neighbor Solicitation)验证地址唯一性
3. 通过路由器发现获取网络前缀
4. 组合前缀 + 接口标识 = 全球单播地址4. 内置 IPsec
IPv6 可以强制使用 IPsec 加密通信。虽然 IPv4 也能用 IPsec,但 IPv6 是强制支持,相当于 HTTPS 成为默认。
5. 更好的移动性
IPv6 的「路由头」和「目的选项头」让移动设备在网络间切换时,能保持连接不中断。
6. 路径 MTU 发现
IPv6 要求发送端先发现路径中的最小 MTU,再发送合适大小的数据包,避免分片带来的性能损失。
IPv6 的挑战
1. 兼容性
IPv6 和 IPv4 不兼容。需要双栈(同时运行两套协议)、隧道(IPv6 over IPv4)或转换(NAT64)来过渡。
2. 地址太长了
2001:db8::1 还算好记,但 2001:0db8:85a3:0000:0000:8a2e:0370:7334 根本没法手打。实际使用中需要依赖 DNS。
3. 私有地址变成「奢侈品」
IPv4 中 NAT 提供了天然的网络隔离。IPv6 地址太多,公网直连反而增加了被扫描攻击的风险——需要在防火墙上手动限制。
4. 过渡期漫长
全球 IPv6 普及率(约 30-40%)仍然不高,互联网骨干网的升级需要时间。
实际应用
查看本机 IPv6 地址
# Linux/Mac
ip addr show
# 或
ifconfig
# Windows
ipconfig
# 示例输出:
# eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
# inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
# inet6 fe80::a00:27ff:fe3b:59d3 prefixlen 64 scopeid 0x20<link>
# inet6 2001:db8::1 prefixlen 128 scopeid 0x0<global>IPv6 测试
# 测试本机是否支持 IPv6
ping6 ipv6.google.com
# 测试 IPv6 连通性
curl -6 https://ipv6.google.com
# 查看网站的 IPv6 地址
dig AAAA www.example.com面试追问方向
- IPv4 地址为什么不够用了?有哪些应对措施?
- IPv6 地址有多长?理论上有多少个?
- IPv6 有哪几种地址类型?和 IPv4 有什么区别?
- IPv6 为什么移除了广播?替代方案是什么?
- IPv6 的头部和 IPv4 相比有什么变化?
- 什么是 SLAAC?IPv6 主机如何自动获得地址?
- IPv4 到 IPv6 的过渡方案有哪些?
