Longitud máxima de la representación textual de una dirección IPv6?

430

Quiero almacenar los datos devueltos por $_SERVER["REMOTE_ADDR"]PHP en un campo de base de datos, tarea bastante simple, de verdad. 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 $_SERVER["REMOTE_ADDR"].

No estoy interesado en convertir la representación textual en los 128 bits en los que generalmente se codifica la dirección, solo quiero saber cuántos caracteres como máximo se necesitan para almacenar cualquier dirección IPv6 devuelta $_SERVER["REMOTE_ADDR"].

Gilles
fuente
66
¿Qué pasa con el índice de zona?
Robert Tupelo-Schneck
55
#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48)
Fuente: lxr.free-electrons.com/source/include/linux/inet.h
1
La pregunta stackoverflow.com/questions/1076714/… tiene algunas respuestas similares pero útiles.
Edward

Respuestas:

615

45 caracteres .

Puede esperar 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 ejemplo, 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 sea mejor estandarizar el formato separado por dos puntos sin procesar, es decir, [0000:0000:0000:0000:0000:ffff:c0a8:64e4]para la dirección anterior.

Matthew Scharley
fuente
245
Los archivos de encabezado definen INET6_ADDRSTRLEN como 46, que se ajusta con 45 caracteres más un nulo final.
wisnij
66
Vale la pena señalar que la dirección IPv6 también puede contener la zona de alcance stackoverflow.com/questions/5746082/… , por ejemplo, obtienes eso de RemoteEndpointMessageProperty.Address
Rory
¿no están escritas las direcciones ipv4 como :: ffff: 127.0.0.1?
graywolf
52
@FelipeSchenone es ese tipo de pensamiento que no es útil: calcule el tamaño y úselo. El único momento en que desea extender un búfer es si ayuda con el relleno de modo que 64 caracteres, pero 45 (+1) es el óptimo.
gbjbaanb
1
¿esto tiene en cuenta el signo de porcentaje en la dirección ipv6? Consulte - superuser.com/questions/99746/…
gaurav
85

En Linux, vea constante INET6_ADDRSTRLEN(incluir <arpa/inet.h>, ver man inet_ntop). En mi sistema (encabezado "in.h"):

#define INET6_ADDRSTRLEN 46

El último carácter es para terminar NULL, como creo, por lo que la longitud máxima es 45, como otras respuestas.

Yury
fuente
2
Entonces, ¿qué es este 48 que veo? github.com/torvalds/linux/blob/master/include/linux/inet.h#L50
EIS
@eis probablemente fue en 2013. Posiblemente incrementado para la alineación de la estructura.
Iiridayn
13

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 (:).

Eso es un máximo de 39 caracteres.

Gilles
fuente
77
Sin embargo, aparentemente hay una advertencia, consulte stackoverflow.com/a/7477384/3787376 ("Longitud máxima para la dirección IP del cliente") - Cita: "Para las direcciones IPv6 mapeadas IPv4, la cadena puede tener más de 39 caracteres". Dice que un "IPv6 mapeado IPv4" tiene 45 caracteres y tiene el formato "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190". Por lo tanto, el máximo debe ser de 45 caracteres. La respuesta en stackoverflow.com/a/166157/3787376 (esta pregunta) también parece demostrar este punto.
Edward
6

Creo que la respuesta de @Deepak en este enlace está más cerca de la respuesta correcta. Longitud máxima para la dirección IP del cliente . Por lo tanto, el tamaño correcto es 45, no 39. A veces tratamos de buscar en el tamaño de los campos, pero parece mejor si preparamos suficiente tamaño de almacenamiento.

QMaster
fuente
4

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 entero positivo pequeño 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", por lo que elegir 50 como límite probablemente sea lo suficientemente bueno.

Sean F
fuente
3
Es cierto, pero esto es solo direcciones locales de enlace, y no verá ninguna de ellas una vez que su sitio web se esté ejecutando en Internet (y con suerte ni siquiera mientras lo desarrolla).
Michael Hampton
1

Tenga cuidado con ciertos encabezados como los HTTP_X_FORWARDED_FORque parecen contener una sola dirección IP. En realidad, pueden contener múltiples direcciones (supongo que una cadena de servidores proxy).

Aparecerán delimitados por comas , y pueden ser mucho más largos que 45 caracteres en total, así que verifique antes de almacenar en DB.

Simon_Weaver
fuente
3
Un -1 ligeramente en conflicto (en conflicto porque he caído en esta trampa antes, y supongo que esta respuesta contiene información relevante para algunas personas que llegarán a esta página) porque, sin embargo, esta claramente no es una respuesta a la pregunta formulada. Probablemente sería mejor como comentario sobre la pregunta.
Mark Amery