Skip to content

IPv6 基础

2026 大纲 四(四)1 IPv6 的主要特点四(四)2 IPv6 地址,两条都在本篇。IPv4 首部的原始设计在《IPv4 数据报格式》,本篇只讲"砍掉了哪些、为什么砍"。

一、为什么 CIDR 和 NAT 都不算解决

前面两篇分别讲了 CIDRNAT,它们看上去都在缓解地址不够用的问题。但把账算清就会发现:这两样改变的只是分配效率,地址总数一个也没多。 CIDR 让分配的颗粒度变细、少浪费;NAT 让一群机器共用一个公网地址。232 这个天花板一寸没抬。

真正把天花板抬起来的是把地址从 32 位增大到 128 位

这里有一处几乎人人第一次都会说错:地址空间扩大的是 296 倍,不是 4 倍。 4 倍说的是地址长度(位数从 32 变成 128),而数量是 2128/232=296。教材用了一个具体的比喻来描述这个量级——如果整个地球表面(包括陆地和水面)都覆盖着计算机,IPv6 允许每平方米拥有 7×1023 个地址;若以每微秒分配 100 万个的速率去分,需要 1019 年才能分完。

二、IPv6 引进的八条主要变化

这一节直接对应大纲的"IPv6 的主要特点",八条要能说全:

#变化具体是什么
1更大的地址空间从 32 位增大到 128 位
2扩展的地址层次结构空间够大,可划分出更多层次
3灵活的首部格式定义了许多可选的扩展首部,路由器对扩展首部不做处理(逐跳扩展首部除外)
4改进的选项选项放在有效载荷中而不是首部里,可以包含新选项
5允许协议继续扩充IPv4 的功能固定不变,IPv6 留了余地
6支持即插即用(自动配置)因此 IPv6 不需要使用 DHCP
7支持资源的预分配靠流标号字段,服务于要求保证带宽与时延的实时应用
8首部改为 8 字节对齐IPv4 首部是 4 字节对齐

第 6 条要按住一个边界:"不需要 DHCP"不等于"不能用 DHCPv6"。 它的实现基础是节点启用 IPv6 时就自动生成本地链路地址(此时甚至还没连上网络),这是即插即用的来源;而实际网络里 DHCPv6 仍在用,负责下发 DNS 等信息。

数据报的组成也顺带在这里说清:基本首部固定 40 字节 + 有效载荷(≤65535 字节)。⚠️ 扩展首部不属于基本首部,它算在有效载荷里——所以总长度 = 40 + 有效载荷长度。

三、基本首部:砍掉了什么,为什么

基本首部只有八个字段:版本 4 位、通信量类 8 位、流标签 20 位、有效载荷长度 16 位、下一个首部 8 位、跳数限制 8 位、源地址与目的地址各 128 位。

对照 IPv4 的 12 个字段,被砍掉的是七项,每一项都有明确理由。首部长度没有了,因为首部固定 40 字节、长度无须再表示。服务类型没有了,功能由通信量类 + 流标号两个字段接管。总长度改成了有效载荷长度(不含基本首部)。标识、标志、片偏移三个分片字段挪进了分片扩展首部协议字段改叫下一个首部选项改用扩展首部实现。

只剩最后一个——检验和被彻底取消,这一项最值得单独讲。

改名的还有一处:TTL → 跳数限制,作用完全相同,只是 IPv6 把名字也改对了。

"下一个首部"字段有两种含义,取决于有没有扩展首部:没有扩展首部时它等同于 IPv4 的协议字段(6 = TCP,17 = UDP);有扩展首部时它标识的是第一个扩展首部的类型。

首部长了一倍,为什么反而更快

IPv6 的基本首部 40 字节,比 IPv4 的 20 字节长了一倍,可它的处理却更快。因为"简化"指的是每跳的处理复杂度,不是字节数。

具体省掉了三件事:长度固定,不必判断有没有选项、首部到哪里结束;选项挪进扩展首部,路由器不必逐个检查选项是否与自己有关(IPv4 里这一步是每台路由器都要做的);没有检验和,不必重算。

取消检验和之后谁来兜底链路层对检测出有差错的帧直接丢弃;运输层用 UDP 时丢弃有差错的用户数据报、用 TCP 时重传直到正确送达。下层丢、上层重传,网络层再算一遍纯属重复;而这份重复在 IPv4 里特别贵——TTL 每跳都变,检验和每跳都得重算"每跳付出的成本 × 完全重复的收益",取消是必然的。

