Os endereços IP com e sem zeros à esquerda são iguais?


90

Eu tenho um sistema de segurança e a configuração de rede permite apenas um endereço IP de três dígitos. Não posso configurá-lo para 192.168.2.100, em vez disso, tenho que usá-lo 192.168.002.100.

Esses dois endereços IP são diferentes? Preciso definir a LAN do meu roteador para que tudo 192.168.xxx.xxxfuncione corretamente? Não consigo encontrar nenhuma informação sólida sobre isso.


16
De acordo com as respostas abaixo, 192.168.020.100 não deve ser o mesmo que 192.168.20.100, mas pode ser o mesmo se o seu sistema permitir que os IPs sejam inseridos dessa maneira (vi isso nas copiadoras quando o IP é digitado por dígito por dígito com as setas para cima e para baixo). - Se o seu sistema tiver essa peculiaridade, mesmo quando a entrada "normal" do teclado for possível (por exemplo, você pode digitar todas as entradas 192.168.2.100, mas ela reclama), sugiro que você tenha uma palavra com o fornecedor (quão confiável é o sistema de segurança se a validação de entrada for é tão ruim?)
Hagen von Eitzen

4
Essa é realmente uma validação bastante bizarra. Eu trocaria os sistemas de segurança, como o @Hagen faz alusão.
Lightness Races in Orbit

2
Isso também pode ser específico do software. Eles são válidos com ou sem os principais 0s, mas eu já encontrei alguns aplicativos que não suportam um endereço IP que não tinha três dígitos em cada octeto.
Ps2goat

2
Todos os endereços IP (v4) são realmente apenas 32 bits representados de uma maneira agradável. Se 192.168.002.100é assim que sua ferramenta representa 0xc0a80264/ 3232236132 / 192.168.2.100, então é a mesma coisa.
Tim S.

1
Você pode aceitar outra resposta? O que você aceitou está realmente errado (ou pelo menos incompleto) e tem 11 votos negativos.
Arjan #

Respostas:


102

Depende da ferramenta.

Para a maioria dos propósitos, os dois serão os mesmos, mas nem sempre.

Por exemplo, se você usar um número de 3 dígitos começando com zero (ou um de dois dígitos começando com zero, graças a Dietrich-Epp), o ping assumirá que os números são octais.

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users>ping 011.012.013.014

Pinging 9.10.11.12 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 9.10.11.12:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

37
Não tanto de ping, mas a rotina que lhe está subjacente usainet_addr()
cde

2
Também está acontecendo no OSX.
Johann Philipp Strathausen

21
Não é porque tem três dígitos, é porque o número tem um zero à esquerda. Você pode testar isso tentando executar o ping 09.09.09.09, que não funciona porque 9 não é válido em octal.
Dietrich Epp

65

Supondo que todo o software que você está usando esteja usando ponto decimal e sub-rede corretamente, sim, eles são os mesmos.

192.168.0.1, por exemplo, é apenas a notação decimal decimal amigável do valor binário ponto 11000000.10101000.00000000.00000001.

Se você digitar como 192.168.0.1 ou 192.168.000.001, ambos são iguais a 11000000.10101000.00000000.00000001


63
Os pontos também são por conveniência; o IP real é 110000001010100000000000000000000001
cpast

14
@cpast ou como um número hexadecimal:C0A80001
jfs

13
ou como número octal (começando com 0, com ou sem pontos), por exemplo, ping 0300.0250.2.0144 para 192.168.2.100
Sergey

15
ou como um número decimal3232235521
oldmud0

14
Como a resposta do @GreenstoneWalker apontou, muitos programas não os consideram iguais; um número com zero à esquerda (que não contém os dígitos 8 ou 9) será entendido como um número de notação octal; portanto, 010.000.001.063 seria interpretado como "8.0.1.51" (octal 010 = 8 decimal; octal 063 = decimal 51) em vez de "10.0.1.63"!
Doktor J

37

Depende das ferramentas ou funções que qualquer programa usa para analisar o endereço fornecido. A Microsoft e o Linux, assim como outros sistemas operacionais, usam uma rotina compatível com POSIXinet_addr() para analisar endereços.

