RFC2131第3.1节描述了DHCP的工作流程如下:
Server Client Server
(not selected) (selected)
v v v
| | |
| Begins initialization |
| | |
| _____________/|\____________ |
|/DHCPDISCOVER | DHCPDISCOVER \|
| | |
Determines | Determines
configuration | configuration
| | |
|\ | ____________/|
| \________ | /DHCPOFFER |
| DHCPOFFER\ |/ |
| \ | |
| Collects replies |
| \| |
| Selects configuration |
| | |
| _____________/|\____________ |
|/ DHCPREQUEST | DHCPREQUEST\ |
| | |
| | Commits configuration
| | |
| | _____________/|
| |/ DHCPACK |
| | |
| Initialization complete |
| | |
. . .
. . .
| | |
| Graceful shutdown |
| | |
| |\ ____________ |
| | DHCPRELEASE \|
| | |
| | Discards lease
| | |
v v v
Figure 3: Timeline diagram of messages exchanged between DHCP
client and servers when allocating a new network address
我的问题是:对于请求 IP 地址的客户端,两阶段数据包交换有什么好处?我认为仅定义 DHCPREQUEST/DHCPACK 就足够了。
DHCPDISCOVER
我的意思是,我希望有人可以举出一个对协议的运作有益的案例。
减少一次数据包交换(具体涉及MAC广播)可以降低数据包丢失的风险,特别是在一些不太可靠的介质上,例如802.11无线网络。
答案1
发送发现然后仅向其中一个响应的服务器发送请求的好处是,您不必让所有 DHCP 服务器都经历分配 IP 地址的过程。
我想不出有多个 DHCP 服务器处理相同客户端的很多理由(除了冗余之外),但如果有,单阶段过程将导致 DHCP 服务器分配一个永远不会使用的 IP 地址。客户端搜索 DHCP 服务器,然后在第二步中实际要求其中一个服务器分配 IP 地址,这是有道理的。