顺带还取消了一样东西:子网掩码。理由是 /n 这种前缀写法已经够用,而写一个 128 位的掩码实在太长。前缀仍然写作 /n

四、扩展首部

所有扩展首部的第一个字段都是 8 位的"下一个首部",靠它把「基本首部 → 扩展首部 1 → 扩展首部 2 → TCP/UDP 首部 → 数据」串成一条链。

六种扩展首部同时使用时应按此顺序出现,高层首部总是放在最后:逐跳选项 → 路由选择 → 分片 → 鉴别 → 封装安全有效载荷 → 目的站选项。

其中"分片"那一项对应一条重要变化:IPv6 不允许路由器分片。数据报太大时路由器返回 ICMPv6"分组太大"报文,让源主机自己减小长度——分片只在源主机进行,靠的就是分片扩展首部。这与 IPv4 "路径上任何一台路由器都可以分片"完全相反,也正是 IP 分片那篇里"路径 MTU 探测"从可选优化变成唯一机制的原因。

五、地址表示

128 位按 16 位一组分成 8 组,每组 4 位十六进制,组间用冒号分隔:2001:0db8:85a3:0000:0000:8a2e:0370:7334

规则一:省略每组的前导零0db8db8)。注意只能省前导零——把 CD30 写成 CD3 表示的是 0CD3,是完全不同的值。

规则二:零压缩——一连串连续的全零组可以用一对冒号取代:FF05:0:0:0:0:0:0:B3FF05::B3

零压缩为什么只能用一次,不是"规定如此",而是用两次就真的还原不出来:: 本身不携带"代表几组零"的信息,还原全靠"8 减去已写出的组数"。反例 2001::25de::cade 显式 3 组、要补 5 组零,这 5 组按 1+4、2+3、3+2、4+1 分配到两个 :: 上都符合写法,四种地址无从分辨,所以写法非法。

判断任何缩写是否合法,都用这一套"数组数 + 减法 + 看还原是否唯一"。 顺带纠一个常见误解:"原地址里有两段连续零"并不影响合法性——只压其中一段完全允许,压不完不是错。

冒号十六进制还可带点分十进制后缀:0:0:0:0:0:0:128.10.2.1::128.10.2.1。⚠️ 冒号分隔的每个值是 2 字节,点分十进制每部分是 1 字节,别混着数。

地址缩写的合法性判定与两道成套算例:压缩还原、求子网前缀(想把"数组数 + 减法"这套判法亲手用一遍时展开)

(一)压缩与还原。

2001:0DA8:0000:0000:0207:0000:0000:1234 尽量压缩:先做规则一去掉前导零,得 2001 : da8 : 0 : 0 : 207 : 0 : 0 : 1234;再找连续全零组的游程——这里有两处,各含 2 组(第 3~4 组、第 6~7 组)。只能选一处压缩,两处长度相同时压最左边那处:

2001:da8::207:0:0:1234

验算能否唯一还原:显式写出 2001da8207001234 共 6 组 → :: 必须代表 86=2 组零 → 唯一还原回原地址 ✓。这正是"有两段连续零、只压了一段"的合法情形。

FE80::2AA:FF:FE9A:4CA2 还原:显式 5 组 → :: 代表 85=3 组零 → 补零并补齐前导零:

FE80:0000:0000:0000:02AA:00FF:FE9A:4CA2

(二)合法性判定成套对照。 以 60 位前缀 12AB00000000CD3(十六进制 15 个字符)为例,合法写法有:

12AB:0000:0000:CD30:0000:0000:0000:0000/60
12AB::CD30:0:0:0:0/60
12AB:0:0:CD30::/60

而下面这些是非法或表示了别的地址:

写法问题
12AB:0:0:CD3/60非法:不能把 16 位组 CD30 末尾的 0 省掉(只能省前导零);而且只有 4 组,不足 8 组又没有 ::
12AB::CD30/60合法但不是这个地址:它表示 12AB:0:0:0:0:0:0:CD30
12AB::CD3/60合法但不是这个地址:它表示 12AB:0:0:0:0:0:0:0CD3
2001::25de::cade非法:用了两次 ::,还原不唯一
2001:0:0:1::1合法:: 只用一次,显式 5 组代表 3 组零,唯一还原为 2001:0000:0000:0001:0000:0000:0000:0001

