Questão Por que ping 192.168.072 (apenas 2 pontos) retorna uma resposta de 192.168.0.58?


Eu erradamente perdi o ponto fora de um endereço IP e digitei 192.168.072.
Para minha surpresa, conectei-me a uma máquina 192.168.0.58

Se eu pingar 192.168.072 Eu recebo respostas de 192.168.0.58.

Por que é isso?


Eu estou em um PC com Windows em um domínio do Windows.


Se eu pingar 192.168.72 Eu recebo uma resposta de 192.168.0.72, parece que o 0 dentro 072 (no meu erro original) é significativo.


Esta questão foi uma Pergunta de super usuário da semana.
Leia o entrada de blog para mais detalhes ou contribuir para o blog você mesmo


370


origem


Relevante:  blog.superuser.com/2012/02/10/wtfriday-http2915189091 - Tom Wijsman
Curiosamente, exatamente a mesma coisa acontece no Linux: ping 192.168.072 impressões PING 192.168.072 (192.168.0.58) 56(84) bytes of data.[...]. - Mechanical snail
o que é ainda mais aleatório é que você tinha uma máquina em 192.168.0.58 para obter uma resposta. Quais são as chances disso? - KronoS
@ CronoS na verdade não é tão estranho se você está em uma escola ou rede da empresa. Alguns servidores DHCP fornecerão endereços em ordem crescente e a maioria deles será usada. - Taum
192.168.0.58 é o tempo limite para mim .. pode todos os pedidos de ping de alguma forma nocautearam o servidor ?! - iamserious


Respostas:


Todo mundo está complicando demais com RFCs, classes IP e coisas do tipo. Basta executar alguns testes para ver como o ping comando analisa a entrada IP pelo usuário (chaff externo removido):

> ping 1
Pinging 0.0.0.1 with 32 bytes of data:

> ping 1.2
Pinging 1.0.0.2 with 32 bytes of data:

> ping 1.2.3
Pinging 1.2.0.3 with 32 bytes of data:

> ping 1.2.3.4
Pinging 1.2.3.4 with 32 bytes of data:

> ping 1.2.3.4.5
Ping request could not find host 1.2.3.4.5. Please check the name and try again.

> ping 255
Pinging 0.0.0.255 with 32 bytes of data:

> ping 256
Pinging 0.0.1.0 with 32 bytes of data:

Como você pode ver, o ping comando (no Windows) permite que você use diferentes formatos de endereço IP. Um endereço IPv4 pode ser dividido em quatro partes (“quadra pontilhada”) da seguinte forma: A.B.C.D, e as ping comando permite que você deixe alguns para fora, preenchendo um padrão de 0 do seguinte modo:

1 part  (ping A)       : 0.0.0.A
2 parts (ping A.B)     : A.0.0.B
3 parts (ping A.B.C)   : A.B.0.C
4 parts (ping A.B.C.D) : A.B.C.D

Se você fornecer apenas uma única parte, então se ela estiver abaixo de 255 (o máximo de um octeto), ela será tratada como um octeto como acima, mas se for maior que 255, ela será convertida e rolada para o próximo campo. (isto é, mod 256).

Existem alguns casos extremos, como fornecer mais de quatro partes que parecem não funcionar (por exemplo, google.comIP do IP não funcionará 0.74.125.226.4 ou 74.125.226.4.0).

Você também pode usar a notação hexadecimal em forma quadriculada e plana pontilhada, mas deve formatá-la por pré-pendente 0x para cada octeto.


Portanto, existem várias maneiras de representar um endereço IP (IPv4). Você pode usar o formato quádruplo plano ou pontilhado (ou pontilhado-triplo, pontilhado-duplo ou até mesmo pontilhado-único), e para cada um, você pode usar (ou mesmo misturar e combinar) decimal, octal e hexadecimal. Por exemplo, você pode pingar google.com das seguintes maneiras:

  • google.com(nome do domínio)
  • 74.125.226.4(decimal pontilhado)
  • 1249763844(decimal plano)
  • 0112.0175.0342.0004(pontilhado octal)
  • 011237361004(octal plano)
  • 0x4A.0x7D.0xE2.0x04(hexadecimais pontuados)
  • 0x4A7DE204(hex plana)
  • 74.0175.0xe2.4(ಠ_ಠ)