Muitos programas TCP / IP, como Ping e FTP, usam a função de soquetes inet_addr () para converter cadeias de endereços IP em endereços de 4 bytes. Esta função aceita um endereço IP em notação decimal, octal e hexadecimal padrão.
Microsoft KB115388 Ping e FTP resolvem o endereço IP com zero à esquerda como octal

 

A função inet_addr () converte o endereço de host da Internet cp da notação de números e pontos IPv4 em dados binários na ordem de bytes da rede.

Em todas as formas acima, os componentes do endereço pontilhado podem ser especificados em decimal, octal (com um 0 inicial) ou hexadecimal, com um 0X inicial. Os endereços em qualquer um desses formulários são denominados coletivamente como notação de números e pontos IPv4 . O formulário que usa exatamente quatro números decimais é chamado de notação decimal pontilhada IPv4 (ou algumas vezes: notação quadrangular pontilhada IPv4).
inet_addr (3): Rotinas de alteração de endereço da Internet - página de manual do Linux

Como tal, seu sistema específico pode exigir notação decimal de três dígitos para cada octeto, mas isso não é universal e deve-se tomar cuidado para garantir que o endereço IP correto seja inserido.

Obviamente, apenas números válidos para cada tipo funcionarão. Fora do intervalo, os números Octal, Hex ou Decimal também falharão ou causarão problemas. Octal 088, Hex 0xGG ou Decimal 280 são exemplos inválidos.


3
+1 para a função subjacente. Para adicionar, essa função fará com que a análise de IP falhe se um byte válido (por exemplo, 88) for preenchido com zero, pois 8 não é um número válido em octal.
March Ho

No Windows XP (e antes disso), a função aceitará números octais inválidos e ainda tentará convertê-los. Isso pode levar a um comportamento muito não óbvio. No Vista, os números inválidos são tratados como nomes de domínio e o Windows tentará fazer uma pesquisa de DNS para eles. O que também é um comportamento bastante estranho, mas que pelo menos não causará problemas.
Tonny

@tonny, porque POSIX inet_addr () retorna -1 para valores inválidos, que passam para 255. A rotina mais recente, conforme mencionada na página de manual do Linux, tem melhor tratamento de erros.
Cde

@cde Eu nunca me preocupei em aprofundar isso na mecânica de inet_addr (). Eu vou acreditar na sua palavra :-)
Tonny

13

Como Lightness Races em Orbit e outros apontaram,

A INET(3)página do manual descreve inet_addre inet_aton, as funções padrão usadas para converter a "notação de números e pontos IPv4 em formato binário". Diz

... os componentes do endereço pontilhado podem ser especificados em decimal, octal (com um 0 inicial) ou hexadecimal, com um 0X inicial.

Portanto, tecnicamente, NÃO , um endereço IP com zeros à esquerda não é (sempre) o mesmo que um sem zeros à esquerda. No seu caso, no entanto, 192.168.2.100e 192.168.002.100são idênticos, porque 002 == 2.

Qualquer interface do usuário que exija que cada componente tenha exatamente três caracteres de comprimento, com zeros à esquerda incorretamente necessários, está quebrada.


1
A idéia de que "zeros à esquerda" são necessários (em alguns equipamentos) não parece estar em disputa; Qual é a base para chamar isso de "requerido incorretamente" / "quebrado"? Só porque viola INET (3) / inet_addr / inet_aton? As implementações que exigem esses zeros provavelmente usam outro código que pode se comunicar bem, portanto, não está "quebrado". (Vi impressoras fazerem isso.) Existe uma base para dizer que a página de manual do INET (3) é mais "correta" / um recurso mais autoritário do que outros documentos oficiais, como RFCs e outros citados por este rascunho de documento ?
TOOGAM

6

Algumas implementações consideram octetos com zeros à esquerda como decimais, enquanto outras implementações consideram octal. Contanto que o octeto esteja no intervalo de 0 a 7, isso não faz diferença. Assim, por exemplo, seria 192.168.002.100interpretado como 192.168.2.100nas duas implementações.