两条规则各判各的:"省了组内末尾的零"是规则一的违例,"用了两次 ::"才是零压缩的违例。

(三)求子网前缀。 某接口地址 2001:0db8:00a1:2c30:0250:56ff:fe8a:1b7c/58

第 1 步:算 58 位落在第几组。 每组 16 位,58=3×16+10 → 前 3 组整组保留;第 4 组只保留高 10 位,其余 6 位置 0;第 5~8 组整组置 0。

第 2 步:处理第 4 组(唯一需要展开二进制的一组):

0x2c30=0010 1100 00保留的高 10 位 11 0000置 0 的低 6 位0010 1100 0000 0000=0x2c00

第 3 步:拼出并压缩。

2001:0db8:00a1:2c00:0000:0000:0000:0000/582001:db8:a1:2c00::/58

第 4 步:验算。 子网前缀必须满足"低 12858=70 位全为 0":第 4 组低 6 位 + 第 5~8 组共 64 位 = 70 位 ✓。

关键在第 2 步。若前缀长度恰好是 16 的倍数(如 /48、/64),这一步会"隐身",直接按组截断就对;一旦不是 16 的倍数,就必须把那一组展开成二进制。和 IPv4 里"只有跨字节的那个字节要动二进制"是同一套思路。

六、地址类型与常用地址

IPv6 有三种地址类型:单播多播任播。任播是新增的——终点是一组计算机,但只交付其中最近的一个

IPv6 没有广播,广播被看作多播的一个特例。还有一条措辞要准:地址是指派给接口的,不是指派给节点的

地址类型CIDR 记法占比与要点
未指明地址::/128仅此一个。全 0,不能用作目的地址,只能被"还没配置到标准 IP 地址的主机"当源地址,类比 IPv4 的 0.0.0.0
环回地址::1/128仅此一个。作用同 IPv4 的 127.0.0.1
多播地址FF00::/81/256
本地站点单播地址FEC0::/101/1024。给"用 TCP/IP 但没连到互联网"的内部网络用,用途同 IPv4 的专用地址
本地链路单播地址FE80::/101/1024。节点启用 IPv6 时自动生成,只在单一链路上使用、不会被转发出去
全球单播地址用得最多的一类。划分灵活:128 位整块、"子网前缀 + 接口标识符"两级、"全球路由前缀 + 子网标识符 + 接口标识符"三级都行。接口标识符相当于主机号

七、从 IPv4 向 IPv6 过渡

过渡只能逐步演进向后兼容:IPv6 系统必须能接收、转发 IPv4 分组并为其选择路由。

双协议栈:一部分主机或路由器同时装两套协议栈、同时具有两种地址,靠 DNS 查询决定用哪种。代价是每个节点都要装维护两套协议,开销太大。

隧道:IPv6 数据报进入 IPv4 网络时,把它整个封装成 IPv4 数据报的数据部分;离开时再取出来交给 IPv6 协议栈。

三条关键:隧道两端必须是双栈路由器隧道中 IPv4 数据报的源地址是隧道入口、目的地址是隧道出口,与原 IPv6 数据报的源/目的地址无关;原来的 IPv6 数据报穿越过程中什么都没变

这套"整个封装进另一个数据报"的手法在网络层出现过不止一次:VPN 的加密隧道、移动 IP 里归属代理转发到转交地址,用的都是同一套 IP-in-IP 思路。认出这个共同结构,三处就变成一处。

双方各只支持一种版本时还需要翻译(思路类似 NAT,代表方案 NAT64/DNS64)。

本节小结

  1. 扩容:32 位 → 128 位,数量扩大 296 倍。八条主要变化要能说全,其中"即插即用、不需要 DHCP"的实现基础是 FE80::/10 能自动生成。
  2. 简化:首部固定 40 字节、字段从 12 减到 8。"更长却更快"指每跳处理复杂度下降——长度固定、不必逐个检查选项、不必重算检验和;敢砍检验和是因为下层丢差错帧、上层重传差错报文段。
  3. 表示与过渡:只能省前导零;零压缩只能用一次,因为 :: 不携带"代表几组零"的信息。地址类型是单播 / 多播 / 任播,没有广播,地址给接口不给节点。过渡靠双栈与隧道(IP-in-IP,两端双栈,隧道中源/目的是隧道两端)。

