Por engano, perdi o ponto de um endereço IP e digitei 192.168.072
.
Para minha surpresa, conectei-me a uma máquina em192.168.0.58
Se eu fizer ping 192.168.072
, recebo respostas de 192.168.0.58
.
Por que é isso?
Estou em um PC com Windows em um domínio do Windows.
Se eu fizer ping 192.168.72
, recebo uma resposta de 192.168.0.72
, então parece que o 0
in 072
(no meu erro original) é significativo.
Esta pergunta foi uma pergunta da semana para superusuários .
Leia a entrada do blog para obter mais detalhes ou contribua com o blog você mesmo
ip
ping
ip-address
George Duckett
fonte
fonte
ping 192.168.072
impressõesPING 192.168.072 (192.168.0.58) 56(84) bytes of data.
[...].192.168.0.58
para obter uma resposta. Quais são as chances disso?192.168.0.58
está atingindo o tempo limite para mim .. todos os pedidos de ping podem de alguma forma nocautear o servidor ?!Respostas:
Todo mundo está complicando demais com RFCs, classes de IP e outras coisas. Simplesmente execute alguns testes para ver como o
ping
comando analisa a entrada IP pelo usuário (remoção estranha de palha):Como você pode ver, o
ping
comando (no Windows) permite usar diferentes formatos de endereço IP. Um endereço IPv4 pode ser dividido em quatro partes (“dotted-quad”) da seguinte maneira:A.B.C.D
e oping
comando permite que você deixe de fora alguns, preenchendo o padrão da0
seguinte maneira:Se você fornecer apenas uma peça, se estiver abaixo de 255 (o máximo para um octeto), ela será tratada como um octeto como acima, mas se for maior que 255, será convertida e rolada para o próximo campo (ou seja
mod 256
).Existem alguns casos extremos, como fornecer mais de quatro partes não parece funcionar (por exemplo,
google.com
o IP do ping não funcionará para um0.74.125.226.4
ou outro74.125.226.4.0
).Você também pode usar a notação hexadecimal na forma de quad-dotted e flat, mas deve formatá-la pré-pendente
0x
para cada octeto.Portanto, existem várias maneiras de representar um endereço IP (IPv4). Você pode usar o formato plano ou quadriculado (ou pontilhado triplo, pontilhado duplo ou mesmo pontilhado único) e, para cada um, pode usar (ou até misturar e combinar) decimal, octal e hexadecimal. Por exemplo, você pode executar ping
google.com
das seguintes maneiras:google.com
(nome do domínio)74.125.226.4
(decimal pontilhado)1249763844
(decimal simples)0112.0175.0342.0004
(octal pontilhado)011237361004
(octal plano)0x4A.0x7D.0xE2.0x04
(hexadecimal pontilhado)0x4A7DE204
(hexágono plano)74.0175.0xe2.4
(ಠ_ಠ)(Graças a Deus que o suporte à notação binária não foi adicionado!)
Aplicação :
No seu caso, o ping
192.168.072
usa o terceiro formato na tabela acima (A.B.0.C
), então você está realmente pingando192.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.
Observe que, embora o
ping
comando do Windows permita uma variedade tão grande de formatos para a entrada e interprete formatos fora do padrão da maneira vista, isso não significa necessariamente que você possa usar esses formatos em qualquer lugar. Alguns programas podem forçar você a fornecer todas as quatro partes de um quadriculado pontilhado, outros podem não permitir a mistura e correspondência de decimal e octal, e assim por diante.Além disso, os endereços IPv6 complicam ainda mais a aceitabilidade da lógica de análise e do formato de entrada.
Adendo :
syss apontou que, se você usar um caractere inválido em um dos números (por exemplo, um
8
ou9
ao usar octal, ag
no modo hexadecimal etc.), entãoping
é inteligente o suficiente para reconhecer isso e interpretá-lo como uma string (-al? URL em vez de como um endereço IP numérico.(Como alguém que teve vários 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 ele parece processar corretamente todas as variações de entrada; caso, pelo menos 3 1 +3 2 +3 3 +3 4 = 120 variações.)
Portanto, ao especificar
010.020.030.040
o ping8.16.24.32
como esperado, a passagem010.020.030.080
paraping
será tratada como uma URL em vez de um endereço IP - como ofoo.bar.baz.com
que poderia (mas infelizmente não existe). Em outras palavras, ele tenta executar ping no subdomínio010
no subdomínio020
no domínio030
no domínio de nível superior080
. No entanto, como080
não é um TLD válido (como.com
,.net
e seus amigos), a conexão falha logo na primeira etapa.O mesmo acontece com
090.010.010.010
o caractere inválido em um octeto diferente. Da mesma forma,0xf.0xf.0xf.0xf
pings15.15.15.15
, mas0xh1.0x1.0xg0.0f
falha.Bem, acho que é isso que você ganha por não ser fluente em várias bases de números.
Provavelmente é mais fácil e seguro garantir sempre o uso de endereços com quatro pontos pontilhados ("40q"? "Quaddy-quad"? "Cutie-q"?).
Então vá em frente e aprenda algumas bases numéricas . Você será capaz de se exibir e ser a vida das festas e, como se costuma dizer, existem 10 tipos de pessoas: quem conhece binário e quem não conhece.
Não vamos nem pensar em endereços IPv6; Eu acho que eles são um dos 111 selos !!!
fonte
inet_aton()
) são mais simples em um aspecto - sem condicionais para "abaixo / acima de 255".ping
comando (pelo menos no Windows) é como muitos dos programas da Microsoft (especialmente o notório) IE. Ele tenta perdoar demais, pega tudo o que você joga e tenta interpretá-lo. Sim, existe um documento oficial sobre os formatos de endereço IP, mas isso não é uma pergunta sobre ISOs e RFCs, é prático, fiz algo e está sendo uma pergunta estranha que pode ser respondida sem recurso a (reconhecidamente longo, seco, chato especificações técnicas) - embora seja bom vinculá-las caso o OP queira lê-las também.chmod
. É isso aí. Essa é a única exceção para octal permitida. Período.C:\>ping 0xffffcc
Pinging 0.255.255.204 with 32 bytes of data:
Há duas razões para isso:
Primeiro, um prefixo '0' indica um número octal . Desde outubro (072) = dec (58), 192.168.072 = 192.168.58.
Segundo, o penúltimo 0 pode ser eliminado dos endereços IP como uma abreviação . 127.0.1 é interpretado como 127.0.0.1 e, no seu caso, 192.168.58 é interpretado como 192.168.0.58.
fonte
Além do ponto importante do @ neu242 sobre a notação octal e a observação de que os endereços IP podem ser encurtados, a outra parte crítica é saber como os endereços IP encurtados são interpretados.
Pode-se adivinhar ingenuamente que se alguns dos quatro números estiverem ausentes, o analisador adicionará bytes preenchidos com zero no final (ou no 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. 0 , nem 0, 192.168.58.
Aparentemente, o ping do Windows e Linux (a versão que você tentou e a que tentei) usa algo equivalente a inet_aton () para analisar o argumento do endereço IP. A página de manual para inet_aton () diz:
Então aí está ...
192.168.072
se encaixa no padrão abc, então o072
(depois de analisar 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 a0.58
.As regras acima são equivalentes a dizer que, se algum dos quatro números estiver faltando, os bytes necessários preenchidos com zero serão adicionados imediatamente antes do último número fornecido ... não no final nem no início da sequência de bytes. (Expressá-lo dessa maneira funciona se o último número fornecido for menor que 256.)
Observe que versões mais recentes do ping podem não permitir esse tipo de abreviação, nem a interpretação octal. O código-fonte de 2010 para iputils (incluindo ping) que encontrei usa inet_pton () em vez de inet_aton () para analisar o argumento do endereço IP. A página de manual para inet_pton () diz:
fonte
inet_addr
no Winsock.Você deve considerar também que um ip pode ser representado por números inteiros somados em significado à sua posição.
Aqui está a coisa legal:
192.168.58 será 192.168.0.58 porque
192.11010106 também será 192.168.0.58 porque
3232235578 também será 192.168.0.58 porque
fonte
1.2.3.
resulta em um erro, porque o analisador não consegue encontrar o último número a ser adicionado ao total.