Mas se você digitar um endereço, 192.168.010.100ele poderá ser interpretado como uma 192.168.10.100ou 192.168.8.100dependendo da implementação. Também não é improvável que existam implementações, o que consideraria zeros iniciais um erro de sintaxe. Além disso, há cenários em que o software pode insistir em que você precise usar a representação canônica por um motivo ou outro. Por todos esses motivos, recomendo evitar zeros à esquerda ao escrever um endereço IP.

Se você escrever um software que precise analisar um endereço IP, recomendo aceitar zeros à esquerda, mas emita um aviso para um local apropriado quando isso acontecer.

Ligeiramente relacionadas, existem implementações que permitem que você tenha menos de quatro componentes na notação pontilhada. Quando há menos de quatro componentes, o último componente possui mais de 8 bits e os componentes anteriores possuem exatamente 8 bits. Por exemplo, 192.168.612seria realmente uma maneira válida de escrever 192.168.2.100. Mas, novamente, usar essa notação não é recomendado.


0

Apenas uma pequena dica: em alguns casos, é importante usar zero prefixos nos endereços IP. Um exemplo é o Apache .htaccess negar regras.

Se você usar algo como

deny from 11.22.33.22

O Apache é tão estúpido que também bloqueará o acesso dos seguintes IPs:

111.22.33.22

11.22.33.221

211.22.33.221

e, em geral, qualquer endereço IP que inclua 11.22.33.22

Portanto, apenas para ter certeza de que você não bloqueará nenhum IP que não pretendia bloquear, use:

deny from 011.022.033.022

para garantir que o Apache bloqueie o acesso apenas a partir do endereço IP 11.22.33.22.


3
Interessante. Você pode fornecer uma referência para isso?
Scott

A referência é experiência pessoal e muitas tentativas e erros, depois de encontrar muitos visitantes bloqueados por não usar zeros à esquerda. Outra maneira de evitar proibições erradas é usar o IP no formato CIDR. Por exemplo, 11.22.33.22/32 em vez de apenas 11.22.33.22
Nick Gar

0

tenha cuidado com isso. ele deve ser o mesmo, mas é NÃO !
Eu não consegui encontrar uma explicação para isso, mas eu posso dizer claramente que no Windows e endereços IP Linux com e sem zeros à esquerda NÃO são os mesmos! talvez isso tenha a ver com a conversão de outros formatos, como hexadecimal ou binário.

da minha experiência com windows e linux, não é dependente de ferramenta, mas os dependend parece porque estou executando em algum problema usando ips como 10.08.03.100:

  • nota: "10.08.0.1" e 10.09.0.1 não foram encontrados
  • nota: "10.010.0.1" foi resolvido para 10.8.0.1

linux / debian7 / 8: mesmos resultados com as ferramentas "ping" e "snmpget"

user@test:~$ ping 10.7.0.1
PING 10.7.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.7.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.07.0.1
PING 10.07.0.1 (10.7.0.1) 56(84) bytes of data.
^C
--- 10.07.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.08.0.1
**ping: unknown host 10.08.0.1**
user@test:~$ ping 10.9.0.1
PING 10.9.0.1 (10.9.0.1) 56(84) bytes of data.
^C
--- 10.9.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.09.0.1
ping: unknown host 10.09.0.1
user@test:~$ ping 10.10.0.1
PING 10.10.0.1 (10.10.0.1) 56(84) bytes of data.
^C
--- 10.10.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

user@test:~$ ping 10.010.0.1
PING 10.010.0.1 (10.8.0.1) 56(84) bytes of data.
^C
--- 10.010.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1001ms

windows7 / 8/10: mesmos resultados com as ferramentas "ping" e "telnet"

(desculpe, eu não tenho um windows em inglês na mão, o erro informa que o host não foi encontrado)

C:\Users\user>ping 10.7.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.07.0.1

Ping wird ausgeführt für 10.7.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.8.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.08.0.1
Ping-Anforderung konnte Host "10.08.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.9.0.1

Ping wird ausgeführt für 10.9.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.09.0.1
Ping-Anforderung konnte Host "10.09.0.1" nicht finden. Überprüfen Sie den Namen,

C:\Users\user>ping 10.10.0.1

Ping wird ausgeführt für 10.10.0.1 mit 32 Bytes Daten:
STRG-C
^C
C:\Users\user>ping 10.010.0.1

Ping wird ausgeführt für 10.8.0.1 mit 32 Bytes Daten:
STRG-C
^C

