Loading

169.254.0.0/16's Story

前言

我们知道,在windows DHCP失败的时候,操作系统会自动给其配上一个169.254.0.0/16地址,通常我们看到这个地址就默认为其不通,开始检查问题出在哪里了。
那这个地址到底是什么意思,能用来做什么呢?

DHCP流程

让我们来看看DHCP的流程:
当一台没有IP的主机设置为DHCP接入网络时,会向网络中发送DHCP广播请求获得IP地址,包内容如下:
源IP为0.0.0.0,目的IP为255.255.255.255,源MAC地址正常,目的Mac地址为全F。

windows主机作为客户端的行为是:网卡获得地址会先发送一个广播包,等待 1 秒之后,如果没有服务器应答,就发送第二个广播包,如果 9 秒后没有收到应答,则发送第三个广播包,等 13 秒,还没有应答,最后再发送一个包,等待16 秒后,最终在四个广播包没有应答的情况下,默认是放弃请求,为网卡自动配上一个私有 IP 地址,地址段为169.254.0.0/16,网络状态为“受限制或无连接”,169.254.0.0/16这个地址段就是local link address,就是链路本地地址。

定义

引用自rfc5735

 169.254.0.0/16 - This is the "link local" block.  As described in
   [RFC3927], it is allocated for communication between hosts on a
   single link.  Hosts obtain these addresses by auto-configuration,
   such as when a DHCP server cannot be found.

可知以下信息:

  1. 它是个保留地址
  2. 它是个本地连接地址段
  3. 允许通信

更详细的定义来自于 RFC3927
3927指出,在IP网络里,每台主机都需要一个IP地址,在DHCP分配失败时,机器可以自己分配一个IP来完成这个工作。这个地址有两个作用:

  1. 保持格式一致,后续处理行为一致:就好像要给获取学号,在个别获取不到的时候为了格式统一,不能给他“error”,而是要给他“000000”。
  2. 当DHCP服务器故障,或者DHCP超时,不致于设备没有IP而造成连接不上。

几个问题

是否能通

现在很简单就能判断了:1. 有同段地址,2. 数据链路能通;明显是可以通信的

多个设备是否会获取冲突

RFC3927给出了详细的解释:

  1. 首先,16位的掩码提供了足够大的地址池(65536个)
  2. 其次,本地地址的生成不是完全随机的,而是会结合一些唯一标识符(例如MAC地址或UTC时间)来生成IP地址最后两位
  3. 生成地址之后,还会有一个冲突检测的操作,流程如下:
客户端确定IP地址后两位后,会在广播域中发送ARP探测包,目的IP地址指向意向IP,假设该IP为A;
如果客户端收到占用IP A的主机回应,则表示冲突;
同时如果在探测期间收到有其它的设备发送的探测A请求,客户端也会选择放弃该IP,重新开始配置。
最后探测包发完且在规定的时间内没有收到来自源IP为A的主机回应,则认为该IP没有被占用,设置本机IP为A。
(RFC3927 2.5节中描述,地址冲突的检测并不局限于地址选择阶段,在任何时候,如果设备收到一个ARP,其中源IP地址和本机IP一致,但MAC不一致,也会认为存在冲突。)

有什么用?

从以上信息,我们可以了解到首先这一规则是在所有操作系统(的dhcp客户端)中统一约定的;
那么也就意味着不仅配置行为一致,访问目的地址也是一致的,有一个很适合的场景就是作为大规模网络中的默认服务使用,可以在修改成本很低的情况下达到目的(即使客户端IP地址获取失败也不影响使用)。
例如公有云的公共服务(例如ntp/updateserver/config-center等),大致实现方式如下:

  1. 首先在underlay部署公共服务;
  2. 通过overlay2underlay的方式,将169.254.0.x/16的地址选中一个映射到underlay地址上;
  3. OS内部配置好服务的访问地址解析到169.254.0.x上(当然这里面还涉及到多地域统一管理,underlay/overlay统一管理等一些细节,不过那就属于工程问题了)
posted @ 2022-05-13 11:55  motorao  阅读(209)  评论(0编辑  收藏  举报