Frage

Im Anschluss an dieser Beitrag ich IPv6-Adresse interessiert bin Bereich bei der Suche.

Unter IPv4 ich wäre in der Lage, die Start- und End-IP-Adressen von einem ISP und Verwendung dieser Integer-Werte als Bereich Grenzen schnell eine Datenbank, um zu sehen suchen zur Verfügung gestellt, um zu bestimmen, ob irgendwelche Einträge in der DB in diesem Bereich fiel.

Wie wird dies von IPv6 betroffen sein? Wird ISPs noch IPv6-Adressen in Bereichen haben, wie sie es jetzt tun? Und wie würden Sie effizient diese Bereiche suchen, wenn Sie die IPv6-Adressen als zwei Bigint die in einer SQL Server-DB wurden Speicherung?

War es hilfreich?

Lösung

Es ist nicht richtig IP-Adressen zu verwenden (weder IPv4, IPv6 noch) in Bereichen. Die richtige Art und Weise eine bestimmte „Reichweite“ von IP-Adressen zu einer Gruppe wird mit Präfixen (CIDR-Notation) oder Masken (veraltet, nur gültig für IPv4 und Wahnsinn ergibt sich, wenn Sie versuchen, eine nicht zusammenhängende Maske verwenden).

Manchmal sehen Sie jemanden (manchmal sogar Anwendungen, Home-Router, etc.) mit IPv4 reicht, aber das ist nur der falsche Weg, es zu tun.

Mit Classless Inter-Domain Routing (CIDR) ein Tupel haben , wobei Adresse ist eine 128-bit unsignierte ganze Zahl und Präfix ist ein winziges (0..128) unsigned integer. Das Präfix gibt an, wieviele höchstwertigen Bits der Adresse der Netzwerkadresse darstellt, so dass die anderen 128-Präfix niedrigstwertigen Bits, die einen bestimmten Host in diesem Netzwerk vertreten.

So zum Beispiel einer IPv6 "Reichweite" von 2620: 0: 860: 2 :: / 64 (wikimedia.org) repräsentiert alle Rechner von 2620: 0: 860: 2 :: bis zu 2620: 0: 860 : 2: FFFF: FFFF: FFFF:. FFFF

Sie sollten nicht zwei „bigint“ s verwenden so zu speichern, einen Wert in einer Datenbank, sondern verwenden eine beliebige nativen Darstellung in einer einzigen Spalte, wenn Sie Ihren Entwickler Leben machen wollen einen Alptraum. Wenn Ihr DBMS nicht ganze Zahlen unterstützt dieses große, neben Ihrem DBMS zu ersetzen, ich schlage vor, mit einem festen Größe binäre Datenspalten, 16 Byte lang.

Andere Tipps

für Adressen IPv6 ein DBMS mit der richtigen Unterstützung verwenden wäre keine schlechte sein Idee. Hier ist ein Beispiel mit PostgreSQL, Version 8.3:

mydb=> CREATE TABLE Networks (name TEXT, prefix INET);
CREATE TABLE
mydb=> INSERT INTO Networks VALUES ('Documentation', '2001:DB8::/32');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('ULA', 'FC00::/7');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('Orchid', '2001:10::/28');
INSERT 0 1

mydb=> SELECT * FROM Networks;
 name      |    prefix     
---------------+---------------
 Documentation | 2001:db8::/32
 ULA           | fc00::/7
 Orchid        | 2001:10::/28
(3 rows)

mydb=> SELECT * FROM Networks WHERE '2001:DB8::dcaf:BAD' << prefix;
 name      |    prefix     
---------------+---------------
 Documentation | 2001:db8::/32
(1 row)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top