Просто чтобы убедиться, что мы находимся на одной странице (ваш вопрос неоднозначен), запрос на привязку TCP к порту 0 означает запрос на динамическую генерацию неиспользуемого номера порта. Другими словами, номер порта, который вы фактически прослушиваете после этого запроса, не равен нулю. Там же комментарий об этом [linux kernel source]/net/ipv4/inet_connection_sock.c
на inet_csk_get_port()
:
/* Obtain a reference to a local port for the given sock,
* if snum is zero it means select any available local port.
*/
Что является стандартным соглашением Unix. Могут быть системы, которые фактически позволят использовать порт 0, но это будет считаться плохой практикой. Однако это поведение официально не указано в протоколах POSIX, IANA или TCP. 1 Вы можете найти это интересным .
Вот почему вы не можете разумно установить TCP-соединение с нулевым портом. Предположительно nc
знает об этом и сообщает вам, что вы делаете бессмысленный запрос. Если вы попробуете это в нативном коде:
int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("127.0.0.1", &addr.sin_addr);
if (connect(fd, (const struct sockaddr*)&addr, sizeof(addr)) == -1) {
fprintf(stderr,"%s", strerror(errno));
}
Вы получаете ту же ошибку, что пытаетесь подключиться к любому другому недоступному порту: ECONNREFUSED
«Отказано в соединении». Итак, в ответ на:
Где в системе это обрабатывается? В стеке TCP ядра ОС?
Возможно нет; это не требует специальной обработки. То есть, если вы можете найти систему, которая позволяет связывать и прослушивать порт 0, вы, вероятно, можете подключиться к нему.
1. Но IANA действительно относятся к нему как «Reserved» ( смотрите здесь ). Это означает, что этот порт не должен использоваться в сети. Это нормально с точки зрения соглашения о динамическом присваивании (так как оно фактически не будет использоваться). Предусматривая это как конкретную цель, вероятно, выходит за рамки IANA; по сути, операционные системы могут делать с ними все, что хотят, в том числе и ничего.