(Graças a Deus que o suporte de notação binária não foi adicionado!)


Aplicação:

No seu caso, ping 192.168.072 usa o terceiro formato na tabela acima (A.B.0.C), então você está realmente pingando 192.168.0.072. Além disso, como você tem um zero à esquerda na última parte, ele é tratado como octal, que em decimal é 58.

Mistério resolvido.


Note que enquanto o Windows ping O comando permite uma variedade tão grande de formatos para a entrada e interpreta formatos não-padrão nas formas vistas, o que não significa necessariamente que você pode usar esses formatos em todos os lugares. Alguns programas podem forçá-lo a fornecer todas as quatro partes de um bloco pontilhado, outros podem não permitir a mistura e a correspondência de decimal e octal e assim por diante.

Além disso, os endereços IPv6 complicam ainda mais a lógica de análise e a aceitabilidade do formato de entrada.


Termo aditivo:

syss apontou se você usar um caractere inválido em um dos números (por exemplo, um 8 ou 9 ao usar octal, um g no modo hexadecimal, etc.) ping é inteligente o suficiente para reconhecer isso e interpretá-lo como uma URL de cadeia (-al? -ic?) em vez de como um endereço IP numérico.

(Como alguém que teve inúmeros aneurismas e ataques cardíacos tentando escrever código supostamente “simples” para acomodar o número exponencialmente explosivo de permutações de valores de dados, eu aprecio que - parece - processar corretamente todas as variações de entrada; caso, pelo menos 31+32+33+34=120 variações.)

Então, enquanto especificando 010.020.030.040 vai pingar 8.16.24.32 como esperado, passando 010.020.030.080 para ping será tratado como um URL em vez de um endereço IP - como foo.bar.baz.com que poderia (mas infelizmente não existe). Em outras palavras, ele tenta fazer ping no subdomínio 010 no subdomínio 020 no domínio 030 no domínio de nível superior 080. No entanto, desde 080 não é um TLD válido (como .com, .nete seus amigos), a conexão falha logo no primeiro passo.

A mesma coisa acontece com 090.010.010.010 onde o caractere inválido está em um octeto diferente. Da mesma forma, 0xf.0xf.0xf.0xf pings 15.15.15.15, mas 0xh1.0x1.0xg0.0f falha.

Bem, acho que é isso que você recebe por não ser fluente em várias bases numéricas.

É provavelmente mais fácil e seguro garantir que você sempre use endereços de quatro pontos pontilhados ("40q"? "Quaddy-quad"? "Cutie-q"?).

Então vá em frente e aprenda algumas bases numéricas. Você poderá se mostrar e ser a vida das festas e, como dizem, há dez tipos de pessoas: as que conhecem o binário e as que não conhecem.

Não vamos nem pensar sobre endereços IPv6; Eu acho que eles são um dos 111 selos !!!


565



