Questão Notação decimal sem ponto estranho de endereço IP ... Como funciona?


Hoje cedo pensei que tinha uma URL na minha área de transferência, mas na verdade eu tinha quatro 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 mãos. Eu colei no Firefox e fiquei surpreso ao descobrir que ele realmente carregou uma página. Eu vi notações decimais sem ponto de IPv4 endereços antes, mas este número longo é algo muito, muito maior.

714687644714805209715128610715964400 (coloque um HTTP: // na frente)

Como é que isso funciona? Todos os decimais -> conversores IPv4 que eu encontrei na Internet todos 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 isso ping pode aceitar dwords e fazer alguma conversão, mas não pode converter esse número em um endereço IP. IPv6 está fora de questão, pois esse host não possui conectividade IPv6.

Que tipo de loucura é essa? Estou perplexo comigo e com meus colegas de trabalho.

Edit: está de volta online agora.


87


origem


Vejo pc-help.org/obscure.htm - Shamtam
Você está realmente certeza de que não é um endereço IPv6? Porque esse número quebra para 8 dígitos na base 65536; Endereços IPv6 têm 8 dígitos na base 65536. Representado em hexadecimal como é usual para IPv6, é 89: a4d2: 471b: 45ef: 77ed: c70f: da35: 93f0. - Christian
@Christian Sua explicação para a fonte do número jives com o número real mostrado, que tem 36 dígitos (cada ID é 9 dígitos ou 714xxxxxx ou 715xxxxxx). O computador nem tem IPv6, e o número de endereços IPv4, de fato, retorna uma página web. Os números de ~ 5E33 a ~ 3E38 têm 8 dígitos na base 65536, acho que é apenas uma coincidência que a sua queda nesse intervalo (mais, qualquer número menor também seria um endereço IPv6 válido) - Tim S.
@beeks Ok, ele já não funcionou quando eu tentei ontem, mas dado que era um roteador não seguro, talvez isso não seja tão surpreendente. Então você está dizendo que basicamente colocou um número aleatório na sua barra de endereços? Ou que tipo de planilha você tem lá que contém endereços IP codificados de roteadores não seguros? ;) - Christian
@ Cristã, LOL. Eles eram alguns identificadores de mensagem exclusivos em um sistema de conformidade. Totalmente freak chance que eu colei na barra de endereços, e funcionou. Aposto que isso nunca mais vai acontecer comigo na minha vida :) - beeks


Respostas:


Esta é uma questão 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)

Este é o valor decimal do endereço IPv4 218.53.147.240, que pode ser encontrado convertendo-o para base-256 3660944368 = 218*(256^3)+53*(256^2)+147*(256)+240 análogo a 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 pontuado ou o decimal puro) são apenas maneiras diferentes de representar o número binário de 32 bits para o benefício out.

Como os endereços IPv4 são números de 32 bits, somente 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 apontaram, o número completo parece bastante semelhante a um endereço IPv6 em decimal, mas não é um endereço válido.

Olhando para o Especificação Teredo (Vejo 4. Endereços de Teredo), o Client IPv4 ocupa os últimos 32 bits do endereço IPv6, mas o prefixo do número não corresponde à especificação Teredo (ver também wikipedia).


92



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 de endereço IPv4) e que a versão decimal é realmente apenas para nosso benefício. - chritohnide
Tem certeza de que não é notação decimal IPv6? Converte com sucesso para 0089:a4d2:471b:45ef:77ed:c70f:da35:93f0 - Izkata
@Izkata: improvável porque esse endereço estaria em uma parte não alocada e reservada do espaço de endereços IPv6. - Henning Makholm
O número (em ASCII) provavelmente será executado através de uma das cadeias de caracteres C stdlib para funções int para converter no endereço ipv4 de 32 bits. Na maioria das implementações do C stdlib, essas conversões farão automaticamente um módulo 2 ^ <tamanho inteiro desejado>. O resultado nesse caso é exatamente para o comportamento observado. - Tonny
Vale a pena notar que esta é provavelmente uma peculiaridade do analisador de URL do Firefox. Parece reconhecer que é um número em vez de uma URL e tenta analisá-lo como um endereço IP de 32 bits (o inteiro analisado resultante acaba com o módulo de 32 bits e não faz realmente nenhuma verificação de erro na entrada ). O Chrome, por exemplo, não mostra esse comportamento. Na verdade, pode valer a pena denunciá-lo como um bug trivial no Firefox. - Jason C