web-dev-qa-db-fra.com

Longueur maximale pour l'adresse IP du client

Duplicate possible:
Longueur maximale de la représentation textuelle d'une adresse IPv6?

Que recommanderiez-vous comme taille maximale pour une colonne de base de données stockant les adresses ip du client? Je l’ai réglé sur 16 pour le moment, mais pourrais-je obtenir une adresse IP plus longue que celle avec IPv6, etc.?

257
Tony Eichelberger

Pour IPv4, vous pourriez vous échapper au stockage des 4 octets bruts de l’adresse IP (chacun des nombres entre les périodes d’une adresse IP correspond à 0- 255, soit un octet). Mais vous devrez alors traduire les entrées et les sorties de la base de données et c'est compliqué.

Les adresses IPv6 sont de 128 bits (par opposition à 32 bits d’adresses IPv4). Ils sont généralement écrits en 8 groupes de 4 chiffres hexadécimaux séparés par des deux points: 2001:0db8:85a3:0000:0000:8a2e:0370:7334. 39 caractères est approprié pour stocker les adresses IPv6 dans ce format.

Edit: Cependant, il y a une mise en garde, voir la réponse de @ Deepak pour plus de détails sur les adresses IPv6 mappées IPv4. (La longueur maximale correcte de la chaîne IPv6 est 45 caractères.)

257
Matt Bridges

ne mise en garde s'applique à la structure générale IPv6 de 39 caractères. Pour les adresses IPv6 mappées IPv4, la chaîne peut être plus longue (plus de 39 caractères). Un exemple pour montrer ceci:

IPv6 (39 caractères):

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

IPv6 mappé IPv4 (45 caractères):

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

Remarque: les derniers 32 bits (correspondant à l'adresse IPv4) peuvent nécessiter jusqu'à 15 caractères (IPv4 utilise 4 groupes de 1 octet et est formaté en 4 nombres décimaux dans la plage 0-255 séparés par des points (le . caractère), le maximum est donc DDD.DDD.DDD.DDD).

La longueur maximale correcte de la chaîne IPv6 est donc 45.

C'était en fait une question de quiz dans une formation IPv6 à laquelle j'ai assisté. (Nous avons tous répondu 39!)

406
Deepak

Si vous voulez gérer IPV6 en notation standard, il y a 8 groupes de 4 chiffres hexadécimaux:

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

32 chiffres hexadécimaux + 7 séparateurs = 39 caractères.

ATTENTION: Si vous souhaitez également conserver les adresses IPV4 mappées comme adresses IPV6, tilisez 45 comme le suggère @Deepak .

25
David J. Liszewski

Prenez le de quelqu'un qui a essayé les trois manières ... utilisez simplement un varchar (39)

Le stockage légèrement moins efficace l'emporte de loin sur les avantages de le convertir en insertion/mise à jour et de le formater lorsqu'il est affiché n'importe où.

11
Neil N

Comme décrit dans l'article IPv6 Wikipedia ,

Les adresses IPv6 sont normalement écrites en huit groupes de quatre chiffres hexadécimaux, chaque groupe étant séparé par un signe deux-points (:)

Une adresse IPv6 typique:

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

C'est 39 caractères de long. Les adresses IPv6 ont une longueur de 128 bits, vous pouvez donc utiliser une colonne binaire (16), mais je pense que je choisirais une représentation alphanumérique.

9
Michael Petrotta

IPv4 utilise 32 bits, sous la forme de:

255.255.255.255

Je suppose que cela dépend de votre type de données, que vous stockiez simplement sous forme de chaîne avec un type CHAR ou que vous utilisiez un type numérique.

IPv6 utilise 128 bits. Vous ne disposerez pas d'adresses IP plus longtemps que si vous n'incluez pas d'autres informations.

IPv6 est groupé en ensembles de 4 chiffres hexadécimaux séparés par des deux points, comme (de wikipedia):

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

Si vous souhaitez le faire, vous pourrez le stocker en tant que chaîne longue de 39 caractères. Il existe cependant d'autres manières de rédiger des adresses. Les groupes de zéros peuvent être tronqués à un 0, ou masqués par deux points.

3
Chet

Si vous ne le stockez que pour référence, vous pouvez le stocker en tant que chaîne, mais si vous souhaitez effectuer une recherche, par exemple, pour voir si l'adresse IP figure dans une table, vous avez besoin d'une "représentation canonique". Convertir le tout en un (grand) nombre est la bonne chose à faire. Les adresses IPv4 peuvent être stockées sous forme de long int (32 bits), mais vous avez besoin d’un nombre de 128 bits pour stocker une adresse IPv6.

Par exemple, toutes ces chaînes ont en réalité la même adresse IP: 127.0.0.1, 127.000.000.001, :: 1, 0: 0: 0: 0: 0: 0: 0: 1

3
user410119

Les gens parlent de caractères quand on peut compresser une adresse IP en données brutes.

Donc, en principe, comme nous utilisons uniquement IPv4 (32 bits) ou IPv6 (128 bits), cela signifie que vous avez besoin de 128 bits d’espace au plus, ou 128/8 = 16 octets!

Ce qui est beaucoup moins que les 39 octets suggérés (en supposant que charset est ascii).

Cela dit, vous devrez décoder et encoder l'adresse IP dans/à partir des données brutes, ce qui en soi est une chose simple à faire (je l'ai déjà fait, consultez la section ip2long() de PHP pour les adresses IP 32 bits). .

Edit:inet_pton (et son contraire, inet_ntop()) fait ce dont vous avez besoin et fonctionne avec les deux types d'adresse. Mais attention, sous Windows, il est disponible depuis PHP 5.3.

2
Christian