3. IPv6地址结构与地址类型
IPv6最直观的变化,是地址从IPv4的32位扩展到128位。这个数字不只是“更长”,它直接改变了地址的书写方式、分配逻辑和工程使用习惯。理解IPv6,第一步不是背类型名称,而是把128位地址拆成“网络前缀 + 接口标识”两段来看,再理解单播、组播、任播三种通信模型,最后落到全球单播、链路本地和唯一本地地址各自该在什么场景下使用。
128位地址的表示与压缩规则
128位地址写成十六进制共32个字符,按每4位一组、每组4个十六进制数字,分成8组,组间用冒号分隔。例如:
2001:0db8:0000:0000:0000:ff00:0042:8329
为便于书写,RFC 4291定义了两条压缩规则。第一,每组中前导的0可以省略,上面的地址可写成:
2001:db8:0:0:0:ff00:42:8329
第二,连续的一个或多个全0组,可以用双冒号“::”代替,但整个地址中“::”只能出现一次,否则无法还原出唯一的原始地址。于是上面的地址可进一步写成:
2001:db8::ff00:42:8329
这里“::”代表中间的3组全0,即0:0:0。工程中常见的错误是把两个不连续的全0段都写成“::”,例如2001:db8::1::1,这种写法非法,因为展开时无法判断每段“::”各代表几组0。判断一个压缩地址是否合法,最实用的方法是:数一数显式写出的组数,若少于8组,则必须存在且仅存在一个“::”,用它补齐到8组。
此外,IPv6地址常与接口一起书写,用方括号区分地址和端口,例如[2001:db8::1]:8080;在URL中则写作http://[2001:db8::1]/。这是实际配置和排障中必须养成的书写习惯。
前缀、接口标识与子网划分
一个IPv6地址在逻辑上分为两部分:前n位是网络前缀,后128−n位是接口标识(Interface ID,IID)。前缀用“地址/前缀长度”表示,例如2001:db8:acad:1::/64表示前64位为网络前缀,后64位为接口标识。IPv6单播地址的典型子网前缀长度就是/64,这意味一个子网可容纳264个接口标识,数量极其庞大,因此IPv6几乎不再需要为了节省地址而做复杂的可变长子网划分。
接口标识的生成方式主要有三种:手工配置、基于EUI-64扩展生成、以及隐私扩展随机生成。EUI-64的做法是把48位MAC地址从中间劈开,插入ff:fe,再把第一字节的第七位(U/L位)取反。例如MAC地址00:1a:2b:3c:4d:5e,插入后为00:1a:2b:ff:fe:3c:4d:5e,第一字节00的U/L位取反后变为02,最终接口标识为021a:2bff:fe3c:4d5e。这种方式便于从地址反推设备,但也暴露了硬件信息,因此现代终端更多使用隐私扩展,让接口标识随机化并定期变化。
需要特别说明的是,/64只是单播子网的常规约定,并不意味着所有IPv6地址都必须按/64切分。例如链路本地地址固定使用fe80::/10前缀,组播地址使用ff00::/8,这些是协议规定的特殊前缀,不参与常规子网规划。
单播、组播与任播
IPv6取消了广播,只保留三种通信模型。单播是一对一,地址标识唯一一个接口;组播是一对多,数据发送给加入同一组播组的所有接口;任播是一对最近,同一任播地址配置在多个接口上,数据被路由到其中“最近”的一个。这里的“最近”由路由协议度量决定,而不是地理距离。
组播在IPv6中承担了原本IPv4广播的职责,例如邻居请求、路由器通告都使用组播。常见组播地址有ff02::1(所有节点)、ff02::2(所有路由器)、ff02::1:ff00:0/104对应的被请求节点组播地址。任播则常用于DNS根服务器、CDN节点等场景,让用户访问到就近的服务实例。
三类常用单播地址的使用场景
全球单播地址(GUA)通常以2000::/3开头,相当于IPv4的公网地址,可在全球路由,用于互联网访问、对外提供服务。链路本地地址固定以fe80::/10开头,仅在本地链路有效,路由器不转发,常用于邻居发现、路由协议对等体、下一跳地址。唯一本地地址(ULA)以fc00::/7开头,实际常用fd00::/8,类似IPv4私有地址,用于内部网络,不进入全球路由表。
下面这张图把128位地址的字段划分、三类单播地址的前缀范围以及典型使用场景放在一起,便于对照记忆。
工程中的选择与判断
实际部署时,一个接口通常同时拥有链路本地地址和至少一个全球单播或唯一本地地址。链路本地地址是自动生成的,不需要手工配置,也不应被删除,因为邻居发现和路由协议依赖它。全球单播地址用于对外通信,唯一本地地址用于内部稳定通信。若企业内网需要不依赖运营商前缀的稳定地址,可规划fd00::/8下的ULA;若需要访问互联网,则必须使用运营商分配的GUA前缀。
判断一个地址属于哪一类,可以看前缀:2000::/3是GUA,fe80::/10是LLA,fc00::/7是ULA,ff00::/8是组播。在设备上可用ip -6 addr show或show ipv6 interface brief查看接口地址,确认每类地址是否按预期存在。若发现接口只有LLA而没有GUA,通常说明前缀未下发或SLAAC未生效;若GUA存在但无法访问外部,则应检查路由和前缀是否被正确通告。