计算机网络:什么是 IPv6?和 IPv4 有什么区别?
结论:IPv6 用 128 位地址取代 IPv4 的 32 位,地址空间从约 43 亿扩展到 3.4×10^38; 同时简化首部、取消首部校验和与路由器分片、原生支持地址自动配置(SLAAC)与组播,设计上不再需要 NAT 来续命。
1. 对比
| 维度 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 位,约 43 亿个 | 128 位,约 3.4×10^38 个 |
| 写法 | 点分十进制 192.0.2.1 | 冒号十六进制 2001:db8::1 |
| 首部 | 20~60 字节,含校验和 | 40 字节固定,无校验和 |
| 分片 | 沿途路由器可分片 | 只在源端分片,依赖路径 MTU 发现 |
| 地址配置 | DHCP 为主 | SLAAC + DHCPv6 |
| NAT | 几乎必用 | 设计上不需要 |
| 广播 | 有广播地址 | 取消广播,改用组播与任意播 |
| 首部扩展 | 选项字段 | 扩展首部链,路由器不解析 |
| 安全 | IPsec 可选 | IPsec 在设计之初即纳入 |
首部去掉校验和不是偷工减料:链路层与传输层已有校验,逐跳重算 16 位校验和反而拖慢路由器转发。
2. 地址怎么写
完整形式:2001:0db8:85a3:0000:0000:8a2e:0370:7334
压缩规则:① 每组前导 0 可省 ② 连续的全 0 组用 :: 代替(只能出现一次)
压缩后: 2001:db8:85a3::8a2e:370:7334
结构划分(常见 /64 子网):
|<- 全局路由前缀 48 位 ->|<- 子网 ID 16 位 ->|<- 接口 ID 64 位 ->|
2001:db8:85a3 : 0001 : 0211:22ff:fe33:4455
特殊地址记几个就够:
| 地址 | 含义 |
|---|---|
| ::1/128 | 环回地址,对应 127.0.0.1 |
| ::/128 | 未指定地址,对应 0.0.0.0 |
| fe80::/10 | 链路本地地址,同一链路上通信,下一跳常用它 |
| fc00::/7 | 唯一本地地址(ULA),类似内网私有地址 |
| 2000::/3 | 全球单播地址,公网可路由 |
| ff00::/8 | 组播地址 |
3. 配置与检查
# 查看地址:global 可路由,link 仅本链路有效
ip -6 addr show dev eth0
# 加默认路由,下一跳通常是链路上对端的链路本地地址
ip -6 route add default via fe80::1 dev eth0
# 排查兼容问题时临时关掉某网卡的 IPv6
sysctl -w net.ipv6.conf.eth0.disable_ipv6=1
# 连通性测试,注意 -6 与方括号写法
curl -6 -g -I "http://[2001:db8::10]:8080/healthz"
nginx 同时监听双栈:
server {
listen 443 ssl;
listen [::]:443 ssl; # 监听所有 IPv6 地址
server_name example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
}
4. 常见追问
Q:为什么推了这么多年还没普及? NAT 已经把 IPv4 的地址压力大幅缓解,迁移是"纯成本、无直接收益"的工程; 再加上老旧设备、监控系统、内网硬编码地址的改造量巨大,运营商又习惯用 CGNAT 顶住,动力自然不足。
Q:IPv6 没有 NAT,是不是更不安全? NAT 从来不是安全边界,它只是地址转换的副作用。 IPv6 的安全靠防火墙默认拒绝入站、只放行必要端口;而且地址空间巨大,随机扫描很难命中,但这不能替代访问控制。
Q:IPv4 和 IPv6 能互通吗? 不能直接互通,需要过渡技术:双栈(最常见,两端都跑两套协议)、NAT64 + DNS64(把 IPv4 目标映射成 IPv6)、 隧道(6to4、6rd、GRE)。生产上以双栈为主。
Q:为什么 IPv6 只在源端分片? 路由器逐包分片开销大且易被放大攻击。IPv6 改为源端根据路径 MTU 发现(PMTUD)决定报文大小, 中间路由器遇到过大包直接回 ICMPv6 "Packet Too Big",由源端调整。
Q:IPv4 地址真的用完了吗? IANA 的地址池在 2011 年分配完毕,各区域注册机构也早已耗尽,剩余地址主要靠回收与交易流转。 这也是 CGNAT 和 IPv6 双栈并行的现实原因。
Q:[::1] 和 ::1 有什么区别?
::1 是地址本身;URL 里必须写成 [::1],方括号是 IPv6 地址在 URL / Host 头中的定界符,
用来和端口冒号区分,例如 http://[::1]:8080/。
小结
IPv6 不只是"地址变长",而是一次协议瘦身:固定首部、去掉逐跳校验和、取消广播、把分片推到源端、把配置交给 SLAAC。 迁移的现实路径是双栈共存,而不是一夜切换;判断一套系统是否真的支持 IPv6,看监听、路由、DNS AAAA 记录和防火墙策略四处是否都到位。