考点速记

IPv6 在真题里被考过的形式只有一种:四个陈述里挑对的,而且四条正好覆盖本篇四个不同的角落。

IPv6 与 IPv4 的叙述哪几条正确(cn-2023-40)。答 D:仅 Ⅲ、Ⅳ。逐条判:

Ⅰ「IPv6 地址空间是 IPv4 地址空间的 96 倍」——错。 应该是 296 倍。这一条就是本篇开头那个"人人第一次都说错"的点,出题人显然知道它容易错在哪:把 96 这个指数直接当成了倍数。顺带一提,写成"4 倍"同样错——4 倍说的是位数(32 → 128),不是数量。

Ⅱ「IPv4 和 IPv6 的基本首部的长度均可变」——错。 IPv4 首部确实可变(20~60 字节,靠首部长度字段表示),但 IPv6 基本首部固定 40 字节。"均"字是这一条的开关——只要有一方不成立,整条就错。

Ⅲ「IPv4 向 IPv6 过渡可以采用双协议栈和隧道技术」——对。 第七节两种方法。

Ⅳ「IPv6 首部的 Hop-Limit 等价于 IPv4 首部的 TTL 字段」——对。 这正是第三节说的那处改名:作用完全相同,IPv6 只是把名字改得更准确了(TTL 早已不是"秒"而是"跳")。

这道题的答题路径值得记:四条里有两条是"数量级/长度"类的陷阱(Ⅰ、Ⅱ),两条是"机制对应关系"类的常识(Ⅲ、Ⅳ)。 前两条只要把 296 和"固定 40 字节"记准就能直接排掉,剩下的自然成立。

本篇的其余内容——地址的零压缩规则、扩展首部的顺序、任播、隧道两端的地址——在真题里不单独成题,但它们支撑着 Ⅲ、Ⅳ 这类判断:知道隧道里 IPv4 数据报的源/目的是隧道两端,才敢确认"隧道技术"确实是一种可行的过渡手段;知道 IPv6 取消了检验和、不允许路由器分片,才明白"首部长了一倍反而更快"不是个悖论。

易错地址空间扩大 296 倍,不是 96 倍,也不是 4 倍。 4 倍说的是位数。

易错IPv6 基本首部固定 40 字节,IPv4 首部才是可变的。

易错扩展首部不算在基本首部里,它算在有效载荷中。 有效载荷长度字段不含那 40 字节。

易错只能省前导零。 CD30 写成 CD3 是另一个地址 0CD3

易错零压缩只能用一次,因为 :: 不携带"代表几组零"的信息,用两次就还原不唯一。但"原地址里有两段连续零"不影响合法性,只压一段是允许的。

易错IPv6 取消了首部检验和,也取消了子网掩码,但前缀仍写 /n

易错IPv6 没有广播,广播被看作多播的特例;地址指派给接口,不是节点。

易错IPv6 不允许路由器分片,分片只在源主机进行。

易错隧道中 IPv4 数据报的源/目的地址是隧道两端,与被封装的 IPv6 数据报的源/目的无关。

