it-swarm.com.de

Maximale Länge für Client-IP-Adresse

Mögliches Duplikat:
Maximale Länge der Textdarstellung einer IPv6-Adresse?

Was würden Sie als maximale Größe für eine Datenbankspalte empfehlen, in der Client-IP-Adressen gespeichert sind? Ich habe es jetzt auf 16 gesetzt, aber könnte ich eine IP-Adresse bekommen, die länger ist als die mit IPv6 usw.?

257

Bei IPv4 könnten Sie mit dem Speichern der 4 unformatierten Bytes der IP-Adresse (jede der Zahlen zwischen den Punkten in einer IP-Adresse ist 0) davonkommen . 255, dh ein Byte). Aber dann müsste man in die DB rein und raus übersetzen und das ist chaotisch.

IPv6-Adressen sind 128 Bit (im Gegensatz zu 32 Bit IPv4-Adressen). Sie werden normalerweise als 8 Gruppen mit 4 Hexadezimalziffern geschrieben, die durch Doppelpunkte getrennt sind: 2001:0db8:85a3:0000:0000:8a2e:0370:7334. Zum Speichern von IPv6-Adressen in diesem Format sind 39 Zeichen angemessen.

Bearbeiten: Es gibt jedoch eine Einschränkung. Weitere Informationen zu IPv4-zugeordneten IPv6-Adressen finden Sie in der Antwort von @ Deepak. (Die korrekte maximale IPv6-Zeichenfolgenlänge beträgt 45 Zeichen.)

257
Matt Bridges

Es gibt eine Einschränkung bei der allgemeinen 39-stelligen IPv6-Struktur. Bei IPv4-zugeordneten IPv6-Adressen kann die Zeichenfolge länger sein (als 39 Zeichen). Ein Beispiel, um dies zu zeigen:

IPv6 (39 Zeichen):

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

IPv4-zugeordnetes IPv6 (45 Zeichen):

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

Hinweis: Die letzten 32-Bits (die der IPv4-Adresse entsprechen) können bis zu 15 Zeichen enthalten (da IPv4 4 1-Byte-Gruppen verwendet und als 4 durch Punkte getrennte Dezimalzahlen im Bereich von 0 bis 255 formatiert ist (das . Zeichen), also ist das Maximum DDD.DDD.DDD.DDD).

Die korrekte maximale IPv6-Zeichenfolgenlänge beträgt daher 45.

Dies war eigentlich eine Quizfrage in einem IPv6-Training, an dem ich teilgenommen habe. (Wir haben alle 39 beantwortet!)

406
Deepak

Wenn Sie mit IPV6 in Standardnotation arbeiten möchten, gibt es 8 Gruppen mit jeweils 4 Hexadezimalziffern:

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

32 Hexadezimalstellen + 7 Trennzeichen = 39 Zeichen.

ACHTUNG: Wenn Sie auch IPV4-Adressen speichern möchten, die als IPV6-Adressen zugeordnet sind, verwenden Sie 45 Zeichen als @ Deepak schlägt vor .

25

Nimm es von jemandem, der es auf drei Arten ausprobiert hat ... benutze einfach einen varchar (39)

Der etwas weniger effiziente Speicher überwiegt bei weitem den Vorteil, dass er beim Einfügen/Aktualisieren konvertiert und formatiert werden muss, wenn er überall angezeigt wird.

11
Neil N

Wie im IPv6 Wikipedia Artikel beschrieben,

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

Eine typische IPv6-Adresse:

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

Dies ist 39 Zeichen lang. IPv6-Adressen sind 128 Bit lang, sodass Sie möglicherweise eine binäre (16) Spalte verwenden könnten, aber ich denke, ich würde mich an eine alphanumerische Darstellung halten.

9

IPv4 verwendet 32 ​​Bit in Form von:

255.255.255.255

Ich nehme an, es hängt von Ihrem Datentyp ab, ob Sie nur einen String mit einem CHAR-Typ speichern oder einen numerischen Typ verwenden.

IPv6 verwendet 128 Bit. Sie werden keine längeren IPs haben, es sei denn, Sie fügen andere Informationen hinzu.

IPv6 ist in Gruppen von 4 Hexadezimalziffern gruppiert, die durch Doppelpunkte getrennt sind, wie (aus Wikipedia):

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

Sie können es sicher als 39-stellige Zeichenfolge speichern, falls Sie dies wünschen. Es gibt aber auch andere Möglichkeiten, Adressen zu schreiben. Nullensätze können auf eine einzelne 0 abgeschnitten werden, oder Nullensätze können durch einen Doppelpunkt vollständig ausgeblendet werden.

3
Chet

Wenn Sie es nur als Referenz speichern, können Sie es als Zeichenfolge speichern. Wenn Sie jedoch beispielsweise nachschlagen möchten, ob sich die IP-Adresse in einer Tabelle befindet, benötigen Sie eine "kanonische Darstellung". Es ist richtig, das Ganze in eine (große) Zahl umzuwandeln. IPv4-Adressen können als langes int (32 Bit) gespeichert werden, zum Speichern einer IPv6-Adresse benötigen Sie jedoch eine 128-Bit-Nummer.

Beispielsweise haben alle diese Zeichenfolgen dieselbe IP-Adresse: 127.0.0.1, 127.000.000.001, :: 1, 0: 0: 0: 0: 0: 0: 0: 0: 1

3
user410119

Man spricht von Zeichen, wenn man eine IP-Adresse in Rohdaten komprimieren kann.

Da wir also nur IPv4 (32 Bit) oder IPv6 (128 Bit) verwenden, benötigen Sie im Prinzip höchstens 128 Bit Speicherplatz oder 128/8 = 16 Byte!

Das ist viel weniger als die vorgeschlagenen 39 Bytes (vorausgesetzt, Zeichensatz ist ASCII).

Das heißt, Sie müssen die IP-Adresse in/aus den Rohdaten dekodieren und kodieren, was an sich eine triviale Sache ist (ich habe es bereits getan, siehe PHPs ip2long() für 32-Bit IPs).

Edit:inet_pton (Und das Gegenteil, inet_ntop()) macht das, was Sie brauchen, und funktioniert mit beiden Adresstypen. Aber Vorsicht, unter Windows ist es verfügbar seit PHP 5.3.

2
Christian