É possível conectar à porta TCP 0?

59

Ouvir a porta TCP 0 me aloca um número de porta livre no sistema.

Mas o que acontece quando tento conectar-me à porta TCP 0? A resposta óbvia é: "Não funciona":

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

Onde isso é tratado no sistema? Na pilha TCP do kernel do SO? Existem Unixes em que a conexão à porta TCP 0 funcionaria?

nh2
fonte
2
Em teoria, você poderia construir uma pilha costume TCP em que escutando ou de conexão da porta 0 obras, o que significa que duas dessas implementações poderia falar um com o outro na porta 0.
Joshua

Respostas:

60

Apenas para garantir que estamos na mesma página (sua pergunta é ambígua dessa maneira), pedir para ligar o TCP na porta 0 indica uma solicitação para gerar dinamicamente um número de porta não utilizado. Em outras palavras, o número da porta na qual você está ouvindo após a solicitação não é zero. Há um comentário sobre isso em [linux kernel source]/net/ipv4/inet_connection_sock.cem 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.
 */

Qual é uma convenção unix padrão. Pode haver sistemas que realmente permitam o uso da porta 0, mas isso seria considerado uma má prática. Esse comportamento não é especificado oficialmente pelo POSIX, IANA ou pelo protocolo TCP, no entanto. 1 Você pode achar isso interessante .

É por isso que você não pode estabelecer uma conexão TCP sensata com a porta zero. Presumivelmente, você ncestá ciente disso e informa que você está fazendo uma solicitação não sensorial. Se você tentar isso no código nativo:

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));
}    

Você recebe o mesmo erro que tentaria conectar a qualquer outra porta indisponível:, ECONNREFUSED"Conexão recusada". Então, em resposta a:

Onde isso é tratado no sistema? Na pilha TCP do kernel do SO?

Provavelmente não; não requer tratamento especial. Ou seja, se você puder encontrar um sistema que permita a ligação e a escuta na porta 0, presumivelmente poderá se conectar a ele.


1. Mas a IANA se refere a ela como "Reservada" ( veja aqui ). Ou seja, essa porta não deve ser usada online. Isso o torna aceitável em relação à convenção de atribuição dinâmica (já que ela não será realmente usada). Estipular que especificamente como um objetivo provavelmente estaria além do escopo da IANA; Em essência, os sistemas operacionais são livres para fazer o que quiserem, incluindo nada.

Cachinhos Dourados
fonte
Parece a mesma idéia que o endereço 0.0.0.0 no ipv4. Um valor reservado e usado pelo SO e programas para uma finalidade especial. Como analogia, no rádio há frequências reservadas que ninguém usa para transmissões, mas são usadas internamente em equipamentos.
CTRL-ALT-DELOR
11
@ Richard não, 0.0.0.0 tem um significado diferente;) é usado para designar um alvo aplicável inválida, desconhecida ou não ou como "broadcast"
AndreaCi
2
@AndreaCi não foi transmitido 255.255.255.255?
catraca aberração
4
@ratchetfreak 255.255.255.255 é transmitido. 0.0.0.0 tem dois significados, dependendo do contexto. Na programação, é sinônimo w / INADDR_ANY, que é o que Richard está se referindo (o sistema o substituirá por um padrão). Mas, na verdade, usar o endereço em uma rede parece ter as implicações que Andrea menciona (exceto que não tão claro que seja considerado "transmissão"): en.wikipedia.org/wiki/0.0.0.0
goldilocks
5

O uso da porta 0 aciona o sistema operacional para procurar e alocar a próxima porta disponível. Isso evita que você precise codificar permanentemente uma porta específica ou procurar uma porta disponível. Meu sistema Linux Mint retorna

nc: port range not valid

para

nc localhost 0 
MichaelJohn
fonte
2

nc -l 0solicitará que o sistema operacional escute na porta 0. Mas, como foi observado acima, a maioria dos sistemas operacionais verá o 0 e invocará seus costumes específicos para escolher uma porta de número positivo para o seu aplicativo, portanto, ncacabará escutando em uma porta como 56514.

MC17
fonte
a maioria dos sistemas operacionais vai, ok, quais não?
barlop