Aby upewnić się, że jesteśmy na tej samej stronie (twoje pytanie jest w ten sposób dwuznaczne), pytanie o powiązanie TCP na porcie 0 oznacza żądanie dynamicznego wygenerowania nieużywanego numeru portu. Innymi słowy, numer portu, którego faktycznie słuchasz po tym żądaniu, nie jest równy zero. Jest komentarz na ten temat w [linux kernel source]/net/ipv4/inet_connection_sock.c
sprawie 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.
*/
Która jest standardową konwencją unixową. Mogą istnieć systemy, które faktycznie pozwolą na użycie portu 0, ale byłoby to uważane za złą praktykę. Jednak takie zachowanie nie jest oficjalnie określone przez POSIX, IANA ani protokół TCP. 1 Może Cię to zainteresować .
Dlatego nie można rozsądnie nawiązać połączenia TCP z portem zero. Prawdopodobnie nc
jest tego świadomy i informuje Cię, że składasz niemądre żądanie. Jeśli spróbujesz w natywnym kodzie:
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));
}
Otrzymujesz ten sam błąd, który chciałbyś połączyć z innym niedostępnym portem ECONNREFUSED
:, „Odmowa połączenia”. W odpowiedzi na:
Gdzie w systemie jest to obsługiwane? W stosie TCP jądra systemu operacyjnego?
Prawdopodobnie nie; nie wymaga specjalnej obsługi. To znaczy, jeśli możesz znaleźć system, który umożliwia wiązanie i nasłuchiwanie na porcie 0, prawdopodobnie możesz się z nim połączyć.
1. Ale IANA nie odnoszą się do niego jako „Zastrzeżone” ( patrz tutaj ). Oznacza to, że ten port nie powinien być używany online. To sprawia, że jest to w porządku w odniesieniu do konwencji przypisywania dynamicznego (ponieważ tak naprawdę nie będzie używana). Ustalenie, że konkretnie jako cel prawdopodobnie wykraczałoby poza zakres IANA; w istocie systemy operacyjne mogą robić z nim, co chcą, w tym nic.