É possível conectar-se à porta TCP 0?

55

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

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

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

Onde no sistema isso é tratado? Na pilha TCP do kernel do sistema operacional? Existem Unixes onde a conexão com a porta TCP 0 funcionaria?

    
por nh2 22.01.2015 / 16:49

3 respostas

56

Apenas para ter certeza de 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á realmente ouvindo depois da solicitação não é zero. Há um comentário sobre isso em [linux kernel source]/net/ipv4/inet_connection_sock.c on 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 permitam o uso da porta 0, mas isso seria considerado uma prática ruim. Esse comportamento não é especificado oficialmente pelo POSIX, IANA ou pelo protocolo TCP. 1 Você pode encontrar isso é interessante .

É por isso que você não pode fazer uma conexão TCP com segurança para a porta zero. Presumivelmente, nc está ciente disso e informa que você está fazendo uma solicitação não sensitiva. Se você tentar isso em 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 se conectar a qualquer outra porta indisponível: ECONNREFUSED , "Conexão recusada". Então, em resposta a:

Where in the system is this handled? In the TCP stack of the OS kernel?

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

1. Mas a IANA faz referenciá-lo como "Reservado" ( veja aqui ). Ou seja, essa porta não deve ser usada online. Isso faz tudo certo com relação à convenção de atribuição dinâmica (já que ela não será realmente usada). Estipular que especificamente como um propósito provavelmente estaria além do escopo da IANA; em essência, os sistemas operacionais são livres para fazer o que quiserem com isso, inclusive nada.

    
por 22.01.2015 / 17:54
5

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

nc: port range not valid

para

nc localhost 0 
    
por 22.01.2015 / 18:05
2

nc -l 0 pedirá ao sistema operacional para escutar na porta 0. Mas como já foi dito acima, a maioria dos sistemas operacionais verá o 0 e invocará seus costumes particulares para escolher uma porta com numeração positiva para seu aplicativo, portanto nc acaba ouvindo em alguma porta como 56514.

    
por 05.11.2015 / 20:55