Прослушивание TCP-порта 0 выделяет мне свободный номер порта в системе.
Но что происходит, когда я пытаюсь подключиться к TCP-порту 0? Очевидный ответ: «Это не работает»:
$ nc localhost 0
nc: port number too small: 0
Где в системе это обрабатывается? В стеке TCP ядра ОС? Есть ли Unix, где будет работать подключение к TCP-порту 0?
networking
tcp
NH2
источник
источник
Ответы:
Просто чтобы убедиться, что мы находимся на одной странице (ваш вопрос неоднозначен), запрос на привязку TCP к порту 0 означает запрос на динамическую генерацию неиспользуемого номера порта. Другими словами, номер порта, который вы фактически прослушиваете после этого запроса, не равен нулю. Там же комментарий об этом
[linux kernel source]/net/ipv4/inet_connection_sock.c
наinet_csk_get_port()
:Что является стандартным соглашением Unix. Могут быть системы, которые фактически позволят использовать порт 0, но это будет считаться плохой практикой. Однако это поведение официально не указано в протоколах POSIX, IANA или TCP. 1 Вы можете найти это интересным .
Вот почему вы не можете разумно установить TCP-соединение с нулевым портом. Предположительно
nc
знает об этом и сообщает вам, что вы делаете бессмысленный запрос. Если вы попробуете это в нативном коде:Вы получаете ту же ошибку, что пытаетесь подключиться к любому другому недоступному порту:
ECONNREFUSED
«Отказано в соединении». Итак, в ответ на:Возможно нет; это не требует специальной обработки. То есть, если вы можете найти систему, которая позволяет связывать и прослушивать порт 0, вы, вероятно, можете подключиться к нему.
1. Но IANA действительно относятся к нему как «Reserved» ( смотрите здесь ). Это означает, что этот порт не должен использоваться в сети. Это нормально с точки зрения соглашения о динамическом присваивании (так как оно фактически не будет использоваться). Предусматривая это как конкретную цель, вероятно, выходит за рамки IANA; по сути, операционные системы могут делать с ними все, что хотят, в том числе и ничего.
источник
INADDR_ANY
, на что ссылается Ричард (система заменит его значением по умолчанию). Но на самом деле использование адреса в сети, по-видимому, имеет последствия, о которых Андреа упоминает (за исключением того, что он не настолько понятен, как «широковещательный»): en.wikipedia.org/wiki/0.0.0.0Использование порта 0 запускает операционную систему для поиска и выделения следующего доступного порта. Это исключает необходимость жесткого кодирования определенного порта или поиска доступного порта. Моя система Mint Linux возвращается
в
источник
nc -l 0
попросит ОС прослушивать порт 0. Но, как отмечалось выше, большинство операционных систем увидят 0 и вызовут свои особые обычаи для выбора порта с положительным номером для вашего приложения, поэтому вnc
конечном итоге прослушивается какой-либо порт, например 56514.источник