Supercomplicação? A experimentação pode ser muito útil e, neste caso, produziu uma boa resposta; mas sem uma teoria ou documentação ou padrões, você pode perder um fator crítico e não conhecê-lo. Ou você pode estar determinando como uma determinada versão funciona e estar errado sobre 90% das implementações disponíveis. Ou você pode criar regras que expliquem os resultados de seus experimentos, mas sejam mais complicadas do que as regras pretendidas. Nesse caso, acho que as regras das documentações (por inet_aton()) são mais simples em um aspecto - não há condições para "under / over 255". - LarsH
Ei olha! A parte "ciência" da Ciência da Computação faz uma aparição! (hipotetizar, experimentar, verificar) - Izkata
@LarsH, esse é o meu ponto, que o ping comando (pelo menos no Windows) é como muitos dos programas da Microsoft (especialmente o notório) IE. Ele tenta ser perdoador demais e pegar qualquer coisa que você jogue e tente interpretá-lo. Sim, há um documento oficial sobre formatos de endereço IP, mas isso não é uma questão sobre ISOs e RFCs, é prático, Eu fiz alguma coisa e está sendo estranho questão que pode ser respondida sem recorrer a (especificações técnicas reconhecidamente longas, secas e entediantes) - embora ligar-se a elas caso o OP queira lê-las também é bom. - Synetech
A análise octal pré-fixada em 0 deve ser completamente abandonada, exceto por chmod. É isso aí. Essa é a única exceção para o octal permitido. Período. - James Dunne
é útil para conversão de RGB HEX para DEC. lol ~ C:\>ping 0xffffcc  Pinging 0.255.255.204 with 32 bytes of data: - wilson


Há duas razões para isso:

Primeiro, um prefixo '0' indica octal número. Desde oct (072) = dec (58), 192.168.072 = 192.168.58.

Segundo, o penúltimo a zero pode ser eliminado dos endereços IP como um forma abreviada. 127.0.1 é interpretado como 127.0.0.1 e, no seu caso, 192.168.58 é interpretado como 192.168.0.58.


147



Não agrupa zeros. Na verdade, trata cada ponto como um separador correspondente ao próximo limite de bytes. Assim, os endereços IP 2130706433 e 127.0.0.1 são os mesmos endereços. - Serge
a notação x.x.x.x para números de 32 bits tem um nome? Ele pode ser usado / útil em outros domínios, mas eu não posso google-lo :) edit: nevermind, é a notação ponto-decimal - Guillaume86
mais precisamente é a notação com quatro pontos no caso de um endereço IP - Guillaume86
O famoso zero líder atingiu mais uma vez o tempo! - Luc M
agora esta é a verdadeira resposta! - l--''''''---------''''''''''''


Além do importante ponto de @ neu242 sobre a notação octal e a observação de que os endereços IP podem ser encurtados, a outra parte importante é saber como os endereços IP abreviados são interpretados.

Pode-se supor ingenuamente que, se alguns dos quatro números estiverem faltando, o analisador adicionará bytes preenchidos com zero ao final (ou ao início) da sequência de bytes. Mas isso não corresponde ao comportamento relatado pelo OP: 192.168.072 foi analisado como 192.168.0.58, não como 192.168.58.0nem 0.192.168.58.

Aparentemente, o ping do Windows e do Linux (a versão que você tentou e as que eu tentei) usam algo equivalente a inet_aton () para analisar o argumento do endereço IP. o Página de manual para inet_aton ()diz:

The address supplied in cp can have one of the following forms:

 a.b.c.d   Each of the four numeric parts specifies a byte of the address; the
           bytes are assigned in left-to-right order to produce the binary
           address.

 a.b.c     Parts a and b specify the first two bytes of the binary address.
           Part c is interpreted as a 16-bit value that defines the rightmost
           two bytes of the binary address.  This notation is suitable for
           specifying (outmoded) Class B network addresses.

 a.b       Part a specifies the first byte of the binary address.  Part b is
           interpreted as a 24-bit value that defines the rightmost three bytes
           of the binary address.  This notation is suitable for specifying
           (outmoded) Class C network addresses.

 a         The value a is interpreted as a 32-bit value that is stored directly
            into the binary address without any byte rearrangement.

Então você tem isso ... 192.168.072 se encaixa no padrão a.b.c, então o 072 (após a análise como um número octal) foi interpretado como um valor de 16 bits que define os 2 bytes mais à direita do endereço binário, equivalente a 0.58.

As regras acima são equivalentes a dizer que, se algum dos quatro números estiver faltando, os bytes preenchidos com zero necessários serão adicionados. imediatamente antes do último número dado... não no final nem no início da cadeia de bytes. (Expressar desta forma funciona se o último número dado for menor que 256.)

