Maximale Länge der Textdarstellung einer IPv6-Adresse?

430

Ich möchte die von $_SERVER["REMOTE_ADDR"]PHP zurückgegebenen Daten in einem DB-Feld speichern , eigentlich eine ziemlich einfache Aufgabe. Das Problem ist, dass ich keine richtigen Informationen über die maximale Länge der Textdarstellung einer IPv6-Adresse finden kann, die ein Webserver bereitstellt $_SERVER["REMOTE_ADDR"].

Ich bin nicht daran interessiert, die Textdarstellung in die 128 Bit zu konvertieren, in denen die Adresse normalerweise codiert ist. Ich möchte nur wissen, wie viele Zeichen maximal erforderlich sind, um eine von zurückgegebene IPv6-Adresse zu speichern $_SERVER["REMOTE_ADDR"].

Gilles
quelle
6
Was ist mit dem Zonenindex?
Robert Tupelo-Schneck
5
#define INET_ADDRSTRLEN (16) #define INET6_ADDRSTRLEN (48)
Quelle: lxr.free-electrons.com/source/include/linux/inet.h
1
Die Frage stackoverflow.com/questions/1076714/… enthält einige ähnliche, aber nützliche Antworten.
Edward

Antworten:

615

45 Zeichen .

Sie können eine Adresse erwarten

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

8 * 4 + 7 = 39

8 Gruppen mit 4 Ziffern mit 7 :dazwischen.

Wenn Sie jedoch eine IPv4-zugeordnete IPv6-Adresse haben , können die letzten beiden Gruppen in Basis 10 geschrieben werden, die durch .z. [::ffff:192.168.100.228]. Vollständig ausgeschrieben:

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

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

Beachten Sie, dass dies eine Eingabe- / Anzeigekonvention ist - es handelt sich immer noch um eine 128-Bit-Adresse. Für die Speicherung ist es wahrscheinlich am besten, das durch Doppelpunkte getrennte Format zu standardisieren, dh [0000:0000:0000:0000:0000:ffff:c0a8:64e4]für die oben angegebene Adresse.

Matthew Scharley
quelle
245
Header-Dateien definieren INET6_ADDRSTRLEN als 46, was mit 45 Zeichen plus einer nachgestellten Null übereinstimmt.
Wisnij
6
Es ist erwähnenswert , dass die IPv6-Adresse möglicherweise auch die Bereichszone stackoverflow.com/questions/5746082/… enthält , z. B. erhalten Sie diese von RemoteEndpointMessageProperty.Address
Rory
Sind IPv4-Adressen nicht wie :: ffff: 127.0.0.1 geschrieben?
Graywolf
52
@FelipeSchenone ist diese Art des Denkens, die nicht nützlich ist - finde die Größe heraus und benutze sie. Das einzige Mal, wenn Sie einen Puffer erweitern möchten, ist, wenn er beim Auffüllen von 64 Zeichen hilft, aber 45 (+1) ist das Optimum.
Gbjbaanb
1
Berücksichtigt dies das prozentuale Vorzeichen in der IPv6-Adresse? Siehe - superuser.com/questions/99746/...
gaurav
85

Unter Linux siehe Konstante INET6_ADDRSTRLEN(einschließlich <arpa/inet.h>, siehe man inet_ntop). Auf meinem System (Header "in.h"):

#define INET6_ADDRSTRLEN 46

Das letzte Zeichen dient zum Beenden von NULL, wie ich glaube, also beträgt die maximale Länge 45, wie andere Antworten.

Yury
quelle
2
Was ist das für eine 48, die ich sehe? github.com/torvalds/linux/blob/master/include/linux/inet.h#L50
Eis
@eis war wahrscheinlich im Jahr 2013. Möglicherweise für die Strukturausrichtung erhöht.
Iiridayn
13

Beantwortete meine eigene Frage:

IPv6-Adressen werden normalerweise als acht Gruppen mit vier hexadezimalen Ziffern geschrieben, wobei jede Gruppe durch einen Doppelpunkt (:) getrennt ist.

Das sind also maximal 39 Zeichen.

Gilles
quelle
7
Es gibt jedoch anscheinend eine Einschränkung, siehe stackoverflow.com/a/7477384/3787376 (" Maximale Länge für Client-IP-Adresse") - Zitat: "Bei IPv4-zugeordneten IPv6-Adressen kann die Zeichenfolge länger als 39 Zeichen sein." Es heißt, dass ein "IPv4-zugeordnetes IPv6" 45 Zeichen hat und das Format "NNNN: NNNN: NNNN: NNNN: NNNN: NNNN: 192.168.158.190" hat. Das Maximum sollte daher 45 Zeichen betragen. Die Antwort unter stackoverflow.com/a/166157/3787376 (diese Frage) scheint diesen Punkt ebenfalls zu demonstrieren.
Edward
6

Ich denke, @ Deepak Antwort in diesem Link ist näher an der richtigen Antwort. Maximale Länge für die Client-IP-Adresse . Die richtige Größe ist also 45, nicht 39. Manchmal versuchen wir, die Feldgröße einzuschränken, aber es scheint besser zu sein, wenn wir genügend Speichergröße vorbereiten.

QMaster
quelle
4

Wie angegeben, besteht eine Standard-IPv6-Adresse aus höchstens 45 Zeichen. Eine IPv6-Adresse kann jedoch auch eine Endung% enthalten, gefolgt von einer Zeichenfolge "Bereich" oder "Zone", die keine feste Länge hat, aber im Allgemeinen eine kleine positive Ganzzahl oder eine Netzwerkschnittstelle ist Name, also kann es in Wirklichkeit größer als 45 Zeichen sein. Netzwerkschnittstellennamen sind normalerweise "eth0", "eth1", "wlan0", daher ist es wahrscheinlich gut genug, 50 als Limit zu wählen.

Sean F.
quelle
3
Stimmt, aber dies sind nur linklokale Adressen, und Sie werden keine davon sehen, sobald Ihre Website im Internet ausgeführt wird (und hoffentlich nicht einmal während der Entwicklung).
Michael Hampton
1

Achten Sie auf bestimmte Header HTTP_X_FORWARDED_FOR, die anscheinend nur eine einzige IP-Adresse enthalten. Sie können tatsächlich mehrere Adressen enthalten (eine Kette von Proxys, nehme ich an).

Sie scheinen durch Kommas getrennt zu sein - und können insgesamt viel länger als 45 Zeichen sein - überprüfen Sie dies, bevor Sie sie in der Datenbank speichern.

Simon_Weaver
quelle
3
Ein leicht konfliktiertes -1 (konfliktreich, weil ich zuvor in diese Falle geraten bin und diese Antwort vermutlich Informationen enthält, die für einige Personen relevant sind, die auf dieser Seite ankommen werden), da dies jedoch eindeutig keine Antwort auf die gestellte Frage ist. Es wäre wahrscheinlich besser als Kommentar zur Frage.
Mark Amery