Просто для того, щоб переконатися, що ми знаходимося на одній сторінці (ваше запитання неоднозначно таким чином), прохання прив’язати 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; по суті, операційні системи вільні робити з цим все, що хочуть, не включаючи нічого.