2009-07-02 736 views
204

Duplicar posibles:
Maximum length of the textual representation of an IPv6 address?Longitud máxima dirección IP del cliente

¿Qué le recomendaría como el tamaño máximo de una columna de base de datos de almacenamiento de direcciones IP de los clientes? Lo tengo configurado en 16 en este momento, pero ¿podría obtener una dirección IP que sea más larga que con IPv6, etc.?

+0

Ya está cubierto aquí. Compruebe http://stackoverflow.com/questions/1038950/what-is-be-the-most-appropriate-data-type-for-storing-an-ip-address-in-sql-server – Arnkrishn

+4

En realidad, esa publicación es no muy útil No estamos usando Sql Server y las respuestas a esta publicación han sido concisas y al grano, exactamente lo que estaba buscando. –

+7

@Andriyev esa publicación se refiere solo a IPv4. –

Respuesta

194

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

Las direcciones IPv6 son de 128 bits (a diferencia de 32 bits de direcciones IPv4). Por lo general, 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 asignadas IPv4. (La longitud de la cadena IPv6 máxima correcta es 45 caracteres.)

+4

Algunas bases de datos (al menos postgres) tienen un tipo de columna IP nativa y realiza la conversión por usted. – gnud

+4

Evitaría mezclar IPv4 e IPv6 en el mismo archivo de una base de datos por "un tiempo". IPv4 sigue siendo el estándar predeterminado, y continuará usándose en los próximos años. En aplicaciones heredadas con las que he trabajado, cuando fue necesario agregar direcciones IPv6 a la base de datos, esto se hizo como una entrada separada. Esto permitió que el código existente dejara la dirección IPv4 esperada en su lugar y que el código permitido solo siguiera obteniendo una dirección IPv4. Para nuevas partes del código, tenían una opción para obtener específicamente IPv4, IPV6 o una mezcla de la consulta. –

+0

Si fuera a almacenar IPv4 como un solo byte, ¿no sería más una cuestión de qué estructuras de datos acepta el cliente que lee? Si tuviera que almacenarlo como una única INT, y el cliente aceptara el binario, sí, eso no sería bueno ... Creo que el punto de tener un tipo más grande podría ser una buena preocupación, dependiendo del número y sofisticación de las aplicaciones. Es posible que tenga aplicaciones que aceptan solo un formato, o ambos. Es posible que desee tener un campo relacionado que tenga una etiqueta de tipo de dirección. – benc

23

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

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

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

ATENCIÓN: Si también desea mantener direcciones IPV4 asignadas como direcciones IPV6, use 45 characters as @Deepak suggests.

5

Como se describe en el artículo de IPv6 Wikipedia,

direcciones

IPv6 se representan normalmente como se ocho grupos de cuatro dígitos hexadecimales, donde cada grupo está separados por dos puntos (:)

una dirección típica IPv6:

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

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

1

IPv4 utiliza 32 bits, en forma de:

255.255.255.255 

supongo que depende de su tipo de datos, ya sea que esté almacenar como una cadena con un tipo CHAR o si está usando un numérica tipo.

IPv6 usa 128 bits. No tendrá direcciones IP más largas a menos que incluya otra información con ellos.

IPv6 se agrupan en grupos de 4 dígitos hexadecimales separados por dos puntos, al igual que (de Wikipedia):

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

Estás a salvo almacenarla como una cadena larga de 39 caracteres, caso de que deseen hacer eso . Sin embargo, existen otras formas abreviadas de escribir direcciones. Los conjuntos de ceros se pueden truncar en un solo 0, o los conjuntos de ceros se pueden ocultar completamente por dos puntos dobles.

10

Tomar de alguien que lo ha intentado todas las tres formas ... sólo tiene que utilizar un varchar (39)

El almacenamiento de un poco menos eficiente es mucho mayor que cualquier beneficio de tener que convertirlo en insertar/actualizar y darle formato al mostrarlo en cualquier lugar.

2

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 lo completo en 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

323

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

IPv6 (39 caracteres):

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

asignada de IPv4 IPv6 (45 caracteres):

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

Nota: los últimos 32 bits (que se corresponden con Dirección IPv4) puede necesitar hasta 15 caracteres (ya que IPv4 usa 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 de la cadena IPv6 correcta, por lo tanto, es 45.

Este fue en realidad una pregunta de examen en un entrenamiento de IPv6 que atendía. (Todos respondimos 39!)

+2

Me parece que esto no es correcto. Una dirección mapeada con IPv6 tiene un máximo de 22 caracteres según https://tools.ietf.org/html/rfc5952#page-10 y https://tools.ietf.org/html/rfc4291#section-2.5.5 como siempre tienen el formato :: ffff: 000.000.000.000 y deben acortarse – tarzan

+0

Me pregunto si realmente quiso decir "dirección ipv4 compatible con ipv6" según https://tools.ietf.org/html/rfc4291#section- 2.5.5.1. Nunca recuerdo haber visto esos en la naturaleza. –

2

Las personas están hablando de caracteres cuando se puede comprimir una dirección IP en datos sin procesar.

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

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

Dicho esto, tendrá que decodificar y codificar la dirección IP en/desde los datos brutos, lo que en sí mismo es algo trivial (lo he hecho antes, vea PHP ip2long() para direcciones IP de 32 bits) .

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

+0

@ Elipticalview No creo que hayas leído mi respuesta. ¡Nunca he mencionado 45 bytes en ninguna parte! Si convierte cualquier valor de IPv4 (incluso los malos como usted mencionó) en datos brutos, nunca deben exceder los 4 bytes, porque no importa la cantidad de puntos que tenga, siempre deben sumar 4 números cada uno hasta un máximo de 255. – Christian

Cuestiones relacionadas