Я знаю, что DHCP используется для назначения IP-адреса клиенту, и, следовательно, единственный возможный способ установить соединение - прослушивать определенный порт. Но есть ли какая-то конкретная причина выбора 67 и 68?
2 ответа
DHCP основан на BOOTP, который был создан в 1985 году.
BOOTP использует TFTP в качестве протокола передачи файлов.
TFTP был создан в 1981 году и использует порт 69, поэтому речь шла об использовании ближайших неиспользуемых портов (68 и 67).
DHCP основан на более раннем протоколе BOOTP, который использует хорошо известные номера портов как для сервера, так и для клиента вместо эфемерного порта. Сервер и клиент обмениваются данными через широковещательную рассылку, а сервер передает широковещательный IP-адрес клиенту через UDP-порт 68. Использование хорошо известного порта на стороне клиента вводится для решения проблемы, связанной с этой трансляцией, которую мы опишем ниже.
Давайте предположим, что хост A использует клиент BOOTP на временном порту 1883, а хост B (который находится в той же сети) использует клиент MQTT на том же порту. Теперь, когда сервер BOOTP отправляет широковещательное ответное сообщение с широковещательным IP-адресом 255.255.255.255 и номером порта назначения. 1883, то хост A примет правильное сообщение на своем DHCP-клиенте на прикладном уровне. Но клиент MQTT, работающий на прикладном уровне хоста B, получит неверное сообщение. Использование хорошо известного порта (в нашем случае 68) предотвращает использование тех же двух номеров портов назначения и, следовательно, запрещает другим протоколам использовать тот же порт, который уже используется другим протоколом. Проще говоря, это предотвращает получение приложением сообщения по совершенно другому протоколу.
Для более подробной информации я бы порекомендовал вам пройти RFC 2131.