Notação decimal sem pontos estranha do endereço IP ... Como funciona?


89

Hoje cedo, pensei que tinha um URL na minha área de transferência, mas na verdade eu tinha quatro números inteiros de 9 dígitos copiados de uma planilha, que eram números de identificação de um sistema proprietário. Completamente não relacionado à tarefa em questão. Eu colei no Firefox e fiquei surpreso ao descobrir que ele realmente carregava uma página. Já vi notações decimais sem ponto de endereços IPv4 , mas esse número longo é algo muito, muito maior.

714687644714805209715128610715964400 (coloque um HTTP: // na frente)

Como é que isso funciona? Todos os conversores decimais -> IPv4 encontrados na Internet consideram uma entrada inválida. Se eu pegar o endereço IPv4 que ele realmente carrega e executar os mesmos cálculos para convertê-lo em decimal sem ponto, recebo um número muito menor.

Eu li que o ping pode aceitar dwords e fazer alguma conversão, mas não pode converter esse número em um endereço IP. O IPv6 está fora de questão, pois esse host não possui conectividade IPv6.

Que tipo de loucura é essa? Isso me deixou perplexo e com meus colegas de trabalho.

Edit: Está de volta online agora.



2
Você está realmente certeza que não é um endereço IPv6? Porque esse número é dividido em 8 dígitos na base 65536; Os endereços IPv6 possuem 8 dígitos na base 65536. Representado em hexadecimal, como é usual no IPv6, é 89: a4d2: 471b: 45ef: 77ed: c70f: da35: 93f0.
Christian

2
@Christian Sua explicação para a origem do número jives com o número real mostrado, que possui 36 dígitos (cada ID tem 9 dígitos, 714xxxxxx ou 715xxxxxx). O computador nem sequer tem IPv6, e o número tomado como endereço IPv4 realmente retorna uma página da web. Números de ~ 5E33 para ~ 3E38 ter 8 dígitos na base de 65536, eu acho que é apenas uma coincidência que suas quedas nesse intervalo (plus, qualquer número menor também seria um endereço IPv6 válido)
Tim S.

1
Ok, ele já não funcionou quando eu tentei ontem, mas como era um roteador não seguro, talvez isso não seja tão surpreendente. Então você está dizendo que basicamente coloca um número aleatório na barra de endereço? Ou que tipo de planilha você tem lá que contém endereços IP estranhamente codificados de roteadores não seguros? ;)
Christian

1
@ Christian, LOL. Eles eram alguns identificadores de mensagens exclusivos em um sistema de conformidade. Possibilidade totalmente esquisita de colá-los na barra de endereços, e funcionou. Aposto que nunca vai acontecer de novo para mim na minha vida :)
Beeks

Respostas:


93

Essa é uma pergunta bastante interessante e demorei um pouco para descobrir. A resposta curta é que os últimos 32 bits do número são 3660944368 (em decimal, que pode ser encontrado por 714687644714805209715128610715964400 mod 2^32)

Esse é o valor decimal do endereço IPv4 218.53.147.240 , que pode ser encontrado convertendo-o em base-256 3660944368 = 218*(256^3)+53*(256^2)+147*(256)+240análogo para escrever um número em decimal (base-10). Por exemplo 234 = 2*10^2+ 3*10 + 4.

Como aponta @chritohnide, cada seção de endereços IPv4 pontilhados é chamada de octeto, pois representa 8 dígitos binários. Também é importante notar que os vários formatos de endereços IPv4 (como o decimal pontilhado ou o decimal puro) são apenas maneiras diferentes de representar o número binário de 32 bits em benefício próprio.

Como os endereços IPv4 são números de 32 bits, apenas os últimos 32 bits do número são usados ​​para resolver o endereço. Por que isso é verdade não é tão óbvio. Como outros já apontaram, o número completo se parece muito com um endereço IPv6 em decimal, mas não é um endereço válido.

Observando a especificação Teredo (consulte 4. Endereços Teredo ), o IPv4 do cliente ocupa os últimos 32 bits do endereço IPv6, mas o prefixo do número não corresponde à especificação Teredo (consulte também a Wikipedia ).


12
Boa resposta. Também pode ser útil mencionar que cada seção de um endereço IPv4 pontilhado é chamada de octeto, porque é a representação decimal de um número binário de 8 bits (4 octetos = 4 x 8 bits = 32 bits do endereço IPv4) e que o decimal versão é realmente apenas para nosso benefício.
Chritohnide

4
Tem certeza de que não é uma notação decimal IPv6? Ele converte com sucesso0089:a4d2:471b:45ef:77ed:c70f:da35:93f0
Izkata

5
@ Izkata: Improvável, porque esse endereço estaria em uma parte não alocada e reservada do espaço de endereço IPv6.
Henning Makholm

3
O número (em ASCII) provavelmente será executado apenas através de uma das cadeias C stdlib para funções int que serão convertidas no endereço ipv4 de 32 bits. Na maioria das implementações do C stdlib, essas conversões executam automaticamente um módulo 2 ^ <tamanho inteiro desejado>. O resultado nesse caso é exatamente o comportamento observado.
Tonny

3
Vale a pena notar que isso provavelmente é uma peculiaridade do analisador de URL do Firefox. Parece reconhecer que é um número, e não um URL, e tenta analisá-lo como um endereço IP não marcado de 32 bits (o número inteiro analisado resultante termina no módulo de 32 bits e realmente não faz nenhuma verificação de erro na entrada ) Chrome, por exemplo, não mostra esse comportamento. Na verdade, pode valer a pena denunciá-lo como um bug trivial no Firefox.
Jason C #
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.