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