日文维基百科条目页面链路本地地址提到创建链路本地地址是几乎总是不确定的(日语中为非决定论的)。对应的英文页面没有对应的表述。
我的问题是 APIPA 是如何实现的,以及如何选择(或计算)候选地址。它真的是一种不确定的算法吗?
答案1
RFC 3927是如何规范的应该实施。它有一个部分2.1. 链路本地地址选择它指定了 PRNG 的用法和建议PRNG 每次都应使用相同的初始值(例如 MAC 地址)进行播种。
PRNG 是确定性的——它们唯一的随机性来源是外部种子;用相同的种子重新初始化相同的 PRNG 将始终产生相同的输出序列(因此伪-random)。因此,任何使用 MAC 地址作为 PRNG 种子的 APIPA 实现也应该确定性地生成 IPv4 地址。
The pseudo-random number generation algorithm MUST be chosen so that
different hosts do not generate the same sequence of numbers. If the
host has access to persistent information that is different for each
host, such as its IEEE 802 MAC address, then the pseudo-random number
generator SHOULD be seeded using a value derived from this
information. This means that even without using any other persistent
storage, a host will usually select the same IPv4 Link-Local address
each time it is booted, which can be convenient for debugging and
other operational reasons. Seeding the pseudo-random number
除了通过实验测试之外,不可能知道所有 APIPA 实现是否都遵循此建议(其中许多实现,例如 Windows 中的实现,都是闭源的)。如果我没记错的话,Linux 上的 Avahi 是符合要求的。
作为一个不同的例子,我似乎记得 Ubiquiti 的 airOS 固件使用的实现在设备文档中被特别称为直接地使用设备的最后两个 MAC 八位字节作为初始 APIPA 地址(有点不合规,但仍然具有确定性)。
答案2
从RFC 3927:
这意味着即使不使用任何其他持久性存储,主机通常也会在每次启动时选择相同的 IPv4 链路本地地址,这可以方便调试和其他操作原因。
注意通常PRNG 用于生成 IP 地址序列,设备从该序列中选择第一个地址,未被其他设备认领。这意味着结果与路径有关。即使所有设备都确定性地播种其 PRNG,如果发生冲突,结果也取决于不同设备上线和声明地址的顺序。如果您关闭所有设备,然后以与上次不同的顺序重新启动,结果可能会有所不同。即使只是更改两个设备的相对顺序,也可能产生连锁反应,导致任意数量的设备接收不同的地址(尽管这在统计上不太可能发生,除非您在同一个网络段上有数千台设备)。
那么这是确定性的还是非确定性的?这完全取决于你对系统的看法。狭义的观点是算法是确定性的——给定相同的输入(即相同的种子和同一组当前在线的网络对等点),它每次都会做出相同的选择。
但是,如果我们认为网络由具有各种种子(其中一些种子可能不为我们所知)的设备集合组成,这些设备在不可预测的时间加入和离开网络,那么我们得出的结论是,我们无法确切地预测任何设备在未来任何时间将拥有什么地址。我们只能弄清楚在分配任务时通过对网络进行普查。从这个意义上讲,自动 IP 分配是不确定的,因为它取决于不确定的外部因素(例如,人们带着手机和笔记本电脑进出建筑物)。