IPv6 设计中的失误与错失的良机
IPv6 设计中的失误与错失的良机 - 第一部分
2025年2月15日,阅读时长约7分钟
本文不代表现在、过去或未来雇主的观点。文章中的观点仅代表我个人。
这是一系列关于我思考为什么 IPv6 失败的文章。之前的文章。计算机网络历史上大多数网络协议都失败了。《RFC5218》定义了一个成功的协议应该具备的要素。
我个人从 1998 年起就从事 IPv6 标准化和实现工作。浪费了 27 年时间。至少我可以声称一路走来学到了一些东西。不知道 ATM、X.25、IPX、DecNet、OSI、Apollo 等的发明者们有什么感受。:-) IPv6 至少与它们为伍。“失败”的定义有很多,我保留采取对抗立场的权利,并且我确实承认 IPv6 存在有效的用例。
在 IPv6 工作的早期,我们花费大量时间思考从流行的 IPv4 互联网到 IPv6 互联网的过渡。IPv6 经过精心设计,添加了最少的新功能,以确保轻松过渡。但仍然要有足够的吸引力来取代 IPv4。人们认为,更大的地址空间和重新启用的端到端透明网络将非常有价值,足以推动过渡。
在过去的 30 年里,不同的权衡可能不会产生影响。没有直接的技术缺陷阻止了 IPv6 的部署。尽管如果 IPv6 是一个更优秀的协议,并解决了 IPv4 无法解决的问题,它会更容易被接受。具有讽刺意味的是,现在情况恰恰相反。有些问题可以在 IPv4 中解决,但在 IPv6 中很难解决。至少在不诉诸 NAT 和 NAPT 等“IPv4 方法”的情况下是如此。本文将探讨这些问题。
网络中的政治
网络协议也是政治(请阅读 Laura DeNardis 的著作)。IPv6 的设计经过精心选择,具有一定的价值观。最初的提案“Simple Internet Protocol”最初于 1992 年撰写,后来以 RFC8507 的形式发布。其背后的基本价值观与最初的 IP 协议非常相似。它应该是端到端透明的,任何人都可以与任何人通信,状态应该保存在端点中,网络应该像打开灯泡一样简单(这是在无线网络出现之前)。IPv6 的设计采用了更简单的头部,旨在实现即插即用配置。有点像亚当和夏娃犯罪前的世界。:-)
并且要不惜一切代价避免任何形式的 NAT!
IPv6 设计失误
现在,欢迎来到 30 年的演变…… 以下列表并非严格按时间顺序排列:
- 分片和 MTU。 虽然 IPv6 在基本头部中没有像 IPv4 那样的分片字段,但它试图通过消除中间设备的分片来做出一些改进。IPv6 没有对 Path MTU discovery 做出任何改进。任何看起来不同的数据包(如未携带 L4 头部的数据包)都更有可能被丢弃。IPv6 设计者应该怎么做? 分片不应包含在网络层的 IPv6 中,而应推送到传输层。Path MTU discovery 也应该是传输层的一个组成部分。“Probe”和“response”数据包不得与其他流量区分开来。
- 128 位地址。 最初的提案是 64 位地址。使地址空间比 IPv4 地址空间大 2³² 倍显然已经足够了。拥有一个可以容纳在计算机中的原生类型中的地址,使其更容易使用。128 位是那些想要可变长度地址和那些想要固定长度地址的人之间的折衷方案。有点像 ATM 中 53 字节的单元大小。到目前为止,128 位地址空间主要导致了浪费(Google 提议给每个主机(或容器)2⁶⁴ 个地址)。或者用于语义寻址,其中地址位本身用于携带信息。例如,在 SRv6 中,地址位用于携带段标识符,在其他解决方案中,则用于 IPv4 地址和端口。笑话:通过可变长度地址与语义地址相结合,您可以将所有头部和有效负载都放在地址本身中。IPv6 设计者应该怎么做? 坚持使用 64 位地址。
- 扩展头部。 关于 IPv6 应该包含哪些“功能”有很多争论。最终的妥协是包含一个分片头部和一组用于源路由、用于目标选项和用于逐跳选项的通用容器头部。这些头部是链接的,您最多可以拥有 1280 字节的扩展头部。不幸的是,从 IPv4 中学到的东西很少,许多转发实现都以以下内容开头:
if (ip->ip_version_and_header_length != 0x45)
silently_drop();
IPv6 扩展头部经过明确设计,使其难以在硬件中解析。其目的是避免中间盒窥探目标选项。当然,世界不是这样运作的,而且我们现在知道,做到这一点的唯一方法是加密。IPv6 扩展头部消耗的邮件列表“空间”几乎比任何其他主题都多。它很难实现,并导致网络崩溃和故障。它们在网络中具有显着更高的丢弃概率,最重要的是,在有限的领域之外,它们几乎没有实际用途。IPv6 设计者应该怎么做? 不要在 IPv6 中添加对扩展头部和选项的支持。
- 多地址。 寻址是一个复杂的话题,如果不涉及其他设计特性,很难谈论它。IPv6 选择在连接到网络的接口上设置地址,而不是在节点上设置地址。与 IPv4 相比,IPv6 支持在接口上设置多个地址,其中每个地址都具有不同的属性。范围(链路本地、站点本地、全局)、类型(单播、多播、任播)、生存期(首选和有效)、其他属性(临时(所谓的隐私地址)、稳定、移动地址),当然还有可达性。主机不应泄露临时地址,并且应排序源地址和目标地址对的所有组合并成功连接。这导致了 RFC3484、RFC5220、RFC6724、RFC7078、draft-ietf-6man-rfc6724-update-17 等标准和 Happy Eyeballs 等机制。可以说,在实现和部署中正确执行此操作的机会正在迅速接近于零。IPv6 设计者应该怎么做? 链路本地地址非常好。它允许主机独立于链路上全局地址前缀配置默认路由器。IPv6 设计者应该怎么做? 保留链路本地地址,但删除其他寻址属性。
- 范围和私有地址。 IPv6 最初设计为具有单播 3 个范围。请参阅 RFC4007。链路本地、站点本地和全局范围。站点本地地址是 RFC1918 地址的镜像。虽然它们并不意味着用于访问区域外部(例如,Internet)。当然,站点本地地址是模糊的,并且类似于 RFC1918 地址,无法在引用中使用,并且可能导致使用 NAT。在 IETF 列表上的几千封电子邮件之后,站点本地地址已被弃用,并被一种称为 ULA 地址(唯一本地地址)的东西所取代。它可以以几乎相同的方式使用,但被定义(通过希望)为全局唯一且具有未定义的可达性。IPv6 设计者应该怎么做? 允许私有地址(包括 NAT),或者更可取的是在 IPv6 中设计身份/位置分离。
下次
在下一期中,我计划谈谈:
- 标识符位置分离以及 IPv6 中缺少该功能。
- 使用多种配置方法的配置复杂性。
- 服务发现的难题。
- 缺乏对网络进行免许可扩展的能力。
- 重新编号
- 多宿主