Почему популярные службы, использующие TCP, имеют UDP, а также записи TCP в / etc / services?

22

Я читаю книгу о сетевом программировании на Go. Одна из глав посвящена файлу / etc / services. При исследовании этого файла я заметил, что некоторые популярные записи, такие как HTTP и SSH, которые используют TCP на транспортном уровне, имеют вторую запись для UDP. Например, в Ubuntu 14.04:

ubuntu@vm1:~$ grep ssh /etc/services  
ssh             22/tcp         # SSH Remote Login Protocol 
ssh             22/udp

ubuntu@vm1:~$ grep http /etc/services  
http            80/tcp          www             # WorldWideWeb HTTP            
http            80/udp                          # HyperText Transfer Protocol

Кто-нибудь знает, почему у них есть две записи? Я не верю, что SSH или HTTP когда-либо используют UDP (подтверждается этим вопросом для SSH).

sixty4bit
источник
7
22/udpбыл удален в Debian в 2016 году. IANA по-прежнему перечисляет 22 / udp и перечисляет как udp, так и tcp для большинства протоколов, которые обычно реализуются только на одном из них. Может быть, это означает, что 22 зарезервировано для ssh на тот случай, если кто-нибудь захочет реализовать ssh через udp когда-нибудь?
Стефан Шазелас
2
См. Также раздел 7.1 rfc6335
Стефан

Ответы:

29

В основном, это потому , что была традиция от пути назад , когда номера портов начали быть назначены через примерно до 2011. См, например, §7.1 «Past принципов» в RFC 6335 :

TCP и UDP порты были назначены одновременно при запросе любого из них

Конечно, возможно, когда-нибудь они будут выделены, поскольку порты 1023 и ниже являются «системными портами», которые обрабатываются особым образом в большинстве операционных систем, и большая часть этого диапазона назначена в настоящее время.

И, кстати, HTTP / 3 работает по UDP. Хотя он может использовать любой порт UDP, а не только 80/443. Так что на самом деле они все еще не используются.

Что касается Debian, у него /etc/servicesуже было 22 / udp в 1.0 (buzz 1996) .

Однако он был удален в этом коммите в 2016 году, впервые выпущен в версии 5.4 netbaseпакета.

На момент написания статьи последняя стабильная версия Debian (buster) имеет 5.6 . И последний пакет Ubuntu LTS (18.04, bionic) netbase основан на Debian Netbase 5.4, и вы можете увидеть, что в его списке изменений также упоминается удаление udp / 22 .

derobert
источник
4
@SergiyKolodyazhnyy Я думаю, что нет, так как эта практика предшествует брандмауэрам.
Дероберт
3
@TobySpeight Это не просто Linux, это часть соответствующих стандартов. См., Например, §6 этого RFC. Хотя IANA также регистрирует порты более высокого уровня, они имеют другую классификацию (и это имеет значение на практике из-за того, как к ним относятся ОС, а не только Linux). Я поясню это немного. Кроме того, 0 не является допустимым портом. Он используется API-интерфейсом сокетов в качестве подстановочного знака (чтобы указать ядру выбрать порт для вас).
Дероберт
2
«0 не является действительным портом» сомнительно. Это, конечно, не используемый порт в нашей ОС (именно поэтому я специально назвал его и почему он в настоящее время зарезервирован и вряд ли будет назначен для чего-либо), но он не является особенным на уровне протокола.
Тоби Спейт
1
@derobert: Ваш аргумент в том, что порт 0 не может использоваться на машинах Unix, потому что порт 0 означает «выбрать свободный порт». Я говорю, что аргумент неверен. Вывод не вытекает логически из предпосылки.
MSalters
3
Хотя он может использовать любой порт UDP, а не только 80/443. По сути, это верно для любого протокола TCP / UDP, это просто порты по умолчанию, связанные с каждым. Большинство приложений, использующих TCP и UDP, не предоставляют способ указания портов не по умолчанию, но HTTP позволяет указывать их в URL-адресах, поэтому более целесообразно изменять порт.
Бармар