Могут ли сокеты TCP и UDP использовать один и тот же порт?

104

Прежде всего, есть ли проблема с использованием UDP и TCP на одном сервере?

Во-вторых, могу ли я использовать тот же номер порта?

пользователь800799
источник

Ответы:

111

Да, вы можете использовать один и тот же номер порта как для TCP, так и для UDP. Многие протоколы уже делают это, например DNS работает на udp / 53 и tcp / 53.

Технически пулы портов для каждого протокола полностью независимы, но для протоколов более высокого уровня, которые могут использовать TCP или UDP, по соглашению они по умолчанию используют один и тот же номер порта .

При написании вашего сервера имейте в виду, что последовательность событий для TCP-сокета намного сложнее, чем для UDP-сокета, так как помимо обычных вызовов socketи bindвызовов вам также необходимо listenи accept.

Кроме того, этот acceptвызов вернет новый сокет, и это тот сокет, который вам затем придется опрашивать на предмет событий приема. Ваш сервер должен быть готов к продолжению acceptподключений к исходному сокету, одновременно обслуживая несколько клиентов, каждый из которых будет запускать события приема на своих собственных сокетах.

Альнитак
источник
2
@Eric Fortis RFC 1700 полон примеров, давайте не будем перечислять их все, не так ли? ;-)
Marquis of Lorne
2
@ Эрик Фортист, почему все должны знать о номерах портов NetBIOS?
Marquis of Lorne,
4
Пожалуйста, опубликуйте его как вопрос, чтобы вы могли дать мне ответ
Эрик Фортис
6
Что-то этот ответ не объясняет: семантика «порта» специфична для каждого протокола (но некоторые могут не иметь этой семантики) транспортного уровня (уровень модели OSI 4). Таким образом, TCP имеет свои собственные порты, которые интерпретируются стеком TCP; UDP имеет свои собственные порты, которые интерпретируются стеком UDP. Так сказать, порты UDP и TCP не используются совместно; просто так получилось, что оба протокола имеют одинаковое определение «портов» и что для упрощения мы используем одно и то же значение порта для нескольких подключений разных типов к одной и той же службе.
Моала 08
2
@EricFortis Потому что такой вопрос не будет интересовать меня или кого-либо еще, как и ваши причины, по которым вы считаете его интересным, а также ваши возражения против цитирования одного RFC, который находится здесь именно для той цели, которую мы обсуждаем.
Marquis of Lorne
8

Во-первых, нет проблем с использованием на сервере и tcp, и udp.

Во-вторых, мы можем иметь как UDP-запросы, так и TCP-запросы на одном и том же порту, потому что каждый запрос идентифицируется пятеркой, содержащей IP-адрес источника, IP-адрес назначения, порт источника, порт назначения, PROTOCOL (поскольку протокол может быть TCP или UDP).

aMooly
источник
3
Причина, по которой вы указываете, часто приводится, но на самом деле она бессмысленна. Не существует такого понятия, как UDP-соединение, и нет контекста, в котором соединения рассматриваются независимо от связанного протокола. Дело в том, что порты являются артефактами TCP и UDP по отдельности, и поэтому нет никакой возможности их спутать.
Marquis of Lorne
Спасибо, что указали на мою ошибку. Правильно, что нет соединения по UDP.
aMooly 01