O comprimento máximo da representação textual de um endereço IPv6?
-
03-07-2019 - |
Pergunta
Eu quero armazenar os dados retornados pelo $_SERVER["REMOTE_ADDR"]
em PHP em um campo DB, bem tarefa simples, na verdade. O problema é que não consigo encontrar qualquer informação adequada sobre o comprimento máximo da representação textuais de um endereço IPv6, que é o que um servidor web fornece através $_SERVER["REMOTE_ADDR"]
.
Eu não estou interessado em converter a representação textual para os 128 bits o endereço é normalmente codificados em, eu só quero saber quantos caracteres no máximo são necessários para armazenar qualquer endereço IPv6 retornado por $_SERVER["REMOTE_ADDR"]
.
Solução
45 caracteres .
Você pode esperar uma morada para ser
0000:0000:0000:0000:0000:0000:0000:0000
8 * 4 + 7 = 39
8 grupos de 4 dígitos com 7 :
entre eles.
Mas se você tem um IPv4-mapeados endereços IPv6 , o últimos dois grupos pode ser escrita em base de 10 separados por .
, por exemplo. [::ffff:192.168.100.228]
. Escrito por extenso:
0000:0000:0000:0000:0000:ffff:192.168.100.228
(6 * 4 + 5) + 1 + (4 * 3 + 3) = 29 + 1 + 15 =
45
nota, esta é uma convenção de entrada / exibição - é ainda um endereço de 128 bits e para o armazenamento, provavelmente seria melhor para padronizar o cólon cru separada formato, isto é, para o endereço [0000:0000:0000:0000:0000:ffff:c0a8:64e4]
acima
Outras dicas
No Linux, consulte INET6_ADDRSTRLEN
constante (incluem <arpa/inet.h>
, consulte man inet_ntop
). No meu sistema (header "in.h"):
#define INET6_ADDRSTRLEN 46
A última personagem é para terminar NULL, como eu acredito, portanto, o comprimento máximo é 45, como outras respostas.
respondi minha própria pergunta:
endereços IPv6 são normalmente escritos como oito grupos de quatro dígitos hexadecimais, onde cada grupo está separado por dois pontos (:).
Então, isso é 39 caracteres no máximo.
Eu acho resposta @Deepak nesta ligação é mais perto de resposta correta. comprimento Max para o endereço IP do cliente . Então tamanho correto é de 45 não 39. Às vezes tentamos scrounge em tamanho campos mas parece melhor se preparar tamanho de armazenamento suficiente.
Como indicado um endereço IPv6 padrão é no máximo de 45 caracteres, mas um endereço IPv6 também pode incluir um% terminando seguido por um "scope" ou cadeia "zona", que tem comprimento não fixo, mas é geralmente um pequeno número inteiro positivo ou um nome de interface de rede, de modo que, na realidade, pode ser maior do que 45 caracteres. nomes de interface de rede são tipicamente "eth0", "eth1", "wlan0", para escolher 50 como o limite é provável bom o suficiente.
Cuidado com determinados cabeçalhos como HTTP_X_FORWARDED_FOR
que aparecem para conter um único endereço IP. Eles podem realmente conter vários endereços (uma cadeia de proxies eu suponho).
Eles parecem ser vírgula delimitado - e pode ser muito mais do que 45 caracteres no total -. modo a verificar antes de armazenar em DB