为什么 DHCP 使用 UDP 端口 67 和 68 来进行客户端和服务器之间的通信?

val*_*far 12 dhcp

我知道 DHCP 用于为客户端分配 IP 地址,因此建立连接的唯一可能方法是侦听特定端口。但是选择 67 和 68 背后有什么具体原因吗?

jcb*_*rmu 16

DHCP 基于1985 年创建的BOOTP

BOOTP 使用TFTP作为文件传输协议。

TFTP 创建于 1981 年并使用端口 69,因此它使用最近的未使用端口(68 和 67)。


小智 13

答案比你想象的更奇怪。

您是否想过早期标准 TCP 服务的端口号?21 用于 FTP、23 用于 TELNET、25 用于 SMTP?为什么他们都很奇怪?ssh 如何在 telnet 使用 23 后得到 22 呢?

显然,TCP 协议的最早迭代(七十年代之前)是半双工的,因此双向流量需要两个端口号。奇数端口号为服务器端保留,偶数端口号为客户端保留。

BOOTP(DHCP的前身)是在同一时代构思的,并且使用相同的概念:奇数用于服务器端监听,偶数用于客户端监听。

那么SSH是怎么得到22的呢?在服务器端 TCP 服务使用奇数端口的事实上的标准几十年后,为服务获取偶数端口仍然是不寻常的。然而,到 1995 年,当 ssh 首次引入时,不再有任何技术原因不分配偶数,甚至没有人再害怕这样做。


Ank*_*tia 12

DHCP 基于早期的 BOOTP 协议,该协议为服务器和客户端使用众所周知的端口号,而不是临时端口。服务器和客户端通过广播进行通信,服务器在 UDP 端口 68 上向客户端广播提供的 IP 地址。引入了在客户端使用众所周知的端口来解决与此广播相关的问题,我们将对此进行描述以下。

假设主机 A 在临时端口 1883 上使用 BOOTP 客户端,而主机 B(在同一网络上)在同一端口上使用 MQTT 客户端。现在,当 BOOTP 服务器使用广播 IP 地址 255.255.255.255 和目标端口号发送广播回复消息时。1883,那么主机 A 将在其应用层的 DHCP 客户端上接受正确的消息。但是,运行在主机 B 应用层上的 MQTT 客户端会收到错误消息。使用众所周知的端口(在我们的例子中是 68)可以防止使用相同的两个目标端口号,因此它禁止其他协议使用另一个协议已经在使用的相同端口。简而言之,它可以防止应用程序从完全不同的协议中获取消息。

有关更多详细信息,我建议您阅读RFC 2131