【Java EE】IPv6

IPv6

引言

随着互联网的飞速发展,IPv4 地址已经于 2019 年正式耗尽。为了解决地址枯竭问题,IETF 设计了下一代互联网协议------IPv6 (Internet Protocol version 6)。IPv6 将地址长度从 32 位扩展到 128 位,理论上可提供约 3.4×10³⁸ 个地址,足以满足未来物联网、移动设备等海量设备的接入需求。

IPv6 不仅解决了地址数量问题,还在安全性、自动配置、路由效率、移动性支持等方面做出了根本性改进,是未来网络基础设施的核心协议。

IPv6 地址表示

IPv6 地址是一个 128 位的二进制数,通常采用 冒号十六进制表示法,将 128 位分成 8 组,每组 16 位,用十六进制表示,组之间用冒号分隔。

完整格式示例:

复制代码
2001:0DB8:0000:0000:0000:FF00:0042:8329

简化规则:

  1. 省略前导零 :每组中的前导 0 可以省略。例如 0042 可简写为 42
  2. 双冒号压缩 :连续的零组可以用 :: 代替,但一个地址中只能使用一次 ::

简化后示例:

复制代码
2001:DB8::FF00:42:8329

特殊地址:

  • ::1 ------ 环回地址(相当于 IPv4 的 127.0.0.1
  • :: ------ 未指定地址(相当于 IPv4 的 0.0.0.0

IPv6 地址的文本表示规范(RFC 5952) :推荐全小写十六进制字母、尽可能压缩、双冒号优先压缩最长的零组。例如 2001:db8::1 是标准写法。

IPv6 地址类型

IPv6 取消了广播地址,引入了三种新的地址类型:

地址类型 前缀 说明
单播地址 --- 标识单个接口,发往该地址的数据包只被该接口接收
├ 全局单播地址 2000::/3 相当于 IPv4 的公网地址,可在全球范围内路由
├ 链路本地地址 FE80::/10 自动配置,仅在同一链路内通信,不可路由
└ 唯一本地地址 FC00::/7 相当于 IPv4 的私有地址,用于内部网络
多播地址 FF00::/8 一对多通信,替代了 IPv4 的广播功能
任播地址 --- 一对最近通信,数据包被发送到一组接口中最近的一个

地址范围详解

  • 全局单播地址(2000::/3):由全球路由前缀(48位)、子网ID(16位)和接口标识符(64位)组成。IANA 分配给各 RIR(如 APNIC、ARIN),再由 RIR 分配给 ISP 和企业。
  • 链路本地地址(FE80::/10):每个 IPv6 接口自动生成,用于邻居发现协议(NDP)、路由协议(如 OSPFv3)等本地通信,无需手动配置。
  • 唯一本地地址(FC00::/7):类似 IPv4 的私有地址(10.0.0.0/8、192.168.0.0/16),但具有全局唯一性,通过伪随机算法生成,避免地址冲突。

多播地址结构

多播地址格式为 FF + 标志位(4位)+ 范围域(4位)+ 组ID(112位)。常见范围域值:

  • 1 --- 节点本地
  • 2 --- 链路本地
  • 5 --- 站点本地
  • 8 --- 组织本地
  • E --- 全局

常用多播地址:

  • FF02::1 --- 所有节点(链路本地)
  • FF02::2 --- 所有路由器(链路本地)
  • FF02::1:FFxx:xxxx --- 请求节点多播地址(用于重复地址检测)

IPv6 与 IPv4 的主要区别

对比项 IPv4 IPv6
地址长度 32 位 128 位
地址数量 约 43 亿 约 3.4×10³⁸
地址表示 点分十进制 冒号十六进制
首部长度 可变(20~60 字节) 固定 40 字节
校验和 无(依赖上层和链路层校验)
分片 路由器可进行分片 仅源主机分片(路径 MTU 发现)
广播 支持 取消,由多播替代
NAT 广泛使用 设计上无需 NAT
安全性 可选(IPSec) 原生支持 IPSec
自动配置 DHCP 无状态地址自动配置(SLAAC)
移动性 支持有限 原生支持(MIPv6)
QoS 服务类型字段 流量类型 + 流标签

IPv6 首部格式

IPv6 的首部固定为 40 字节,相比 IPv4 简化了许多,去掉了校验和、选项字段等,提高了路由器转发效率。

字段 位数 说明
版本 4位 固定为 6
流量类型 8位 类似于 IPv4 的服务类型,用于 QoS
流标签 20位 用于标识同一数据流,便于路由器处理
有效载荷长度 16位 标识数据部分的长度(不含首部)
下一个首部 8位 标识扩展首部或上层协议类型(相当于 IPv4 的协议字段)
跳数限制 8位 相当于 IPv4 的 TTL,每经过一个路由器减 1
源地址 128位 发送方 IPv6 地址
目的地址 128位 接收方 IPv6 地址

扩展首部

IPv6 通过 扩展首部 实现选项功能,只有需要时才添加,提高了处理效率。常见的扩展首部包括:

下一个首部值 扩展首部类型 说明
0 逐跳选项首部 每跳路由器都必须处理,用于巨型载荷、路由器告警等
43 路由首部 指定数据包经过的中间节点,类似 IPv4 的松散源路由
44 分片首部 源主机对数据包进行分片,路由器不再参与分片
50 封装安全载荷(ESP) IPSec 加密和认证
51 认证首部(AH) IPSec 数据完整性认证
60 目的选项首部 仅目的节点处理

扩展首部按固定顺序链式排列,每个首部的"下一个首部"字段指向下一个扩展首部或上层协议。

IPv6 地址配置方式

无状态地址自动配置(SLAAC)

SLAAC 是 IPv6 的核心特性之一,设备无需 DHCP 服务器即可自动获取地址。流程如下:

  1. 设备生成链路本地地址(FE80::/10 + 接口标识符)
  2. 通过邻居请求(NS)进行重复地址检测(DAD)
  3. 发送路由器请求(RS),等待路由器通告(RA)
  4. 路由器回复 RA,包含前缀、前缀长度、默认网关等信息
  5. 设备根据前缀 + 接口标识符生成全局单播地址

有状态配置(DHCPv6)

DHCPv6 提供更精细的地址和参数管理,分为两种模式:

  • 有状态 DHCPv6:服务器分配地址和其他配置参数
  • 无状态 DHCPv6:地址通过 SLAAC 获取,其他参数(如 DNS 服务器)通过 DHCPv6 获取

手动配置

管理员手动指定 IPv6 地址、前缀长度、默认网关等参数,适用于服务器、网络设备等固定场景。

邻居发现协议(NDP)

NDP 是 IPv6 的核心协议,替代了 IPv4 的 ARP、ICMP 重定向、路由器发现等功能。主要功能包括:

功能 对应 IPv4 机制 说明
地址解析 ARP 通过邻居请求(NS)/邻居通告(NA)获取链路层地址
重复地址检测 使用 NS 检测地址是否已被占用
路由器发现 ICMP 路由器发现 通过 RS/RA 发现本地路由器
前缀发现 DHCP 获取网络前缀信息
重定向 ICMP 重定向 通知主机更优的下一跳
无状态自动配置 DHCP 自动生成 IPv6 地址

NDP 使用 ICMPv6 类型 133~137 的消息,相比 ARP 广播更高效、更安全。

IPv6 安全特性

原生 IPSec 支持

IPv6 设计时原生集成了 IPSec,提供:

  • 认证首部(AH):数据完整性验证和源认证
  • 封装安全载荷(ESP):数据加密和可选认证
  • 安全关联(SA):通信双方的安全策略协商

安全邻居发现(SEND)

使用加密生成地址(CGA)和资源公钥基础设施(RPKI)保护 NDP 过程,防止地址欺骗、重定向攻击等。

常见安全威胁与防护

威胁类型 描述 防护措施
邻居欺骗 伪造 NA/NS 消息 启用 SEND、RA Guard
路由欺骗 伪造 RA 消息 启用 RA Guard、源地址验证
分片攻击 利用分片首部绕过防火墙 限制分片数量、状态检测
隐私泄露 基于 MAC 的接口标识符可追踪 启用隐私扩展(RFC 4941)

DNSv6(DNS over IPv6)

DNS(域名系统)是互联网的核心基础设施,负责将域名解析为 IP 地址。在 IPv6 环境下,DNS 也进行了相应的扩展和优化,形成了 DNSv6 体系。

DNSv6 的核心概念

DNSv6 并非一个全新的协议,而是 DNS 协议在 IPv6 网络中的适配与增强。其核心变化包括:

  • AAAA 记录:IPv6 的域名解析记录类型,相当于 IPv4 的 A 记录,用于将域名映射到 IPv6 地址。
  • 反向解析(PTR 记录) :IPv6 反向解析使用 ip6.arpa 域,将 IPv6 地址反向解析为域名。例如地址 2001:db8::1 的反向查询域名为 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa
  • 传输层支持:DNS 查询和响应可以基于 IPv6 传输,即 DNS 客户端和服务器之间通过 IPv6 网络通信。

AAAA 记录详解

AAAA 记录(Quad-A 记录)是 DNSv6 中最常用的资源记录类型,其格式如下:

复制代码
example.com.  3600  IN  AAAA  2001:db8:1234::1
字段 说明
域名 要解析的域名
TTL 缓存时间(秒)
固定为 IN(Internet)
类型 AAAA
IPv6 地址 目标 IPv6 地址

示例:查询 www.google.com 的 AAAA 记录

bash 复制代码
$ dig AAAA www.google.com

; <<>> DiG 9.18.28 <<>> AAAA www.google.com
;; ANSWER SECTION:
www.google.com.  300  IN  AAAA  2404:6800:4005:80c::2004

DNSv6 的传输机制

DNS 查询可以通过 IPv4 或 IPv6 传输,两者独立工作:

  • IPv4 DNS 查询 :客户端向 IPv4 DNS 服务器(如 8.8.8.8)发送查询,获取 A 或 AAAA 记录。
  • IPv6 DNS 查询 :客户端向 IPv6 DNS 服务器(如 2001:4860:4860::8888)发送查询,获取 A 或 AAAA 记录。

典型 DNSv6 服务器地址:

服务商 IPv6 DNS 地址
Google Public DNS 2001:4860:4860::8888 / 2001:4860:4860::8844
Cloudflare 2606:4700:4700::1111 / 2606:4700:4700::1001
Quad9 2620:fe::fe / 2620:fe::9
阿里云 DNS 2400:3200::1 / 2400:3200:baba::1
114DNS 114.114.114.114(IPv4 兼容,IPv6 需额外配置)

DNSv6 的配置方式

通过 SLAAC 获取 DNS 服务器

传统 SLAAC 不提供 DNS 服务器信息,但 RFC 8106(RA 选项中的 DNS 配置) 扩展了路由器通告(RA)消息,使其可以携带 DNS 服务器地址(RDNSS 选项)和 DNS 搜索域(DNSSL 选项)。

复制代码
Router Advertisement (RA)
  ├── Prefix Information Option (PIO)
  ├── MTU Option
  └── RDNSS Option          ← 新增,携带 DNS 服务器地址
      └── DNS Server: 2001:4860:4860::8888

通过 DHCPv6 获取 DNS 服务器

DHCPv6 的 无状态模式 专门用于分发 DNS 服务器地址和其他配置参数,而不分配 IP 地址。客户端通过 SLAAC 获取地址后,再通过 DHCPv6 获取 DNS 信息。

bash 复制代码
# Linux 客户端通过 DHCPv6 获取 DNS 服务器
$ dhclient -6 -P eth0
# 或使用 NetworkManager 自动处理

手动配置

在操作系统或网络设备上手动指定 IPv6 DNS 服务器地址。

Linux 示例(/etc/resolv.conf):

复制代码
nameserver 2001:4860:4860::8888
nameserver 2606:4700:4700::1111

Windows 示例(PowerShell):

powershell 复制代码
Set-DnsClientServerAddress -InterfaceAlias "以太网" -ServerAddresses ("2001:4860:4860::8888","2606:4700:4700::1111")

DNS64 与 NAT64 的配合

DNS64 是 IPv6 过渡技术的重要组成部分,与 NAT64 配合使用,使 IPv6-only 主机能够访问 IPv4-only 资源。

工作原理:

  1. IPv6-only 客户端向 DNS64 服务器发起 AAAA 记录查询
  2. 如果目标域名存在 AAAA 记录,直接返回
  3. 如果目标域名只有 A 记录,DNS64 服务器将 A 记录中的 IPv4 地址合成到 IPv6 地址前缀中(通常为 64:ff9b::/96),生成合成的 AAAA 记录返回
  4. 客户端向合成的 IPv6 地址发起连接,NAT64 网关将其转换为 IPv4 连接

示例:

复制代码
客户端查询 www.example.com 的 AAAA 记录
  → DNS64 发现只有 A 记录(93.184.216.34)
  → 合成 AAAA 记录:64:ff9b::5db8:d822
  → 客户端向 64:ff9b::5db8:d822 发起连接
  → NAT64 网关转换为对 93.184.216.34 的 IPv4 连接
相关推荐
憧憬成为java架构高手的小白15 小时前
苍穹外卖--day10(订单状态定时处理、来单提醒和客户催单)
java·spring boot
ch.ju16 小时前
Java Programming Chapter 4——Construction method
java·开发语言
小龙报16 小时前
【优选算法】双指针专项:1.移动零 2. 复写零 3.快乐数
java·c语言·数据结构·c++·python·算法·面试
AI行业学习16 小时前
CC-Switch Windows + macOS 下载安装配置全流程
java·开发语言·人工智能·python
Niliuershangba16 小时前
ChestnutCMS 栗子内容管理系统:从入门到模板开发实战
java·git·开源·gitlab·github·开源软件·gitcode
2601_9577867716 小时前
多平台矩阵运营的底层逻辑:当账号管理、内容生产与线索转化被一条链路串起来
java·数据库·矩阵·多平台管理
代码中介商16 小时前
排序算法完全指南(六):希尔排序深度详解
java·算法·排序算法
布吉岛的石头16 小时前
Java 程序员第 22 阶段:Function Call 工具调用实战,Java 封装大模型外部能力
java·人工智能·python
阿维的博客日记17 小时前
线程任务执行报错后,线程会不会挂掉,Java线程池
java·线程池
Hwang25217 小时前
Spring 框架- 容器单例池的理解
java