Um zero inicial geralmente indica octal. De fato, octal 010 é decimal 8 e 08 e 09 são números octais inválidos. Portanto, sim, a resposta (atualmente) aceita pelo AthomSfere está errada (ou pelo menos incompleta). Veja seus comentários e algumas das outras respostas.
Arjan #

Ugh, esse manuseio de 10.010.0.1 é absolutamente terrível. No Microsoft Windows, o ping 10.070.0.1 é tratado como 10.56.0.1 e 10.080.0.1 gera um erro instantâneo: "A solicitação de ping não pôde encontrar o host 10.080.0.1. Verifique o nome e tente novamente."
TOOGAM

1
Sim, @TOOGAM, octal 070 é decimal 56. E octal 080 não é um número válido.
Arjan #

-4

Os dois endereços IP são diferentes.

Contudo:

  • As pessoas geralmente os consideram o mesmo.
  • Alguns softwares os considerariam iguais.
  • Alguns softwares, em algumas plataformas, os consideram diferentes.

Se isso soa confuso, é porque não há um padrão que governe a maneira como os endereços IP devem ser escritos; portanto, diferentes programadores em diferentes pontos da história e em diferentes plataformas tiveram idéias diferentes sobre o que deveria ser feito.

Os endereços IP são realmente binários e as pessoas tendem a usar uma notação decimal pontilhada para representar endereços IP. O software pode aceitar várias bases numéricas (ou seja, decimal, octal, hex) e interpretar as coisas de várias maneiras, com base em como você a escreve. Como você escreve, pode dizer ao software em que base está escrevendo.

Eu aconselho você: não use zeros à esquerda se quiser usar notação decimal pontilhada. Alguns softwares consideram que uma bandeira significa que você está inserindo um número octal. Se você deseja inserir um número decimal, não obterá os resultados esperados.

Fiz uma pergunta semelhante e obtive boas respostas; portanto, se você quiser ler as RFCs, há boas informações a serem obtidas lá.


-6

Deve funcionar de qualquer maneira. Você pode até executar ping com números de três dígitos e o computador entenderá o endereço IP.

Edit : Windows irá lê-lo como octal, isso só funciona para Linux.


Isso é verdade. O formato decimal pontilhado, como é conhecido, é realmente apenas para humanos. Os dispositivos na rede não usam essa representação de um endereço IP.
Patrick Seymour

1
@Brock Vond: Sim, exceto eu acho que você transpôs os 186 e 168 acidentalmente.
Patrick Seymour

6
O uso de ping com números de 3 dígitos pode não funcionar. Pode tratá-los como octais.
Greenstone Walker

1
@LightnessRacesinOrbit Na verdade, o exemplo dado funcionará mesmo que você os zere, pelo menos no Windows e no Debian (não tenho um Mac). O bug / recurso ocorre apenas se o número for preenchido com zero e o número preenchido com zero for maior que 7 (como octal e decimal seriam idênticos). Se você tentar inserir um endereço decimal válido preenchido com zero (por exemplo, 012.034.056.078), ele ainda tentará analisar isso como octal, resultando em falha da função ping.
March Ho

1
@MarchHo: Sim, é o que estamos dizendo.
Lightness Races in Orbit

-11

O zero inicial não tem sentido. Os octetos são (base-10) 0-255 números, não seqüências de caracteres.

Como não sei exatamente o que você está perguntando (ou que você sabe que pergunta perguntar :)): Dito isso, o IP # deve estar na mesma sub-rede que sua rede. Se você escolher 11.12.13.14 em uma sub-máscara de 192.168.0.0, esse dispositivo não poderá conversar ou usar essa sub-rede.


lol - não, eu def entendo a sub-rede e os conceitos básicos de rede ... apenas nunca encontrei um produto que exigisse 3 dígitos lá. Eu estava apenas usando o 11.12.13.14 como variáveis ... mas graças :)
Brock Vond

9
-1: Não, inet_addre as centenas de milhares de ferramentas que dependem dele para a análise de endereço levam um 0 inicial para significar que o byte é fornecido na notação de base 8. Isso dificilmente é "sem sentido".
Lightness Races in Orbit
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.