IPV6
Section outline
-
互联网协议版本6(IPv6)是一种旨在克服IPv4局限的新协议。引入这一协议的主要原因是提供相较于IPv4更大的地址空间。
IPv6与IPv4的比较
IPv6扩展了ICMP协议,集成了以下协议功能:
- ARP:在地址配置过程中称为“邻居发现”。
- IGMP:在管理组播组成员时称为“组播监听器发现”。
在IPv6中,一些协议需要升级,主要是因为这些协议涉及地址(这些协议并非与第3层无关):
- DNS协议;
- 路由协议:如RIP、OSPF、BGP、IDRP;
- 传输协议:如TCP、UDP;
- 套接字接口。
IPv6新增功能
以下新增功能最初被设计为IPv4的附加组件,后被移植并嵌入到IPv6中。
局域网部署效率
IPv6通过高效使用组播和任播地址提高了局域网的部署效率:
- 组播:每个组播地址标识一个节点组,数据包将转发到组内的所有节点。
- 任播:每个任播地址标识一个节点组,数据包仅转发到组中距离最近的节点。
数据安全与隐私
IPv6协议中内置了安全机制,例如IPsec。
策略路由
IPv6支持按不同策略转发数据包,而不仅仅依赖目的地址(例如,基于源地址转发)。
即插即用
IPv6定义了自动配置协议:
- 无状态:无需联系任何服务器,仅保证链路本地访问。
- 有状态:通过DHCP服务器可实现互联网访问。
流量区分
IPv6支持不同数据流的差异化处理(例如,电话通话需要更低的延迟)。
移动性
设备可在不同网络间移动,同时保持所有服务可用(例如,使用GSM/LTE的移动设备在不同小区间移动)。
游牧性
设备可在不同网络间移动,但无需确保服务保持活跃 → 相较于移动性要求更低。
更好的路由可扩展性
通常,为了简化路由需要进行地址聚合,但这会浪费地址空间。IPv6使用与IPv4几乎相同的路由技术,但如果地址分配高效,则可以减少路由表的大小。
地址
地址格式
每个IPv6地址为128位长,前缀替代了网络掩码:
前缀 接口标识符
链路
IPv6中的链路概念与IPv4中的子网类似:
- 在IPv4中,子网是一组具有相同前缀的主机;
- 在IPv6中,链路是实际的物理网络。
同一链路上的所有主机都具有相同的前缀,因此可以直接通信;不同链路上的主机通过路由器通信。
地址空间组织
全球单播地址
聚合全球单播地址
等同于IPv4的公网地址,以三位“001”开头:3 16 48 64 88 96 104 128 001 ID TLA ID NLA ID SLA OUI ('universal' bit = 1) FF FE 制造商选择的MAC部分 前缀 接口标识符(EUI 64)
- 前缀:必须与主机连接的链路分配的前缀一致。
- 分配准则:基于拓扑结构,根据服务提供商层级分配:
- TLA:顶级权威(大型服务提供商);
- NLA:下级权威(中间服务提供商);
- SLA:子网级权威(组织)。
- 接口标识符:标识主机接口。可选择采用EUI-64格式,即从主机的48位MAC地址派生的64位IPv6接口标识符。
IPv4互操作地址
过渡阶段使用,前80位为零:
- IPv4映射地址:前80位为零,接下来的16位为1:
0000 0000 0000 0000 0000 FFFF ...
- IPv4兼容地址:前80位为零,接下来的16位为零(例如IPv6地址“::10.0.0.1”映射到IPv4地址“10.0.0.1”):
0000 0000 0000 0000 0000 0000 ...
本地单播地址
链路本地地址
这些是通过自动配置生成的“自动”私有地址,用于连接IPv6链路:FExx ...
站点本地地址
等同于IPv4的私有地址:FDxx ...
组播地址
组播地址标识一组站点,具有以下格式:
8 12 16 128 FF 标志 (000T) 范围 组ID
互联网协议版本6(IPv6)是一种旨在克服IPv4局限的新协议。引入这一协议的主要原因是提供相较于IPv4更大的地址空间。
IPv6与IPv4的比较
IPv6扩展了ICMP协议,集成了以下协议功能:
- ARP:在地址配置过程中称为“邻居发现”。
- IGMP:在管理组播组成员时称为“组播监听器发现”。
在IPv6中,一些协议需要升级,主要是因为这些协议涉及地址(这些协议并非与第3层无关):
- DNS协议;
- 路由协议:如RIP、OSPF、BGP、IDRP;
- 传输协议:如TCP、UDP;
- 套接字接口。
IPv6新增功能
以下新增功能最初被设计为IPv4的附加组件,后被移植并嵌入到IPv6中。
局域网部署效率
IPv6通过高效使用组播和任播地址提高了局域网的部署效率:
- 组播:每个组播地址标识一个节点组,数据包将转发到组内的所有节点。
- 任播:每个任播地址标识一个节点组,数据包仅转发到组中距离最近的节点。
数据安全与隐私
IPv6协议中内置了安全机制,例如IPsec。
策略路由
IPv6支持按不同策略转发数据包,而不仅仅依赖目的地址(例如,基于源地址转发)。
即插即用
IPv6定义了自动配置协议:
- 无状态:无需联系任何服务器,仅保证链路本地访问。
- 有状态:通过DHCP服务器可实现互联网访问。
流量区分
IPv6支持不同数据流的差异化处理(例如,电话通话需要更低的延迟)。
移动性
设备可在不同网络间移动,同时保持所有服务可用(例如,使用GSM/LTE的移动设备在不同小区间移动)。
游牧性
设备可在不同网络间移动,但无需确保服务保持活跃 → 相较于移动性要求更低。
更好的路由可扩展性
通常,为了简化路由需要进行地址聚合,但这会浪费地址空间。IPv6使用与IPv4几乎相同的路由技术,但如果地址分配高效,则可以减少路由表的大小。
地址
地址格式
每个IPv6地址为128位长,前缀替代了网络掩码:
前缀 接口标识符
链路
IPv6中的链路概念与IPv4中的子网类似:
- 在IPv4中,子网是一组具有相同前缀的主机;
- 在IPv6中,链路是实际的物理网络。
同一链路上的所有主机都具有相同的前缀,因此可以直接通信;不同链路上的主机通过路由器通信。
地址空间组织
全球单播地址
聚合全球单播地址
等同于IPv4的公网地址,以三位“001”开头:3 16 48 64 88 96 104 128 001 ID TLA ID NLA ID SLA OUI ('universal' bit = 1) FF FE 制造商选择的MAC部分 前缀 接口标识符(EUI 64)
- 前缀:必须与主机连接的链路分配的前缀一致。
- 分配准则:基于拓扑结构,根据服务提供商层级分配:
- TLA:顶级权威(大型服务提供商);
- NLA:下级权威(中间服务提供商);
- SLA:子网级权威(组织)。
- 接口标识符:标识主机接口。可选择采用EUI-64格式,即从主机的48位MAC地址派生的64位IPv6接口标识符。
IPv4互操作地址
过渡阶段使用,前80位为零:
- IPv4映射地址:前80位为零,接下来的16位为1:
0000 0000 0000 0000 0000 FFFF ...
- IPv4兼容地址:前80位为零,接下来的16位为零(例如IPv6地址“::10.0.0.1”映射到IPv4地址“10.0.0.1”):
0000 0000 0000 0000 0000 0000 ...
本地单播地址
链路本地地址
这些是通过自动配置生成的“自动”私有地址,用于连接IPv6链路:FExx ...
站点本地地址
等同于IPv4的私有地址:FDxx ...
组播地址
组播地址标识一组站点,具有以下格式:
8 12 16 128 FF 标志 (000T) 范围 组ID
以下是字段的含义:
组播地址字段
-
标志字段(Flag field,4位):
- 用于标记组播组的类型:
- T = 1:临时组播组(例如用户定义的电话会议组)。
- T = 0:永久组播组(例如网络中所有主机的地址,无法被覆盖)。
- 用于标记组播组的类型:
-
范围字段(Scope field,4位):
- 用于限制组播的传播范围(比IPv4的TTL更优):
- 1 = 节点本地:数据包无法离开主机。
- 2 = 链路本地:数据包无法离开第2层网络。
- 5 = 站点本地:数据包无法离开,例如校园网络。
- 8 = 组织本地:数据包无法离开组织网络。
- E = 全球:数据包可到达任何地方。
- 用于限制组播的传播范围(比IPv4的TTL更优):
-
组ID字段(Group ID field,112位):
- 标识组播组,数据包将转发到组内所有节点。
如果主机想加入组播组,需要通过ICMP协议请求加入。一旦加入组播组,该主机将接收发送到该组播地址的所有数据包。需要注意的是,接收组播数据包的主机并非由发送方决定,而是由目标端决定。
请求节点组播地址
每个活动节点默认属于一个请求节点组播组,其地址派生自该节点的IPv6地址:
96 104 128 FF02::1 FF IPv6地址的后24位
同一组播组中可能有多个主机,但通常不会,因为组播地址由IPv6地址生成。
将IPv6映射到以太网
每个组播数据包通过一个带特定MAC地址的以太网帧传输,该MAC地址从IPv6组播地址派生,从而确保只有相关主机处理数据包:
16 48 3333 IPv6目标地址的后32位
IPv6地址的高级主题
重新编号
由于全球地址的前缀是根据服务提供商的层级分配的,如果公司希望更换服务提供商,公司网络中的所有链路前缀都需要更改。IPv6支持对主机和路由器进行简单的重新编号:
- 主机:路由器逐步停止广播旧前缀(弃用),开始广播新前缀(首选) → 在迁移阶段,每个主机将为同一接口拥有两个带不同前缀的地址。
- 路由器:路由器重新编号是一个标准,允许边界路由器通知内部其他路由器新前缀。
然而,重新编号仍有一些未解决的问题,例如如何自动更新DNS条目、防火墙过滤器、基于地址的企业策略等。
多宿主(Multi-homing)
一家大公司可能选择从两个不同的服务提供商购买互联网连接,以确保即使一个服务提供商出现问题,也能保持连接。
由于全球地址的前缀是根据服务提供商层级分配的,公司网络内的每个主机将为同一接口拥有两个带不同前缀的全球地址 → 主机需要为每个出站数据包选择正确的地址。这可能导致一些非平凡的配置问题:
- 基于目的地址的路由:主机应选择正确的前缀,否则如果主机选择了提供商A的前缀,而目标在提供商B的网络中 → 边界路由器将数据包直接转发到提供商B的网络 → 提供商B可能会阻止该数据包,因为源地址前缀不同。
- DNS中的双重注册:主机需要以两个不同地址为同一别名在DNS中注册。
- 自动重新编号:重新编号机制应动态支持从提供商B切换到提供商C。
作用域地址
主机可能有两个接口(例如以太网接口和Wi-Fi接口),可以同时连接到两个不同的链路。当主机想向链路本地目标地址发送数据包时,它不知道是通过接口A还是接口B发送,因为两个链路的前缀相同;此外,由于每个链路本地地址在其链路中是唯一的,链路A中的主机可能与链路B中的另一主机拥有相同的链路本地地址。
在IPv6中,主机需要在目标IPv6地址中指定一个称为**作用域(scope)**的标识符,用于标识物理接口(例如
FE80::0237:00FF:FE02:A7FD%19
)。作用域值由操作系统根据其内部标准选择。
标准IPv6头部
标准IPv6头部具有以下固定大小(40字节)的格式:
4 12 16 24 32 版本(6) 优先级 流标签 有效负载长度 下一头部 跳数限制 源地址 目标地址
关键字段
- 版本字段(4位):通常不使用,因为数据包的区分由第2层完成 → 支持双栈模式。
- 优先级字段(8位):等同于IPv4的“服务类型”字段,用于区分不同服务。
- 流标签字段(20位):用于区分不同的流,以支持服务质量(QoS)。
- 下一头部字段(8位):指向数据包的有效负载,即上层协议(如TCP/UDP)或扩展头部链中的第一个扩展头部。
- 跳数限制字段(8位):等同于IPv4的“生存时间(TTL)”字段。
- 源地址字段(128位):包含数据包的发送方IPv6源地址。
- 目标地址字段(128位):包含数据包的接收方IPv6目标地址。
移除的IPv4字段
- 校验和字段:错误保护由第2层(帧校验序列)完成。
- 分片字段:分片功能被移至“分片”扩展头部。
- 头部长度字段:IPv6头部固定大小,其他功能通过扩展头部可选提供。
扩展头部
IPv6包含六种扩展头部,仅在需要时添加,并按以下顺序处理:
- 逐跳选项头部(Hop by hop option):包含每一跳都需要处理的可选信息。
- 路由头部(Routing):启用源路由,允许发送方决定数据包的路径。
- 分片头部(Fragment):管理数据包分片。
- 认证头部(Authentication Header,AH):用于验证发送方身份。
- 封装安全负载头部(Encapsulating Security Payload,ESP):用于加密数据包内容。
- 目标选项头部(Destination option):包含仅由目标节点处理的可选信息。
路由器始终仅处理到“路由”扩展头部为止的部分。
所有扩展头部都有相同的通用格式(长度必须是64位的倍数):
8 16 32 Next Header Header Length Extension data :::
- Next Header字段:指定链中下一个扩展头部,或如果这是最后一个扩展头部,则为上层头部(如TCP/UDP)。
- Header Length字段:指定当前扩展头部的长度。
新扩展头部可能会随着时间标准化,旧设备可能无法处理这些新头部,但可以通过“Header Length”字段跳过未知扩展头部。某些扩展头部(如“分片”扩展头部)具有固定长度,不包含“Header Length”字段。
逐跳选项与目标选项
逐跳选项头部和目标选项头部可以包含多个附加选项:
- 逐跳选项:包含每个路由器必须处理的选项。
- 目标选项:包含仅由目标处理的选项。
例如,包含两个8位长值的扩展头部格式如下:
8 16 24 32 Next Header Header Length Type1 Length Value1 Type2 Length2 Value2
每个选项包含以下字段:
- Length字段(8位):指定当前选项的长度,以便路由器在无法识别该选项时可跳过。
- Type字段(8位):标识当前选项:
- 前两位指定当选项无法识别时的执行操作:
00
:忽略当前选项并继续下一个选项。01
:丢弃数据包。10
:丢弃数据包并生成ICMPv6参数问题消息。11
:若目标地址为组播,则不生成ICMP消息,否则丢弃数据包并生成ICMP消息。
- 第三位指定选项是否可动态更改:
0
:选项不可更改。1
:选项可动态更改。
- 前两位指定当选项无法识别时的执行操作:
- Value字段(可变长度):包含选项的具体值。
路由头部
路由头部允许发送方指定数据包的路径(源路由),格式如下:
8 16 24 32 Next Header Header Length Routing Type Segment Left (reserved) Router Address 1 ... Router Address N
字段说明:
- Routing Type字段(8位):指定路由类型(目前“0”表示传统源路由)。
- Segment Left字段(8位):指定到目标的剩余跳数。
- Router Address字段(128位每个):列出数据包需要经过的路由器的IPv6地址。
示例:
源S发送到目标D的数据包包含路由头部,强制数据包依次经过路由器R1和R2。初始时数据包的目标地址为R1,但实际目标地址D在路由头部中指定。当数据包到达R1时,R1识别该包的目标地址为自身,但发现路由头部中的目标是另一节点。R1根据路由头部将下一跳地址替换为R2并转发,直到D接收到“Segment Left”为0的数据包,表示包已到达最终目标。目标D通过路由头部记录的路径列表反向发送回复数据包。
分片头部
分片头部用于将数据包分为较小的片段,格式如下:
8 16 29 31 32 Next Header (reserved) Fragment Offset (reserved) M Identification
字段说明:
- Fragment Offset字段(13位):指定片段在原始数据包中的起始字节编号。
- 更多片段标志(M,1位):如果为0,表示当前数据包是最后一个片段。
- 标识字段(Identification,32位):所有片段共享相同的标识符。
每个数据包分为两部分:
- 不可分片部分:包括IPv6头部及“分片”头部之前的所有扩展头部,在所有片段中重复。
- 可分片部分:包括“分片”头部之后的扩展头部和数据包负载。
示例:
与IPv4不同,IPv6仅允许发送方分片,路由器不支持分片。为了提高性能,IPv6建议使用路径MTU发现代替分片。
IPsec扩展
IPv6中的IPsec是集成的协议套件,包括两种头部:
- 认证头部(AH):验证数据包完整性,但不包含传输过程中改变的字段(如“Hop Limit”字段)。
- 封装安全负载头部(ESP):验证并加密数据包负载,保护数据隐私。
安全关联(SA)
IPsec不定义具体的加密和认证算法,通信双方需协商使用的算法 → 灵活性:可根据需求选择算法。
SA是双方就密钥和算法达成的协议,由安全参数索引(SPI)标识,SPI包含于AH和ESP头部中。SA是单向逻辑通道,双向通信需要两条SA。密钥交换(IKE协议)
用于安全协商密钥的主要策略:
- 静态配置:手动配置密钥,无需协商。
- Diffie-Hellman方法:无需传输密钥即可协商。
- 互联网密钥交换(IKE)协议:使用数字证书和非对称加密以安全方式传递密钥。
IKE协议通过以下过程建立安全关联:
- 使用证书验证通信双方身份;
- 使用非对称加密交换密钥;
- 定期通过ISAKMP协议重新协商密钥,以防止第三方通过暴力破解或统计分析获取密钥。
IPsec
IPv6 的 IPsec 协议套件从 IPv4 的 IPsec 套件中移植而来。在 IPv6 中,IPsec 是一个集成协议套件,定义了以下两种头部:
- 认证头部(Authentication Header, AH):验证整个数据包的完整性,但不包括传输过程中发生变化的字段(例如“跳数限制”字段),以保证数据包内容未被篡改。
- 封装安全负载头部(Encapsulating Security Payload, ESP):对数据包的有效负载进行验证和加密,以保护数据隐私。
安全关联(SA)
IPsec 并未定义用于加密和认证的具体算法,通信双方需要协商要使用的算法以交换受 IPsec 保护的信息 → 灵活性:算法根据需求选择。
安全关联(SA) 是双方之间关于 ESP 和 AH 所使用的私钥和算法的协议集合。
- 标识:每个 SA 由一个安全参数索引(SPI)标识,SPI 包含在 AH 和 ESP 头部中。
- 单向逻辑通道:通信双方 A 和 B 必须分别为从 A 到 B 和从 B 到 A 的消息建立单独的 SA。通常每个 TCP 端口会有一个单独的 SA。
互联网密钥交换(IKE)协议
为了安全协商密钥,避免第三方获取,有以下三种主要策略:
- 静态配置:手动在双方配置密钥,无需协商。
- Diffie-Hellman 方法:无需传输密钥即可协商密钥,第三方无法通过监听获取密钥。
- IKE 协议:利用数字证书和非对称加密,以安全方式传递密钥。
IKE 协议过程:
- IKE 协议要求双方为从 A 到 B 和从 B 到 A 的子 SA 协商密钥。
- 从 A 到 B 的 IKE SA 的建立过程:
- B 向 A 请求用于子 SA 的密钥;
- A 向可信的认证机构请求 B 的数字证书以验证其身份;
- 认证机构将 B 的数字证书返回给 A,该证书由认证机构的私钥加密,并包含 B 的签名(B 与其公钥的关联);
- A 使用认证机构的公钥解密证书,并获取与 B 关联的公钥;
- A 将子 SA 的密钥发送给 B,使用 B 的公钥加密,确保仅 B 能解密;
- B 接收消息,用其私钥解密并获取密钥;
- 子 SA 通过协商的密钥从 A 到 B 建立。
ISAKMP:
为了防止第三方通过暴力破解或统计分析获取密钥,互联网安全关联密钥管理协议(ISAKMP) 是 IKE 的一个子协议,用于定期安全地重新协商密钥。
认证头部(AH)
认证头部为 IP 数据包提供无连接完整性和数据源身份验证,确保数据包内容未被篡改。
限制:AH 还会验证地址和端口,因此在 NAT 环境中会遇到问题。- 核心概念:任何人都可以读取数据包内容,但无法更改内容。
认证头部格式:
8 16 32 Next Header Payload Length (reserved) SPI Sequence Number Authentication Data :::
字段说明:
- Next Header 字段(8 位):指定下一个封装的协议。
- Payload Length 字段(8 位):指定认证头部的长度(以 32 位字为单位,减去 2);可清零。
- 安全参数索引(SPI,32 位):标识数据包对应的安全关联(如果清零,表示无安全关联;1 到 255 的值为保留值)。
- 序列号字段(Sequence Number,32 位):包含递增的计数值。
- 消息摘要字段(可变长度):通过使用私钥计算数据包内容的摘要。如果有人想更改数据包内容,必须知道该私钥才能重新计算消息摘要。
特点:消息摘要类似于错误检测字段,确保数据包内容的完整性和来源的真实性。
封装安全负载(ESP)
ESP头部为IP数据包提供来源真实性、完整性和机密性保护:通过验证和加密数据包的有效负载来保护数据隐私。
尽管ESP可以进行认证,但其功能不同于AH:ESP并不认证整个IPv6数据包。
核心概念:任何人都无法读取数据包内容,因此也无法篡改内容。
ESP头部始终是头部链中的最后一个,格式如下:
16 24 32 SPI Sequence Number Payload Data ::: Padding ::: Padding Length Next Header Authentication Data :::
字段说明:
- 安全参数索引(SPI,32位):标识数据包对应的安全关联(SA)。
- 序列号字段(Sequence Number,无符号32位):包含递增的计数值,即使接收方未启用反重放服务,此字段对发送方也是必需的。
- 有效负载数据字段(Payload Data,可变长度):包含由
Next Header
字段描述的数据。 - 填充字段(Padding,可变长度0到255位):用于确保加密数据以4字节对齐。
- 填充长度字段(Padding Length,8位):指定填充字段的大小(以字节为单位)。
- 下一个头部字段(Next Header,8位):描述
Payload Data
字段格式的协议号(IPv4/IPv6)。 - 认证数据字段(Authentication Data,可变长度):包含完整性校验值(ICV),用于验证ESP包的内容(不包括
Authentication Data
字段本身)。
认证算法的规范决定了
Authentication Data
字段的长度,以及用于验证的比较规则和处理步骤。注意:Authentication Data
字段未加密。ESP支持两种使用模式,可选择与AH结合使用:
- 传输模式(Transport Mode):ESP不加密IPv6头部 → 中间节点可以看到IPv6头部中的源和目标地址。
IPv6 Header 其他扩展头部 ESP头部(加密部分) TCP/UDP头部 有效负载 ESP认证 加密数据 认证数据
- 隧道模式(Tunnel Mode):IPv6数据包被封装到另一个包含ESP的IPv6数据包中 → 原始数据包的IPv6头部(包括源和目标地址)被加密,外界无法看到。
IPv6 Header ESP头部(加密部分) IPv6 Header 其他扩展头部 TCP/UDP头部 有效负载 ESP认证 加密数据 认证数据
ICMPv6
**互联网控制消息协议版本6(ICMPv6)**是IPv6标准的组成部分,集成了ARP和IGMP协议的功能并进行了扩展。
所有ICMPv6消息都位于数据包的扩展头部之后,具有以下通用格式:
8 16 32 Type Code Checksum Message Body :::
字段说明:
- Type字段:标识ICMPv6消息类型。
ICMPv6消息类型示例:
- 诊断消息(类似ICMPv4,用于报告网络错误或问题):
1
:目标不可达(Destination Unreachable)2
:数据包过大(Packet Too Big)3
:超时(Time Exceeded)4
:参数问题(Parameter Problem)
- Ping命令使用的消息:
128
:回显请求(Echo Request)129
:回显回复(Echo Reply)
- **组播监听器发现(Multicast Listener Discovery,扩展IGMP功能):
130
:组播监听器查询(Multicast Listener Query)131
:组播监听器报告(Multicast Listener Report)132
:组播监听器完成(Multicast Listener Done)
- **邻居发现(Neighbor Discovery,扩展ARP功能):
133
:路由器请求(Router Solicitation)134
:路由器通告(Router Advertisement)135
:邻居请求(Neighbor Solicitation)136
:邻居通告(Neighbor Advertisement)137
:重定向(Redirect)
数据包过大(Packet Too Big)
当路由器接收到一个过大的数据包时,它会执行一种称为**路径MTU发现(Path MTU Discovery)**的技术。路由器会丢弃该数据包,并返回一个ICMPv6消息,类型为“Packet Too Big”(数据包过大),通知发送方允许的最大传输单元(MTU)大小。发送方据此调整数据包大小,使其不超过路由器指定的MTU。这种技术的目标是尽量避免数据包分片。
组播监听器发现(Multicast Listener Discovery)
组播监听器发现是ICMPv6的一个组件,扩展了IPv4 IGMP协议的功能,用于管理组播组的成员关系:
- 组播监听器查询(Multicast Listener Query):
- 常规查询(General Query):路由器询问主机是否有兴趣加入某些组播组。
- 特定组播地址查询(Multicast Address Specific Query):路由器询问主机是否有兴趣加入特定组播组。
- 组播监听器报告(Multicast Listener Report):主机通知路由器,它希望加入一个特定组播组,以接收发送到该组播地址的所有组播数据包。
- 组播监听器完成(Multicast Listener Done):主机通知路由器,它希望停止接收来自特定组播组的组播数据包。
邻居发现(Neighbor Discovery)
邻居发现是ICMPv6的一个组件,扩展了IPv4 ARP协议的功能,包括以下功能:
- 邻居请求(Neighbor Solicitation):主机发送一个多播数据包,目标IPv6地址为目标设备的请求节点组播地址,以获取其MAC地址。
- 邻居通告(Neighbor Advertisement):拥有指定IPv6地址的主机返回其MAC地址。
- 路由器请求(Router Solicitation):主机发送一个多播数据包,请求路由器返回包含网络信息(如链路前缀、自配置/DHCP标志、默认网关等)的“路由器通告”消息。
- 路由器通告(Router Advertisement):路由器广播其存在信息,包括链路相关的前缀及主机是否应自配置或查询DHCP服务器的标志。
这些ICMPv6消息支持主机的IPv6地址自动配置过程。
链路本地地址自动配置
链路本地地址的自动配置依赖于“邻居请求”和“邻居通告”ICMPv6消息:
- 主机生成候选链路本地地址:
- 前缀:始终为
FE80::
。 - 接口标识符:基于MAC地址(EUI-64格式)或随机生成(增强隐私)。
- 前缀:始终为
- 主机通过多播发送“邻居请求”消息,目标为候选地址对应的请求节点组播地址,询问是否有其他主机已经占用了该地址(重复地址检测)。
- 如果链路中已存在该地址的主机,会返回“邻居通告”消息,主机需随机生成另一个候选地址并重新检测。
- 如果无人回复,该地址在链路中唯一,主机即可通过链路本地地址与其他主机通信,但尚无法访问互联网,因为仍需获取一个全局地址。
全局地址自动配置
全局地址的自动配置依赖以下ICMPv6消息:“路由器请求”、“路由器通告”、“邻居请求”和“邻居通告”:
- 主机通过多播发送“路由器请求”消息,路由器返回“路由器通告”消息,包含以下标志:
- M标志(托管地址配置):
M = 1
:主机需联系DHCP服务器获取链路前缀及其他网络配置参数(如DNS地址),忽略路由器通告消息(有状态配置)。M = 0
:主机需查看O
标志:- O = 1:主机可从路由器通告中获取链路前缀,但需联系DHCP服务器获取其他网络配置参数。
- O = 0:主机可从路由器通告中获取链路前缀,无需其他网络配置信息(无状态配置)。
- M标志(托管地址配置):
- 主机生成候选全局地址:
- 前缀:从路由器通告消息或DHCP服务器中获取。
- 接口标识符:基于MAC地址(EUI-64格式)或随机生成(增强隐私)。
- 主机通过多播发送“邻居请求”消息,检查候选地址是否被占用。
- 如果地址未被占用,主机即完成全局地址配置,可通过全局地址访问互联网。
其他实现方式
微软曾提出一种主机无需知道DNS服务器地址即可联系的实现方案:主机发送数据包到固定的任播地址,网络负责将其转发到DNS服务器。然而,该方案实际应用较少,原因包括:
- 对任播地址管理的实现较少;
- GNU/Linux系统不支持该方案。
由于自动配置依赖于MAC地址,若网络卡损坏且需更换,主机地址需更改,而缓存(如DNS缓存)无法立即更新。因此,静态配置仍然适用于需要固定地址的设备(如公共服务器),以确保持续可访问性。