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

430

Je veux stocker les données renvoyées par $_SERVER["REMOTE_ADDR"]en PHP dans un champ DB, tâche assez simple, vraiment. Le problème est que je ne trouve aucune information appropriée sur la longueur maximale de la représentation textuelle d'une adresse IPv6, ce que fournit un serveur Web $_SERVER["REMOTE_ADDR"].

Je ne suis pas intéressé par la conversion de la représentation textuelle en 128 bits où l'adresse est généralement codée, je veux juste savoir combien de caractères maximum sont nécessaires pour stocker une adresse IPv6 retournée par $_SERVER["REMOTE_ADDR"].

Gilles
la source
6
Et l'indice de zone?
Robert Tupelo-Schneck
5
#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48)
Source: lxr.free-electrons.com/source/include/linux/inet.h
1
La question stackoverflow.com/questions/1076714/… a des réponses similaires mais utiles.
Edward

Réponses:

615

45 caractères .

Vous pourriez vous attendre à ce qu'une adresse soit

0000:0000:0000:0000:0000:0000:0000:0000

8 * 4 + 7 = 39

8 groupes de 4 chiffres avec 7 :entre eux.

Mais si vous avez une adresse IPv6 mappée IPv4 , les deux derniers groupes peuvent être écrits en base 10 séparés par ., par exemple. [::ffff:192.168.100.228]. Écrit entièrement:

0000:0000:0000:0000:0000:ffff:192.168.100.228

(6 * 4 + 5) + 1 + (4 * 3 + 3) = 29 + 1 + 15 = 45

Remarque, il s'agit d'une convention d'entrée / affichage - c'est toujours une adresse de 128 bits et pour le stockage, il serait probablement préférable de standardiser le format séparé par deux points, c'est- [0000:0000:0000:0000:0000:ffff:c0a8:64e4]à- dire pour l'adresse ci-dessus.

Matthew Scharley
la source
245
Les fichiers d'en-tête définissent INET6_ADDRSTRLEN comme étant 46, ce qui correspond à 45 caractères plus un zéro de fin.
wisnij
6
Il convient de noter que l'adresse IPv6 peut également contenir la zone de portée stackoverflow.com/questions/5746082/… , par exemple, vous l'obtenez de RemoteEndpointMessageProperty.Address
Rory
les adresses ipv4 ne sont-elles pas écrites comme :: ffff: 127.0.0.1?
graywolf
52
@FelipeSchenone c'est ce genre de pensée qui n'est pas utile - déterminez la taille et utilisez-la. La seule fois où vous voulez étendre un tampon, c'est si cela aide au remplissage, donc 64 caractères, mais 45 (+1) est optimal.
gbjbaanb
1
cela prend-il en compte le pourcentage de connexion à l'adresse IPv6? Refer - superuser.com/questions/99746/…
gaurav
85

Sous Linux, voir constant INET6_ADDRSTRLEN(inclure <arpa/inet.h>, voir man inet_ntop). Sur mon système (en-tête "in.h"):

#define INET6_ADDRSTRLEN 46

Le dernier caractère est pour terminer NULL, comme je le crois, donc la longueur maximale est de 45, comme les autres réponses.

Yury
la source
@eis était probablement en 2013. Peut-être incrémenté pour l'alignement des structures.
Iiridayn
13

Répondu à ma propre question:

Les adresses IPv6 sont normalement écrites sous la forme de huit groupes de quatre chiffres hexadécimaux, où chaque groupe est séparé par deux points (:).

C'est donc 39 caractères max.

Gilles
la source
7
Cependant, il y a apparemment une mise en garde, voir stackoverflow.com/a/7477384/3787376 ("Longueur maximale pour l'adresse IP du client") - Citation: "Pour les adresses IPv6 mappées IPv4, la chaîne peut contenir plus de 39 caractères.". Il indique qu'un "IPv6 mappé IPv4" comporte 45 caractères et est au format "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190". Le maximum doit donc être de 45 caractères. La réponse sur stackoverflow.com/a/166157/3787376 (cette question) semble également démontrer ce point.
Edward
6

Je pense que la réponse @Deepak dans ce lien est plus proche de la bonne réponse. Longueur maximale pour l'adresse IP du client . La taille correcte est donc 45 et non 39. Parfois, nous essayons de saisir la taille des champs, mais il semble préférable de préparer une taille de stockage suffisante.

QMaster
la source
4

Comme indiqué, une adresse ipv6 standard contient au plus 45 caractères, mais une adresse ipv6 peut également inclure un% de fin suivi d'une chaîne "scope" ou "zone", qui n'a pas de longueur fixe mais qui est généralement un petit entier positif ou une interface réseau nom, donc en réalité il peut être plus grand que 45 caractères. Les noms d'interface réseau sont généralement "eth0", "eth1", "wlan0", donc choisir 50 comme limite est probablement suffisant.

Sean F
la source
3
Certes, mais ce ne sont que des adresses locales de lien, et vous ne verrez aucune de celles-ci une fois que votre site Web fonctionnera sur Internet (et, espérons-le, même pas en le développant).
Michael Hampton
1

Méfiez-vous de certains en-têtes tels que ceux HTTP_X_FORWARDED_FORqui semblent contenir une seule adresse IP. Ils peuvent en fait contenir plusieurs adresses (une chaîne de procurations je suppose).

Ils sembleront être séparés par des virgules - et peuvent être beaucoup plus longs que 45 caractères au total - alors vérifiez avant de les stocker dans DB.

Simon_Weaver
la source
3
Un -1 légèrement en conflit (en conflit parce que je suis déjà tombé dans ce piège auparavant, et je suppose que cette réponse contient des informations pertinentes pour certaines personnes qui arriveront sur cette page) parce que ce n'est clairement pas une réponse à la question posée. Il serait probablement préférable de faire un commentaire sur la question.
Mark Amery