Longitud máxima de la dirección ip del cliente [duplicado]


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

¿Cuál recomendaría como tamaño máximo para una columna de base de datos que almacena las direcciones ip del cliente? Lo tengo configurado en 16 en este momento, pero ¿podría obtener una dirección ip que sea más larga que la de IPv6, etc.?

Author: Community, 2009-07-03

8 answers

Para IPv4, podría salirse con la suya almacenando los 4 bytes sin procesar de la dirección IP (cada uno de los números entre los períodos en una dirección IP son 0-255, es decir, un byte). Pero entonces tendrías que traducir entrar y salir de la base de datos y eso es complicado.

Las direcciones IPv6 son 128 bits (a diferencia de 32 bits de direcciones IPv4). Generalmente se escriben como 8 grupos de 4 dígitos hexadecimales separados por dos puntos: 2001:0db8:85a3:0000:0000:8a2e:0370:7334. 39 caracteres es apropiado para almacenar direcciones IPv6 en este formato.

Editar: Sin embargo, hay una advertencia, consulte la respuesta de @Deepak para obtener detalles sobre las direcciones IPv6 mapeadas por IPv4. (La longitud máxima correcta de la cadena IPv6 es 45 caracteres.)

 217
Author: Matt Bridges,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-11 23:54:52

Hay una advertencia con la estructura general de 39 caracteres IPv6. Para direcciones IPv6 mapeadas IPv4, la cadena puede ser más larga (de 39 caracteres). Un ejemplo para mostrar esto:

IPv6 (39 caracteres):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD

IPv4-mapeado IPv6 (45 caracteres):

ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:192.168.158.190

Nota: los últimos 32 bits (que corresponden a la dirección IPv4) pueden necesitar hasta 15 caracteres (ya que IPv4 utiliza 4 grupos de 1 byte y está formateado como 4 números decimales en el rango 0-255 separados por puntos (el . carácter), por lo que el máximo es DDD.DDD.DDD.DDD).

La longitud máxima correcta de la cadena IPv6, por lo tanto, es 45.

Esta fue en realidad una pregunta de prueba en una capacitación de IPv6 a la que asistí. (Todos respondimos 39!)

 352
Author: Deepak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-03 14:53:48

Si desea manejar IPV6 en notación estándar, hay 8 grupos de 4 dígitos hexadecimales:

2001:0dc5:72a3:0000:0000:802e:3370:73E4

32 dígitos hexadecimales + 7 separadores = 39 caracteres.

PRECAUCIÓN: Si también desea mantener las direcciones IPV4 asignadas como direcciones IPV6, use 45 caracteres como @Deepak sugiere.

 23
Author: David J. Liszewski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:50

Tómalo de alguien que lo ha probado de las tres maneras... solo use un varchar (39)

El almacenamiento ligeramente menos eficiente supera con creces cualquier beneficio de tener que convertirlo al insertar/actualizar y formatearlo cuando se muestra en cualquier lugar.

 10
Author: Neil N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-20 18:07:23

Como se describe en el artículo IPv6 Wikipedia ,

Las direcciones IPv6 normalmente se escriben como ocho grupos de cuatro hexadecimal dígitos, donde cada grupo está separado por dos puntos (:)

Una dirección IPv6 típica:

2001:0db8:85a3:0000:0000:8a2e:0370:7334

Esto tiene 39 caracteres. Las direcciones IPv6 son de 128 bits de largo, por lo que es posible utilizar una columna binaria(16), pero creo que me quedaría con una representación alfanumérica.

 8
Author: Michael Petrotta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 21:24:05

IPv4 utiliza 32 bits, en forma de:

255.255.255.255

Supongo que depende de su tipo de datos, si solo está almacenando como una cadena con un tipo CHAR o si está utilizando un tipo numérico.

IPv6 utiliza 128 bits. No tendrás IPs más largas que eso a menos que incluyas otra información con ellas.

IPv6 se agrupa en conjuntos de 4 dígitos hexadecimales separados por dos puntos, como (de wikipedia):

2001:0db8:85a3:0000:0000:8a2e:0370:7334

Está seguro de almacenarlo como una cadena larga de 39 caracteres, si lo desea conseguirlo. Sin embargo, también hay otras formas abreviadas de escribir direcciones. Los conjuntos de ceros se pueden truncar a un solo 0, o los conjuntos de ceros se pueden ocultar completamente con dos puntos.

 2
Author: Chet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 21:30:09

Si solo lo está almacenando como referencia, puede almacenarlo como una cadena, pero si desea hacer una búsqueda, por ejemplo, para ver si la dirección IP está en alguna tabla, necesita una "representación canónica."Convertir todo a un número (grande) es lo correcto. Las direcciones IPv4 se pueden almacenar como un int largo (32 bits), pero se necesita un número de 128 bits para almacenar una dirección IPv6.

Por ejemplo, todas estas cadenas son realmente la misma dirección IP: 127.0.0.1, 127.000.000.001,:: 1, 0:0:0:0:0:0:0:1

 2
Author: user410119,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-03 20:41:43

La gente está hablando de caracteres cuando uno puede comprimir una dirección IP en datos sin procesar.

Así que en principio, ya que solo usamos IPv4 (32bit) o IPv6 (128bit), eso significa que necesita como máximo 128 bits de espacio, o 128/8 = 16 bytes!

Que es mucho menor que los 39 bytes sugeridos (suponiendo que el conjunto de caracteres es ascii).

Dicho esto, tendrá que decodificar y codificar la dirección IP en / desde los datos en bruto, lo que en sí mismo es una cosa trivial de hacer (lo he hecho antes, ver PHP ip2long() para IPs de 32 bits).

Editar: inet_pton (y su opuesto, inet_ntop()) hace lo que necesita, y funciona con ambos tipos de direcciones. Pero cuidado, en Windows está disponible desde PHP 5.3.

 2
Author: Christian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-17 11:25:16