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.c
em 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ê nc
está 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.