知识点编号:023
难度等级:⭐⭐(了解)
面试频率:🔥🔥🔥
🎯 一句话总结
IPv6是128位超长地址,解决了IPv4地址不够用的问题!🌍
🤔 为什么需要IPv6?
IPv4的问题:
- 总共:43亿个地址(2^32)
- 实际可用:更少(私有地址、保留地址)
- 全球设备:远超43亿(手机、电脑、IoT...)
- 结果:地址不够用了!💀
IPv6的解决:
- 总共:340万亿亿亿亿个地址(2^128)
- 数量:340,282,366,920,938,463,463,374,607,431,768,211,456
- 够用:地球上每粒沙子都能分配一个IP!🏖️
📐 IPv6地址结构
基本格式
128位,分成8组,每组16位(4个十六进制数)
格式:
XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX
示例:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
对比IPv4:
192.168.1.1(32位,4段十进制)
简化规则
规则1:前导零可以省略
原始:2001:0db8:0000:0042:0000:8a2e:0370:7334
简化:2001:db8:0:42:0:8a2e:370:7334
规则2:连续的0可以用::代替(只能用一次)
原始:2001:0db8:0000:0000:0000:0000:0000:7334
简化:2001:db8::7334
规则3:双冒号只能出现一次
错误:2001::db8::7334 ❌
正确:2001:db8::7334 ✅
🏠 IPv6地址类型
1. 单播地址(Unicast)
全球单播地址(类似IPv4公网地址)
前缀:2000::/3
示例:2001:db8:85a3::8a2e:370:7334
链路本地地址(类似IPv4的169.254.x.x)
前缀:fe80::/10
示例:fe80::1
用途:同一链路上的通信
唯一本地地址(类似IPv4私有地址)
前缀:fc00::/7
示例:fd00::1
用途:内网通信
2. 组播地址(Multicast)
前缀:ff00::/8
示例:ff02::1(所有节点)
ff02::2(所有路由器)
3. 任播地址(Anycast)
特点:
- 多个节点共享同一个地址
- 数据包发送到最近的一个节点
- 用于负载均衡、CDN
示例:
DNS根服务器使用任播地址
🆚 IPv4 vs IPv6
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 长度 | 32位 | 128位 |
| 地址数 | 43亿 | 340万亿亿亿亿 |
| 表示 | 十进制,用.分隔 | 十六进制,用:分隔 |
| 示例 | 192.168.1.1 | 2001:db8::1 |
| 头部 | 20-60字节 | 40字节(固定) |
| NAT | 需要 | 不需要 |
| 广播 | 有 | 无(用组播代替) |
💻 Java代码示例
import java.net.*;
public class IPv6Example {
public static void main(String[] args) {
try {
// IPv6地址
InetAddress ipv6 = InetAddress.getByName("2001:db8::1");
System.out.println("地址:" + ipv6.getHostAddress());
System.out.println("规范形式:" + ipv6.getCanonicalHostName());
System.out.println("是否IPv6:" + (ipv6 instanceof Inet6Address));
// 本地IPv6地址
InetAddress localhost6 = InetAddress.getByName("::1");
System.out.println("IPv6 localhost:" + localhost6.getHostAddress());
// 获取所有网络接口的IPv6地址
NetworkInterface.getNetworkInterfaces().asIterator()
.forEachRemaining(ni -> {
ni.getInetAddresses().asIterator()
.forEachRemaining(addr -> {
if (addr instanceof Inet6Address) {
System.out.println("接口 " + ni.getName() +
": " + addr.getHostAddress());
}
});
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
IPv6 Socket编程
// IPv6服务器
public class IPv6Server {
public static void main(String[] args) throws Exception {
// 绑定IPv6地址
ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress("::", 8080));
System.out.println("IPv6服务器启动在 [::]:8080");
Socket client = server.accept();
System.out.println("客户端连接:" + client.getInetAddress());
}
}
// IPv6客户端
public class IPv6Client {
public static void main(String[] args) throws Exception {
// 连接IPv6地址(注意:URL中要用[]括起来)
Socket socket = new Socket("2001:db8::1", 8080);
System.out.println("已连接到IPv6服务器");
}
}
🌐 特殊IPv6地址
::1
- IPv6的localhost
- 相当于IPv4的127.0.0.1
::
- 未指定地址
- 相当于IPv4的0.0.0.0
fe80::/10
- 链路本地地址
- 自动配置,不需要DHCP
ff00::/8
- 组播地址
- 替代IPv4的广播
::ffff:192.168.1.1
- IPv4映射地址
- 在IPv6中表示IPv4地址
🐛 常见面试题
Q1:IPv6和IPv4有什么区别?
答案:
1. 地址长度
IPv4:32位(43亿)
IPv6:128位(340万亿亿亿亿)
2. 地址表示
IPv4:十进制,192.168.1.1
IPv6:十六进制,2001:db8::1
3. 头部简化
IPv4:20-60字节,可变
IPv6:40字节,固定
4. 不需要NAT
IPv6地址足够多,每个设备都能有公网地址
5. 内置安全性
IPv6强制支持IPSec
6. 自动配置
IPv6支持无状态地址自动配置(SLAAC)
7. 无广播
IPv6用组播代替广播,减少网络负担
8. 更好的移动支持
移动IPv6支持设备在不同网络间漫游
Q2:为什么IPv6还没有完全普及?
答案:
原因:
1. IPv4还能用
- 通过NAT、私有地址勉强够用
- 没有紧迫性
2. 升级成本高
- 设备更换
- 软件升级
- 人员培训
3. 兼容性问题
- IPv4和IPv6不兼容
- 需要双栈或隧道技术
- 过渡期复杂
4. 应用支持
- 很多应用还不支持IPv6
- 网站、服务需要改造
5. 运营商支持
- 需要运营商支持
- 基础设施改造
现状:
- 全球IPv6采用率:约40%(2024)
- 中国、印度采用率较高
- 移动网络IPv6普及更快
- 逐步过渡中...
未来:
IPv6是趋势,但完全替代IPv4还需要时间
🎓 总结
IPv6的关键点:
- 128位:地址超级多
- 十六进制:用冒号分隔
- 简化规则:省略前导零,::代替连续0
- 不需要NAT:地址够用
- 内置安全:支持IPSec
记忆口诀:
IPv6地址长 📏
128位十六进 🔢
冒号来分隔 :
双冒号省零 ::
地址够全球用 🌍
文档创建时间:2025-10-31