DHCP 只把地址租给你
DHCP 发的是带时长的租约而不是永久的地址。租期驱动续约机制,也让服务器收回设备已不再使用的地址。 借用而非拥有地址 DHCP 并不给设备一个永久的地址,而是把地址借给它一段有限时间。设备入网时广播去发现服务器,服务器用网络预先配置的租期给出一份租约。正因为分配是临时的,服务器随时知道哪些地址有效,可以当作资源池来统计。这份「临时」恰恰是大型、频繁变动的网络能管理起来的根本:地址是服务器可以分发、续期、收回的货币,而不是某个主机永远占着的财产。 续约让租约保持存活 在租约到期之前,客户端会主动请求续约——通常在租期过半时才提出,不够再续——于是健康设备可以在无人干预的情况下长期保有同一地址。这种「半衰期续租」让地址跨越重启与会话保持稳定,对语音、部分 VPN 这类地址一变就断的服务尤其重要。租期是一个治理旋钮:租期短,地址回收快,但续约流量更密;租期长,地址更稳定,却把早已离开的地址长期拴着不放。 过期即可回收 租约到期又没有续约时,服务器会收回该地址,再把它发给另一台主机。一台许多天前就离开大楼的笔记本,就因此不会一直占着一个新设备正需要的地址。放弃租约的设备下一次入网会拿到一个新地址——对临时上网没问题,对期望固定身份的服务却不友好。调整租约就是在换手率与可用性之间找平衡:拥挤或流动的网络用短租期,内部稳定、身份重要的场景用长租期。 坏掉的样子 地址池耗尽时最安静。新客户端广播 DISCOVER,却收不到 OFFER,或者 REQUEST 换来一个 NAK,笔记本只能拿到 169.254.x.x 的链路本地地址,哪儿也去不了。这时不要让客户端盲目重试:应该扩大地址池,在人员流动大的网络里缩短租期,让离开的设备尽快归还地址,同时清理服务器上因冲突被标记为废弃的绑定。 相反的错误,是把租期设得太短,短到变成风暴。一间有上千台主机的办公室,如果租期只有五分钟,就会有约一半设备每隔几分钟在 T1 时刻单播续约,掉队的还要在 T2 时刻广播重绑,服务器一旦重启,正好撞上续约洪峰。应当保持 RFC 2131 的默认值,T1 取租期一半,T2 取租期的八分之七,先把过短的租期调长,再把开机潮错峰,而不是把续约流量当成免费的。 流氓服务器靠抢答获胜。一台私接的家用路由器或者恶意主机,会抢在真正的服务器之前回答 DISCOVER,给出一个看起来合法、网关或 DNS 却被掉包的地址,把流量引到自己身上。症状会游走:有的租约正常,有的解析异常,受害的客户端随着每次竞速不断变化。对策是固定合法服务器的标识,在交换机上开启 DHCP 监听,只允许受信任端口发送 OFFER 和 ACK,并把流氓设备清走,而不是调定时器。 时钟偏斜破坏的是那份安静的契约。线上传输的是相对秒数,可一旦服务器用绝对时间戳保存过期时刻,或者笔记本一睡就睡过 T1 和 T2,就会提前过期或者超期占用。睡着的机器醒来时还配着旧地址,而服务器早已把它收回转租,两个主机就会争用同一个 IP。应当把长时间睡眠当作一次重绑,排查时把 NTP 和 DHCP 日志放在一起看,并保留冲突检测与 DECLINE、RELEASE 的处理,不要假设时钟永远不会跳变。 ...