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.
可知以下信息:
- 它是个保留地址
- 它是个本地连接地址段
- 允许通信
更详细的定义来自于 RFC3927
3927指出,在IP网络里,每台主机都需要一个IP地址,在DHCP分配失败时,机器可以自己分配一个IP来完成这个工作。这个地址有两个作用:
- 保持格式一致,后续处理行为一致:就好像要给获取学号,在个别获取不到的时候为了格式统一,不能给他“error”,而是要给他“000000”。
- 当DHCP服务器故障,或者DHCP超时,不致于设备没有IP而造成连接不上。
几个问题
是否能通
现在很简单就能判断了:1. 有同段地址,2. 数据链路能通;明显是可以通信的
多个设备是否会获取冲突
RFC3927给出了详细的解释:
- 首先,16位的掩码提供了足够大的地址池(65536个)
- 其次,本地地址的生成不是完全随机的,而是会结合一些唯一标识符(例如MAC地址或UTC时间)来生成IP地址最后两位
- 生成地址之后,还会有一个冲突检测的操作,流程如下:
客户端确定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等),大致实现方式如下:
- 首先在underlay部署公共服务;
- 通过overlay2underlay的方式,将169.254.0.x/16的地址选中一个映射到underlay地址上;
- OS内部配置好服务的访问地址解析到169.254.0.x上(当然这里面还涉及到多地域统一管理,underlay/overlay统一管理等一些细节,不过那就属于工程问题了)
标签:Story,16,0.0,IP地址,地址,169.254,IP,DHCP 来源: https://www.cnblogs.com/alberto/p/16266171.html