网络接口dhcp失败时会获得一个169.254.x.x的IP地址
最开始发现这个现象是在windows上面,之前以为是dhcp失败后,会有个随机值作为IP地址,以为是个垃圾数据,是windows特有的行为。最近一个项目,基于buildroot构建,用到4G上网功能,在开发其他功能,一直没插SIM卡,总发现4G接口会拿到一个奇怪的IP地址169.254.118.160。测试把这个问题当作一个bug提给了我。我发现这个IP地址每次都是一样,而且不同机器拿到的这个IP也是一样,如果按我以前的推测,这是垃圾数据,应该是个随机值才对,不可能全部一样。在windows上测试,也是一个169.254.x.x的地址,看来这个是故意为之的。果然,上网搜索这个叫APIPA(Automatic Private IP Addressing Allocation),自动专有IP地址分配。
The169.254.0.0/16network is used for Automatic Private IP Addressing, or APIPA. If a DHCP client attempts to get an address, but fails to find a DHCP server after the timeout and retries period it will randomly assume an address from this network.
169.254.0.0/16网络用于自动专用IP寻址或APIPA。如果DHCP客户机尝试获取地址,但在超时和重试后找不到DHCP服务器,它将随机假定来自此网络的地址。其实它还有个条件,就是你没设置网关。169.254.0.0/16这个地址段就是local link address,就是链路本地地址。想要看到这个地址,就需要你的设备支持链路本地地址。
LLA在RFC3927中有详细的描述,它分为三个阶段:
首先:在开始Local link时,需要将自已的IP和掩码网关都设为0,并随机生成一个IP,网段在169.254.1.0到169.254.254.255,RFC3927中建议使用MAC来生成IP地址,这样可以使每个设备生成的IP都不一样,将设备同时探测同一个IP的可能性降到了最低。
其次,发送ARP探测包,选择合适的IP地址:将目的IP地址指向要探测的IP,这里假设该IP为A;如果网络中,IP A被绑定,则占用该IP的主机会回应,设备在收到的ARP回应中,如果发现源IP是A,则表示冲突;当然,还有一种情况,可能有其它的设备也在探测这个IP,那么,在这种情况下,选择放弃该IP,重新开始配置。
最后,探测包发完了,并且在规定的时间内没有收到来自源IP为A的主机回应,则认为该IP没有被占用,于是设置本机IP为A,RFC3927 2.5节中描述,地址冲突的检测并不局限于地址选择阶段,在任何时候,如果设备收到一个ARP,其中源IP地址和本机IP一致,但MAC不一致,都将认为这是一个冲突。
那么如何禁用它呢?在linux下,dhcpcd.conf里面加上noipv4ll选项即可。
参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2019-08-05 beyond compare秘钥被禁
2017-08-05 fork开源代码后如何基于某个tag建立自己的branch