教材出处
  • 谢希仁《计算机网络》(第 8 版):IPv6 引进的主要变化(本篇第二节那八条),见印刷版 p150(4.5.1 IPv6 的基本首部)——原文逐条列出"(1) 更大的地址空间……把地址从 IPv4 的 32 位增大到 4 倍,即增大到 128 位,使地址空间增大了 296 倍";"(6) 支持即插即用(即自动配置)。因此 IPv6 不需要使用 DHCP";"(8) IPv6 首部改为 8 字节对齐(即首部长度必须是 8 字节的整数倍)。原来的 IPv4 首部是 4 字节对齐"。同页还说明"IPv6 数据报由两大部分组成,即基本首部和后面的有效载荷……有效载荷允许有零个或多个扩展首部……但请注意,所有的扩展首部并不属于 IPv6 数据报的基本首部",以及术语上"将协议数据单元 PDU 称为分组,而不是 IPv4 的数据报"。
  • 同书 p150–p151相对 IPv4 砍掉了哪些字段,逐条给出理由——"取消了首部长度字段,因为它的首部长度是固定的(40 字节)……取消了检验和字段,这样就加快了路由器处理数据报的速度。我们知道,在数据链路层对检测出有差错的帧就丢弃。在运输层,当使用 UDP 时,若检测出有差错的用户数据报就丢弃。当使用 TCP 时,对检测出有差错的报文段就重传,直到正确传送到目的进程为止。因此在网络层的差错检测可以精简掉";并结论"由于把首部中不必要的功能取消了,使得 IPv6 首部的字段数减少到只有 8 个(虽然首部长度增大了一倍)"。同页给出各字段定义,其中有效载荷长度"指明 IPv6 数据报除基本首部以外的字节数(所有扩展首部都算在有效载荷之内)"。
  • 同书 p152:扩展首部的六种类型与顺序(逐跳选项、路由选择、分片、鉴别、封装安全有效载荷、目的站选项),"当使用多个扩展首部时,应按以上的顺序出现。高层首部总是放在最后";以及为什么扩展首部让转发更快——"IPv4 的数据报若在其首部中使用了选项,则在数据报转发路径中的每一个路由器,都必须检查首部中的所有选项,看是否与本路由器有关。这必然要花费相当的时间。IPv6 把原来 IPv4 首部中选项的功能都放在扩展首部中……这就使得路由器能够迅速判断待转发的 IPv6 数据报有无需要本路由器处理的选项"。同页给出三种地址类型(单播、多播、任播),并说明"IPv6 没有采用广播的术语,而是将广播看作多播的一个特例",以及"IPv6 给节点的每一个接口(请注意,不是给某个节点)指派一个 IPv6 地址"。
  • 同书 p152–p153:地址空间的量级——"如果整个地球表面(包括陆地和水面)都覆盖着计算机,那么 IPv6 允许每平方米拥有 7×1023 个 IP 地址。如果地址分配速率是每微秒分配 100 万个地址,则需要 1019 年的时间才能将所有可能的地址分配完毕"。
  • 同书 p153零压缩只能用一次的理由——"冒号十六进制记法可以允许零压缩,即一连串连续的零可以为一对冒号所取代……为了保证零压缩有一个不含糊的解释,规定在任一地址中只能使用一次零压缩";点分十进制后缀"在这种记法中,冒号所分隔的每个值是两个字节(16 位)的值,但点分十进制每个部分的值是一个字节(8 位)的值";以及 60 位前缀 12AB00000000CD3 的三种合法写法与三种非法/歧义写法(12AB:0:0:CD3/60 "不能把 16 位地址 CD30 块中的最后的 0 省略"、12AB::CD30/60 "这表示 12AB:0:0:0:0:0:0:CD30"、12AB::CD3/60 "这表示 12AB:0:0:0:0:0:0:0CD3")。同页末明确"但是,IPv6 取消了子网掩码"。
  • 同书 p154:表 4-7 IPv6 常用地址分类(未指明地址 ::/128、环回地址 ::1/128、多播地址 FF00::/8 占 1/256、本地站点单播地址 FEC0::/10、本地链路单播地址 FE80::/10,后两者各占 1/1024),以及"当一个节点启用 IPv6 时就自动生成本地链路地址(请注意,这个节点现在并没有连接在某个网络上)";同页给出全球单播地址的三种划分方法(图 4-34)。
  • 同书 p155(4.5.3 从 IPv4 向 IPv6 过渡):过渡必须"采用逐步演进的办法,同时,还必须使新安装的 IPv6 系统能够向后兼容。这就是说,IPv6 系统必须能够接收和转发 IPv4 分组,并且能够为 IPv4 分组选择路由";双协议栈"双协议栈的主机在和 IPv6 主机通信时采用 IPv6 地址,而和 IPv4 主机通信时则采用 IPv4 地址。但双协议栈主机怎样知道目的主机是采用哪一种地址呢?它是使用域名系统 DNS 来查询的","双协议栈需要付出的代价太大,因为要安装上两套协议";隧道技术"在 IPv6 数据报要进入 IPv4 网络时,把 IPv6 数据报封装成为 IPv4 数据报。现在整个的 IPv6 数据报变成了 IPv4 数据报的数据部分……请注意,在隧道中传送的数据报的源地址是 B 而目的地址是 E"。

相关知识

IPv4 数据报格式IP 编址NATIP 分片与重装

真题练习

相关真题(1题)