如果假设客户端不监听 68 端口,当 DHCP 服务器接收到请求时,它可以将其发送到它接收请求的地址(发送时客户端选择的临时端口),那么为什么协议指定客户端是监听 68 端口?
3 回答
主要原因是 DHCP 服务器可能会在 mac 级别广播“DHCP 提供”,而不是将其单播发送到它收到请求的 mac 地址。如果端口不是恒定的,一些偶然监听这个相同随机端口的主机将接受数据包到第 5 层 - 应用层。换句话说,一个应用程序将从完全不同的应用程序中获取消息,而不是一个健康的情况。
我自己也不得不面对同样的问题,经过一番研究,我在RFC 2131中发现了以下内容,它描述了 DHCP 协议,位于第 1.6 节设计目标下:
- DHCP 必须为现有的 BOOTP 客户端提供服务
同样在描述 BOOTP 协议的RFC 951中,我们可以找到以下内容:
UDP 标头包含源和目标端口号。BOOTP 协议使用两个保留端口号,“BOOTP 客户端”(68)和“BOOTP 服务器”(67)。客户端使用“BOOTP server”作为目的端口发送请求;这通常是广播。服务器使用“BOOTP 客户端”作为目标端口发送回复;根据服务器中的内核或驱动程序设施,这可能是也可能不是广播(这在下面标题为“鸡/蛋问题”的部分中进一步解释)。使用两个保留端口的原因是为了避免“唤醒”和调度 BOOTP 服务器守护进程,此时必须将引导回复广播到客户端。由于服务器和其他主机不会监听“BOOTP 客户端”端口,任何此类传入的广播都将在内核级别被过滤掉。我们不能简单地允许客户端为 UDP 源端口字段选择一个“随机”端口号;由于服务器回复可能是广播的,随机选择的端口号可能会混淆恰好在该端口上侦听的其他主机。
所以问题的答案来自上述。DHCP 客户端需要使用 UDP 端口 68,以便 DHCP 与 BOOTP 协议兼容,并且 BOOTP 协议需要客户端的特定端口,因为 BOOTPREPLIES 可以广播,并且如果为客户端选择了随机端口,这可能会导致在同一端口上侦听的其他主机混淆。