¿Longitud máxima de la representación textual de una dirección IPv6?
Quiero almacenar los datos devueltos $_SERVER["REMOTE_ADDR"]
en PHP en un campo de base de datos, una tarea bastante simple, en realidad. El problema es que no puedo encontrar ninguna información adecuada sobre la longitud máxima de la representación textual de una dirección IPv6, que es lo que proporciona un servidor web a través de $_SERVER["REMOTE_ADDR"]
.
No estoy interesado en convertir la representación textual a los 128 bits en los que generalmente está codificada la dirección, solo quiero saber cuántos caracteres como máximo se necesitan para almacenar cualquier dirección IPv6 devuelta por $_SERVER["REMOTE_ADDR"]
.
45 caracteres .
Es posible que espere que una dirección sea
0000:0000:0000:0000:0000:0000:0000:0000
8 * 4 + 7 = 39
8 grupos de 4 dígitos con 7 :
entre ellos.
Pero si tiene una dirección IPv6 asignada a IPv4 , los dos últimos grupos se pueden escribir en base 10 separados por .
, por ejemplo. [::ffff:192.168.100.228]
. Escrito completamente:
0000:0000:0000:0000:0000:ffff:192.168.100.228
(6 * 4 + 5) + 1 + (4 * 3 + 3) = 29 + 1 + 15 = 45
Tenga en cuenta que esta es una convención de entrada/visualización: sigue siendo una dirección de 128 bits y, para el almacenamiento, probablemente sería mejor estandarizar el formato sin formato separado por dos puntos, es decir, [0000:0000:0000:0000:0000:ffff:c0a8:64e4]
para la dirección anterior.
En Linux, consulte constante INET6_ADDRSTRLEN
(incluir <arpa/inet.h>
, consulte man inet_ntop
). En mi sistema (encabezado "in.h"):
#define INET6_ADDRSTRLEN 46
El último carácter es para terminar NULL, según creo, por lo que la longitud máxima es 45, como otras respuestas.
Como se indicó, una dirección ipv6 estándar tiene como máximo 45 caracteres, pero una dirección ipv6 también puede incluir un % final seguido de una cadena de "alcance" o "zona", que no tiene una longitud fija pero generalmente es un pequeño entero positivo o una interfaz de red. nombre, por lo que en realidad puede tener más de 45 caracteres. Los nombres de las interfaces de red suelen ser "eth0", "eth1", "wlan0", una pequeña cantidad de caracteres. La longitud máxima del nombre de la interfaz en Linux es de 15 caracteres , por lo que elegir 61 bytes cubrirá todos los nombres de las interfaces en Linux.
Respondí mi propia pregunta:
Las direcciones IPv6 normalmente se escriben como ocho grupos de cuatro dígitos hexadecimales, donde cada grupo está separado por dos puntos (:).
Entonces eso es 39 caracteres como máximo.