Appearance
IPv6 基础
2026 大纲 四(四)1 IPv6 的主要特点与 四(四)2 IPv6 地址,两条都在本篇。IPv4 首部的原始设计在《IPv4 数据报格式》,本篇只讲"砍掉了哪些、为什么砍"。
一、为什么 CIDR 和 NAT 都不算解决
前面两篇分别讲了 CIDR 和 NAT,它们看上去都在缓解地址不够用的问题。但把账算清就会发现:这两样改变的只是分配效率,地址总数一个也没多。 CIDR 让分配的颗粒度变细、少浪费;NAT 让一群机器共用一个公网地址。
真正把天花板抬起来的是把地址从 32 位增大到 128 位。
这里有一处几乎人人第一次都会说错:地址空间扩大的是
二、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。
规则一:省略每组的前导零(0db8 → db8)。注意只能省前导零——把 CD30 写成 CD3 表示的是 0CD3,是完全不同的值。
规则二:零压缩——一连串连续的全零组可以用一对冒号取代:FF05:0:0:0:0:0:0:B3 → FF05::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 共 6 组 → :: 必须代表
把 FE80::2AA:FF:FE9A:4CA2 还原:显式 5 组 → :: 代表
(二)合法性判定成套对照。 以 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 位,
第 2 步:处理第 4 组(唯一需要展开二进制的一组):
第 3 步:拼出并压缩。
第 4 步:验算。 子网前缀必须满足"低
关键在第 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::/8 | 1/256 |
| 本地站点单播地址 | FEC0::/10 | 1/1024。给"用 TCP/IP 但没连到互联网"的内部网络用,用途同 IPv4 的专用地址 |
| 本地链路单播地址 | FE80::/10 | 1/1024。节点启用 IPv6 时自动生成,只在单一链路上使用、不会被转发出去 |
| 全球单播地址 | — | 用得最多的一类。划分灵活:128 位整块、"子网前缀 + 接口标识符"两级、"全球路由前缀 + 子网标识符 + 接口标识符"三级都行。接口标识符相当于主机号 |
七、从 IPv4 向 IPv6 过渡
过渡只能逐步演进且向后兼容:IPv6 系统必须能接收、转发 IPv4 分组并为其选择路由。
双协议栈:一部分主机或路由器同时装两套协议栈、同时具有两种地址,靠 DNS 查询决定用哪种。代价是每个节点都要装维护两套协议,开销太大。
隧道:IPv6 数据报进入 IPv4 网络时,把它整个封装成 IPv4 数据报的数据部分;离开时再取出来交给 IPv6 协议栈。
三条关键:隧道两端必须是双栈路由器;隧道中 IPv4 数据报的源地址是隧道入口、目的地址是隧道出口,与原 IPv6 数据报的源/目的地址无关;原来的 IPv6 数据报穿越过程中什么都没变。
这套"整个封装进另一个数据报"的手法在网络层出现过不止一次:VPN 的加密隧道、移动 IP 里归属代理转发到转交地址,用的都是同一套 IP-in-IP 思路。认出这个共同结构,三处就变成一处。
双方各只支持一种版本时还需要翻译(思路类似 NAT,代表方案 NAT64/DNS64)。
本节小结
- 扩容:32 位 → 128 位,数量扩大
倍。八条主要变化要能说全,其中"即插即用、不需要 DHCP"的实现基础是 FE80::/10能自动生成。 - 简化:首部固定 40 字节、字段从 12 减到 8。"更长却更快"指每跳处理复杂度下降——长度固定、不必逐个检查选项、不必重算检验和;敢砍检验和是因为下层丢差错帧、上层重传差错报文段。
- 表示与过渡:只能省前导零;零压缩只能用一次,因为
::不携带"代表几组零"的信息。地址类型是单播 / 多播 / 任播,没有广播,地址给接口不给节点。过渡靠双栈与隧道(IP-in-IP,两端双栈,隧道中源/目的是隧道两端)。
考点速记
IPv6 在真题里被考过的形式只有一种:四个陈述里挑对的,而且四条正好覆盖本篇四个不同的角落。
IPv6 与 IPv4 的叙述哪几条正确(cn-2023-40)。答 D:仅 Ⅲ、Ⅳ。逐条判:
Ⅰ「IPv6 地址空间是 IPv4 地址空间的 96 倍」——错。 应该是
Ⅱ「IPv4 和 IPv6 的基本首部的长度均可变」——错。 IPv4 首部确实可变(20~60 字节,靠首部长度字段表示),但 IPv6 基本首部固定 40 字节。"均"字是这一条的开关——只要有一方不成立,整条就错。
Ⅲ「IPv4 向 IPv6 过渡可以采用双协议栈和隧道技术」——对。 第七节两种方法。
Ⅳ「IPv6 首部的 Hop-Limit 等价于 IPv4 首部的 TTL 字段」——对。 这正是第三节说的那处改名:作用完全相同,IPv6 只是把名字改得更准确了(TTL 早已不是"秒"而是"跳")。
这道题的答题路径值得记:四条里有两条是"数量级/长度"类的陷阱(Ⅰ、Ⅱ),两条是"机制对应关系"类的常识(Ⅲ、Ⅳ)。 前两条只要把
本篇的其余内容——地址的零压缩规则、扩展首部的顺序、任播、隧道两端的地址——在真题里不单独成题,但它们支撑着 Ⅲ、Ⅳ 这类判断:知道隧道里 IPv4 数据报的源/目的是隧道两端,才敢确认"隧道技术"确实是一种可行的过渡手段;知道 IPv6 取消了检验和、不允许路由器分片,才明白"首部长了一倍反而更快"不是个悖论。
易错:地址空间扩大
倍,不是 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 位,使地址空间增大了
倍";"(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 允许每平方米拥有
个 IP 地址。如果地址分配速率是每微秒分配 100 万个地址,则需要 年的时间才能将所有可能的地址分配完毕"。 - 同书 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"。