四步:Discover、Offer、Request、Ack,首字母拼成 DORA。 两个时间点:T1(50%)续租、T2(87.5%)重绑定。
5.5.1 讲了它给什么,这一节讲它怎么给。 5.5.3 会讲「服务器不在同一网段」时怎么办。
一、四步各自在干什么
四步里有一步特别容易被忽略:
| 步 | 消息 | 怎么发 | 为什么这么发 | |---|---|---| | 1 | Discover | 广播 | 还不知道服务器在哪 | | 2 | Offer | 单播或广播 | 告诉客户端「给你这个」 | | 3 | Request | 广播 | 告诉所有服务器「我选了谁」 | | 4 | Ack | 单播或广播 | 确认,带全套配置 |
第三步用广播是最巧妙的设计:因为可能有好几台服务器都回了 Offer, 广播 Request 等于「大家听着,我选了这一家,其余的可以收回了」。 一次广播解决了「多方竞标」的问题,省掉了「逐个拒绝」。 第四行「带全套配置」是关键: IP、掩码、网关、DNS、租期全在这一步里—— 所以「Offer 到了但 Ack 没到」时,客户端什么也用不了。
二、两个时间点
租期不是一个「死线」,中间有两个提醒点:
| 时间点 | 什么时候 | 做什么 |
|---|---|---|
| T1 | 租期的 50% | 单播给原服务器:我要续 |
| T2 | 租期的 87.5% | 广播:任何服务器给我一个 |
| 到期 | 100% | 放弃地址,重新 Discover |
T1 和 T2 的分工是「先找熟人、再找所有人」: T1 只问原来那台(省事、地址不变);T2 才广播(原来那台可能挂了)。 算一下具体时刻(租期 24 小时):T1 是第 12 小时、T2 是第 21 小时、到期是第 24 小时。 所以「续租失败」不会立刻断网,还有 3 小时缓冲。
三、为什么感觉不到在续租
因为续租是「悄悄做」的:T1 到了发一个单播请求,服务器回一个 Ack,全程几十毫秒。 用户完全感觉不到。 这也解释了一个现象: 「改了路由器配置,为什么半天才生效」——因为客户端要等到续租才会重新问一次。 想立刻生效只能「断开再连」或「手动续租」。 反过来也有一个现象: 「为什么我的 IP 一直没变」——因为每次续租都成功,服务器倾向于「还给你原来的地址」。 所以「同一个网络里,设备地址通常很稳定」,不稳定的是「长期离开再回来」的那种。
四、动手 Demo:DHCP 的四步和两个时间点
先把四步的发送方式列清楚,再按 24 小时租期算 T1 和 T2。 注意 T1 是单播、T2 是广播,这个区别很关键。
lease = 86400
for name, r in (('T1 续租', 0.5), ('T2 重绑定', 0.875)):
print(name, r, int(lease * r), lease * r / 3600)
实跑输出:
--------------------------------------------------------------------
DHCP 的四步和两个时间点
--------------------------------------------------------------------
**四步的英文首字母刚好能拼成 DORA**:**Discover、Offer、Request、Ack。**
步 消息 干什么 怎么发
----------------------------------------------------------------------------------------
**1** **Discover** **客户端广播「有人在吗」** **0.0.0.0 → 255.255.255.255**
**2** **Offer** **服务器说「给你这个」** **单播或广播**
**3** **Request** **客户端说「我要这个」** **广播(通知其他服务器)**
**4** **Ack** **服务器说「成交」** **含租期和全部配置**
**第三步为什么要广播**:**因为可能有好几台 DHCP 服务器都给了 Offer**,
**广播 Request 等于「告诉大家我选了谁,其他的可以收回了」。**
**这是一个很聪明的设计**:**用一次广播解决「多方竞标」的问题。**
**然后算两个关键时间点**:
时间点 比例 秒数 小时
--------------------------------------------------
续租时间 T1 50% 43200 秒 12.0 小时
重绑定时间 T2 88% 75600 秒 21.0 小时
**租期 86400 秒(24 小时)时,T1 是 43200 秒(12 小时)、T2 是 75600 秒(21 小时)。**
**两个时间点的分工是**:
**T1 到了先「续租」(问原来那台服务器);T2 到了还没续上,就「重绑定」(向任何一台服务器求救)。**
**所以「续租失败」不会立刻断网,还有 9 小时缓冲。**
**这也解释了一个现象**:
**「改了路由器配置,为什么半天才生效」**——**因为客户端要等到续租才会重新问一次。**
**想立刻生效,只能「断开再连」或者「手动续租」。**
0.875 这个数不是随便定的:它是 7/8,
也就是「租期走完 87.5% 时,还剩 12.5% 的时间用来重新找服务器」。
留这么长的缓冲,是因为「广播找服务器」可能要试好几次。
「T1 单播、T2 广播」的差别在抓包里能直接看到:
T1 的包目的地址是服务器的 IP,T2 的包是 255.255.255.255。
所以「看到大量 DHCP 广播」通常意味着「原服务器不响应了」。
「到期就放弃地址」这一步很多人不知道:它会主动停止使用那个 IP,
所以「租约过期后还硬用旧地址」会造成地址冲突——
这也是「手动配静态地址要避开 DHCP 池」的原因。
30 秒实验
- 算一下:租期 1 小时,T1 和 T2 分别是第几分钟?
- 想一下:为什么 Request 要广播而不是单播?
- 想一下:为什么「改了配置要等续租才生效」?
常见误区
- 以为「DHCP 只有两步」。 四步,Offer 和 Request 都不能省。
- 以为「T1 就广播找服务器」。 T1 是单播给原服务器,T2 才广播。
- 以为「租约到期地址还能用一会儿」。 到期就停用,硬用会冲突。
自测三问(点开对答案)
1. DHCP 的四步分别是什么? —— **Discover、Offer、Request、Ack**,首字母拼成 DORA。 2. T1 和 T2 分别在租期的多少比例? —— **T1 是 50%,T2 是 87.5%(7/8)。** 3. 为什么 Request 要广播? —— **为了通知所有给过 Offer 的服务器「我选了谁」**,其余可以释放资源。下一节讲「服务器在别的网段」怎么办:中继代理。
- ☐ (本节完,下一节 5.5.3 DHCP中继代理)