我知道 DHCP 用于为客户端分配 IP 地址,因此建立连接的唯一可能方法是监听特定端口。但选择 67 和 68 有什么特别的原因吗?
答案1
DHCP 基于早期的 BOOTP 协议,该协议对服务器和客户端使用众所周知的端口号,而不是临时端口。服务器和客户端通过广播进行通信,服务器通过 UDP 端口 68 将提供的 IP 地址广播给客户端。在客户端使用众所周知的端口是为了解决与此广播相关的问题,我们将在下面进行介绍。
假设主机 A 在临时端口 1883 上使用 BOOTP 客户端,而主机 B(位于同一网络上)在同一端口上使用 MQTT 客户端。现在,当 BOOTP 服务器发送广播 IP 地址为 255.255.255.255 且目标端口号为 1883 的广播回复消息时,主机 A 将在应用层的 DHCP 客户端上接受正确的消息。但是,在主机 B 的应用层上运行的 MQTT 客户端将收到一条错误消息。使用众所周知的端口(在我们的例子中为 68)可防止使用相同的两个目标端口号,因此它禁止其他协议使用已被另一个协议使用的同一端口。简而言之,它可以防止应用程序从完全不同的协议获取消息。
如需了解更多详情,我建议您访问RFC 2131。
答案2
DHCP 基于引导协议创建于 1985 年。
BOOTP 用途远程文件传输协议作为文件传输协议。
TFTP 创建于 1981 年,使用端口 69,因此它是使用最近的未使用的端口(68 和 67)。
答案3
答案比你想象的还要奇怪。
您是否曾对早期标准 TCP 服务的端口号感到好奇?FTP 是 21,TELNET 是 23,SMTP 是 25?为什么它们都是奇数?为什么 telnet 使用 23 后,ssh 却得到了 22?
显然,TCP 协议最早的迭代(20 世纪 70 年代之前)是半双工的,因此双向通信需要两个端口号。奇数端口号保留给服务器端,偶数端口号保留给客户端。
BOOTP(DHCP的前身)也是在同一个时代构思出来的,使用了同样的概念:奇数表示服务器端监听,偶数表示客户端监听。
那么 SSH 是如何得到 22 的呢?几十年来,服务器端 TCP 服务都使用奇数作为事实上的标准,但为服务分配偶数端口仍然很不寻常。然而,到 1995 年 ssh 首次推出时,不再有任何技术原因不分配偶数,甚至没有人再害怕这样做了。