Чи можливо підключитися до порту TCP 0?


59

Прослуховування TCP-порту 0 виділяє мені номер безкоштовного порту в системі.

Але що відбувається, коли я намагаюся підключитися до порту TCP 0? Очевидна відповідь: "Це не працює":

$ nc localhost 0                 
nc: port number too small: 0

Де в системі це обробляється? У стеку TCP ядра ОС? Чи є Unixes, де працює підключення до порту TCP 0?


2
Теоретично, ви могли б створити користувальницький стек TCP, в якому прослуховування або підключення з порту 0 працює, а це означає, що дві такі реалізації могли поговорити один з одним на порт 0.
Джошуа

Відповіді:


60

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


Це схоже на ту ж ідею, що і адреса 0.0.0.0 в ipv4. Зарезервоване значення, яке використовується ОС і програмами спеціального призначення. Як аналогія, в радіо є зарезервовані частоти, які ніхто не використовує для передач, але використовуються всередині обладнання.
ctrl-alt-delor

1
@richard ні, 0.0.0.0 має інше значення;) використовується для позначення недійсної, невідомої або непридатної цілі або як "трансляція"
AndreaCi

2
@AndreaCi не транслювався 255.255.255.255?
щурячий вирод

4
@ratchetfreak транслюється 255.255.255.255. 0.0.0.0 має два значення в залежності від контексту. У програмуванні це синонім w / INADDR_ANY, на що звертається Річард (система замінить його за замовчуванням). Але насправді використання адреси в мережі, схоже, має наслідки, про які згадує Андреа (за винятком не настільки ясного, що це вважається "трансляцією"): en.wikipedia.org/wiki/0.0.0.0
goldilocks


5

Використання порту 0 запускає операційну систему для пошуку та виділення наступного доступного порту. Це дозволяє уникнути жорсткого кодування певного порту або пошуку потрібного порту. Моя Mint Linux повертається

nc: port range not valid

до

nc localhost 0 

2

nc -l 0попросить ОС прослухати порт 0. Але, як було зазначено вище, більшість операційних систем побачить 0 і посилатиметься на свої особливості вибору порту з додатковою нумерацією для вашої програми, тому ncзавершується прослуховування на деяких портах, таких як 56514.


Більшість операційних систем буде гаразд, а що ні?
барлоп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.