A conexão ao IP 0.0.0.0 foi bem-sucedida. Quão? Por quê?

41

Estamos atendendo uma porta no host local e queremos verificar outro processo se a porta estiver disponível. Devido a um erro no nosso código, ele está realmente tentando se conectar ao IP 0.0.0.0:<port>e, por algum motivo, é bem-sucedido - como o strace prova:

[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]

O que isso significa? Por que isso funciona?

erikbwork
fonte

Respostas:

68

0.0.0.0 como endereço de destino refere-se de várias maneiras a um host não roteável ou a "este host" . Na prática, conectar-se ao 0.0.0.0 é equivalente a conectar-se ao host local. (A rigor, não é válido como endereço de destino, apenas como endereço de origem, mas a prática não corresponde à teoria.)

Ao vincular, "este host" se expande para "qualquer endereço nesse host" - portanto, os aplicativos geralmente aceitam conexões vinculando-se a 0.0.0.0, o que significa que receberão pacotes endereçados a qualquer endereço IPv4 no sistema.

Stephen Kitt
fonte
7
Para estender um pouco essa resposta - significa "qualquer endereço IP neste sistema, incluindo IPs que foram adicionados após o início do processo de escuta"
#
5
localhost é um endereço único, principalmente 127.0.0.1, enquanto 0.0.0.0 significa todos os endereços nesse host.
Rexkogitans
@rexkogitans localhost não é um único endereço, mas qualquer endereço no intervalo 127.0.0.0/8 - ou seja, qualquer endereço de 127.0.0.0 a 127.255.255.255
Dezza
6
@Dezza Não, localhost é 127.0.0.1. 127.0.0.0/8 (como você diz, também conhecido como 127.0.0.0 a 127.255.255.255) é um loopback na maioria dos equipamentos, por exemplo, documentado pela página 4 da RFC 5735 . (Curiosamente, alguns equipamentos da Cisco podem atribuir loopback a qualquer endereço, mas o padrão é não oferecer suporte a loopback. Não é provável que isso afete outros equipamentos na rede.) No entanto, localhost é um nome, geralmente apontando apenas para um único endereço 127.0.0.1 e geralmente implementado usando um arquivo "hosts". Então, eu discordo de sua tentativa de correção.
TOOGAM 27/01
Você poderia esclarecer o que quer dizer com "não é válido como endereço de destino, apenas como endereço de origem"? Quando o servidor mysql escuta em 0.0.0.0, o destino ou a fonte do endereço? Não é o destino de uma solicitação enviada de um cliente mysql?
Tim