Observe que versões mais recentes do ping podem não permitir esse tipo de atalho, nem a interpretação octal. o Código fonte 2010 para iputils (incluindo ping) que eu encontrei usa inet_pton () ao invés de inet_aton () para analisar o argumento do endereço IP. o Página de manual para inet_pton ()diz:

Ao contrário de inet_aton (3) e inet_addr (3), inet_pton () suporta endereços IPv6. Em   Por outro lado, inet_pton () só aceita endereços IPv4 em notação decimal com pontos,   enquanto inet_aton (3) e inet_addr (3) permitem que o mais geral   notação de números e pontos (formatos de números hexadecimais e octal, e   formatos que não exigem que todos os quatro bytes sejam escritos explicitamente).


97



Esta é de longe a melhor resposta IMHO. - Josh
No Windows, você está procurando inet_addr em Winsock. - user7116


Você tem que considerar também que um ip pode ser representado por inteiros somados em significância à sua posição.

192.168.0.58 is :
  192 * 256^3
+ 168 * 256^2
+   0 * 256^1
+  58 * 256^0

Aqui está a coisa legal:

192.168.58 será 192.168.0.58 porque

    0 * 256^1 
+  58 * 256^0 
=  58

192.11010106 também será 192.168.0.58 porque

  168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 11010106

3232235578 também será 192.168.0.58 porque

  192 * 256^3 
+ 168 * 256^2 
+   0 * 256^1 
+  58 * 256^0 
= 3232235578

25



"192.168.56 será 192.168.0.56 porque 0 * 256 ^ 1 + 58 * 256 ^ 0 = 58" Tem certeza? Você esperaria que 168 fosse multiplicado por 256 ^ 1 no primeiro caso e por 256 ^ 2 no segundo caso. Similarmente 192 seria multiplicado por 256 ^ 2 vs. 256 ^ 3. Então 192.168.56 só poderia = 192.168.0.56 se houvesse regras adicionais em vigor, como a queda de zeros. - LarsH
@LarsH, acho que o que está sendo dito aqui é que é baseado na esquerda para a direita, ao contrário da contagem "normal", onde baseamos tudo do lugar do 1. Então o primeiro ponto faz com que o que estiver à esquerda seja multiplicado por 256 ^ 3, o segundo por 256 ^ 2, o terceiro por 256. Se não houver um ponto à esquerda dele, ele é adicionado sem multiplicar por 256 ^ n. Então, 1.2.3. (1.2.3.0) seria diferente do que 1.2.3 (1.2.0.3), se bem entendi. - iX3
@ iX3: se fosse esse o caso, então "192.168.56 seria 192.168.0.56" estaria incorreto, porque no primeiro caso, 56 seria multiplicado por 256 ^ 1, enquanto no segundo caso, 56 seria apenas multiplicado y 256 ^ 0. E o OP 192.168.072 seria interpretado como 192.168.58.0 em vez de 192.168.0.58. - LarsH
O que é um pouco enganador é o fato de que o endereço tem 0 tem o terceiro dígito. Considere este endereço 192.168.1.56 O formulário de 3 dígitos seria 192.168.312 Porque 1 * 256 ^ 1 + 56 * 256 ^ 0 é 312 - vesquam
Os pontos servem apenas para delinear quais números devem ser multiplicados por cada potência de 256. O analisador procura o primeiro ponto e multiplica o número antes dele por 256 ^ 3. Repita para o 2º e 3º ponto, mas por 256 ^ 2 e 256 ^ 1, respectivamente. Em seguida, ele adiciona todos os resultados juntos (alguns impl. Podem manter um total em execução, embora o resultado seja o mesmo). Se algum desses pontos estiver faltando, simplesmente não faz a multiplicação e apenas adiciona o número final ao total corrente. É também por isso 1.2.3. resulta em um erro, porque o analisador não pode encontrar o último número para adicionar ao total. - Justin ᚅᚔᚈᚄᚒᚔ