Longueur maximale pour l'adresse ip du client [dupliquer]

possibilité de dupliquer:

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 des clients? Je l'ai réglé sur 16 pour l'instant, mais pourrais-je obtenir une adresse ip qui est plus longue que celle avec le protocole IPv6, etc?

225
demandé sur Community 2009-07-03 01:12:32

8 réponses

pour IPv4, vous pourrait s'en tirer avec le stockage des 4 octets bruts de l'adresse IP (chacun des nombres entre les périodes dans une adresse IP sont 0-255, i.e., un octet). Mais alors vous devez traduire aller dans et hors de la DB et c'est salissant.

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

éditer: cependant, il ya une mise en garde, voir la réponse de @Deepak pour plus de détails sur IPv4-mapped adresses IPv6. (La longueur maximale correcte de la chaîne IPv6 est 45 caractères .)

217
répondu Matt Bridges 2012-11-11 23:54:52

il y a une mise en garde avec la structure générale de 39 caractères IPv6. pour les adresses IPv4 mappées IPv6, 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

IPv4-mapped IPv6 (45 caractères):

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

Note: les derniers 32 bits (qui correspondent à L'adresse IPv4) peuvent avoir besoin d'un maximum de 15 caractères (puisque IPv4 utilise 4 groupes de 1 byte et est formaté comme 4 nombres décimaux dans la gamme 0-255 séparés par des points (le . caractère), de sorte que le maximum est DDD.DDD.DDD.DDD ).

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

il s'agissait en fait d'une question quiz dans une formation IPv6 que j'ai suivie. (Nous avons tous répondu 39!)

352
répondu Deepak 2017-04-03 14:53:48

si vous voulez manipuler 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 voulez aussi conserver des adresses IPV4 cartographiées comme des adresses IPV6, utilisez 45 comme @Deepak suggère .

23
répondu David J. Liszewski 2017-05-23 12:34:50

Prendre de quelqu'un qui a essayé tous les trois façons... il suffit d'utiliser un varchar(39)

le stockage un peu moins efficace surpasse de loin tout avantage d'avoir à le convertir sur insert/update et le formater lorsqu'on le montre n'importe où.

10
répondu Neil N 2011-05-20 18:07:23

comme décrit dans le IPv6 Wikipedia article,

Les adresses

IPv6 s'écrivent normalement comme suit: huit groupes de quatre hexadécimal chiffres, où chaque groupe est séparé par un deux-points (:)

une adresse IPv6 typique:

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

ça fait 39 caractères. Les adresses IPv6 sont de 128 bits, donc vous pouvez utiliser une colonne binaire(16), mais je pense que je devrais coller avec une représentation alphanumérique.

8
répondu Michael Petrotta 2009-07-02 21:24:05

IPv4 utilise 32 bits, sous la forme de:

255.255.255.255

je suppose que cela dépend de votre type de données, si vous stockez simplement comme une chaîne avec un type CHAR ou si vous utilisez un type numérique.

IPv6 utilise 128 bits. Vous n'aurez pas D'IPs plus longtemps que ça à moins que vous incluiez d'autres informations avec eux.

IPv6 est regroupé en ensembles de 4 chiffres hexadécimaux séparés par des colons, comme (de wikipedia):

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

vous êtes sûr de le stocker comme une longue chaîne de 39 caractères, si vous souhaitez le faire. Il y a aussi d'autres façons d'écrire des adresses. Les ensembles de zéros peuvent être tronqués en un seul 0, ou les ensembles de zéros peuvent être cachés complètement par un double côlon.

2
répondu Chet 2009-07-02 21:30:09

si vous voulez simplement le stocker pour référence, vous pouvez le stocker comme une chaîne, mais si vous voulez faire une recherche, par exemple, pour voir si l'adresse IP est dans une table, vous avez besoin d'une" représentation canonique."Convertir toute la chose en un (grand) nombre est la bonne chose à faire. Les adresses IPv4 peuvent être stockées en tant que 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 sont en fait la même adresse IP: 127.0.0.1, 127.000.000.001, ::1, 0:0:0:0:0:0:0:1

2
répondu user410119 2010-08-03 20:41:43

les gens parlent de caractères quand on peut compresser une adresse IP dans des données brutes.

donc en principe, puisque nous n'utilisons que IPv4 (32bit) ou IPv6 (128bit), cela signifie que vous avez besoin au plus 128 bits d'espace, ou 128/8 = 16 octets !

ce qui est beaucoup moins que les 39 octets suggérés (en supposant que le jeu de caractères est ascii).

cela dit, vous devrez Décoder et encoder L'adresse IP dans / à partir du raw données, ce qui en soi est une chose triviale à faire (je l'ai déjà fait, voir ip2long() de PHP pour 32 bits IPs).

Edit: inet_pton (et son opposé, inet_ntop() ) fait ce que vous avez besoin, et fonctionne avec tous les types d'adresse. Mais attention, sur Windows il est disponible depuis PHP 5.3.

2
répondu Christian 2014-05-17 11:25:16