Czy można połączyć się z portem TCP 0?

59

Słuchanie portu TCP 0 przydziela mi wolny numer portu w systemie.

Ale co się stanie, gdy spróbuję połączyć się z portem TCP 0? Oczywista odpowiedź brzmi: „To nie działa”:

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

Gdzie w systemie jest to obsługiwane? W stosie TCP jądra systemu operacyjnego? Czy istnieją systemy uniksowe, w których działałoby połączenie z portem TCP 0?

nh2
źródło
2
Teoretycznie można zbudować niestandardowy stos TCP, w którym działa nasłuchiwanie lub połączenie z portu 0, co oznacza, że ​​dwie takie implementacje mogą ze sobą rozmawiać na porcie 0.
Joshua

Odpowiedzi:

60

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.csprawie 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 ncjest 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.

Złotowłosa
źródło
Wygląda jak ten sam pomysł jak adres 0.0.0.0 w ipv4. Wartość zastrzeżona, używana przez system operacyjny i programy do specjalnego celu. Analogicznie w radiu są częstotliwości zarezerwowane, których nikt nie używa do transmisji, ale są wykorzystywane wewnętrznie w sprzęcie.
ctrl-alt-delor
1
@richard no, 0.0.0.0 ma inne znaczenie;) służy do oznaczania nieprawidłowego, nieznanego lub
nieobowiązującego
2
@AndreaCi nie była nadawana 255.255.255.255?
maniak zapadkowy
4
@ratchetfreak 255.255.255.255 jest nadawany. 0.0.0.0 ma dwa znaczenia w zależności od kontekstu. W programowaniu jest synonimem w / INADDR_ANY, do czego odnosi się Richard (system zastąpi go domyślnym). Ale korzystanie z adresu w sieci wydaje się mieć implikacje, o których wspomina Andrea (z wyjątkiem nie tak wyraźnych, że liczy się to jako „transmisja”): en.wikipedia.org/wiki/0.0.0.0
goldilocks
5

Użycie Portu 0 powoduje, że system operacyjny wyszukuje i przydziela następny dostępny port. Pozwala to uniknąć konieczności kodowania określonego portu lub szukania dostępnego portu. System My Mint Linux powraca

nc: port range not valid

do

nc localhost 0 
Michael John
źródło
2

nc -l 0poprosi system operacyjny, aby nasłuchiwał na porcie 0. Ale jak wspomniano powyżej, większość systemów operacyjnych zobaczy 0 i przywoła swoje szczególne zwyczaje dotyczące wyboru portu o numerze dodatnim dla twojej aplikacji, więc nckończy się nasłuch na jakimś porcie, takim jak 56514.

MC17
źródło
większość systemów operacyjnych, ok, a które nie?
barlop