Frage

Für meine Server-Anwendung, muss ich überprüfen, ob eine IP-Adresse in unserer schwarzen Liste ist.

Was ist der effizienteste Weg, die IP-Adressen zu vergleichen? Würde die IP-Adresse umzuwandeln, sie effizient zu integer und zu vergleichen?

War es hilfreich?

Lösung

Abhängig welche Sprache Sie verwenden, aber eine IP-Adresse ist in der Regel als 32-Bit-Ganzzahl, zumindest auf der Vermittlungsschicht gespeichert, Vergleiche recht schnell. Auch wenn es nicht, es sei denn, Sie eine Hochleistungs-Paketvermittlungs Entwicklung neuer Anwendungen sind ist es nicht wahrscheinlich, eine Performance-Engpass sein. Vermeiden Sie vorzeitige Optimierung. - Planung Ihr Programm für die Testbarkeit und Skalierbarkeit und wenn Sie Performance-Probleme haben, dann können Sie einen Profiler verwenden, um zu sehen, wo die Engpässe sind

Edit: zu klären, werden IPv4-Adressen als 32-Bit-Integer gespeichert, sowie eine Netzmaske (die IP-Adresse Vergleiche nicht erforderlich ist). Wenn Sie den neueren und noch seltener IPv6 verwenden, dann werden die Adressen lang 128 Bits sein.

Andere Tipps

32-Bit-Integer sind der Weg zu gehen -., Bis Sie mit 128-Bit-IPv6-Adressen zu tun beginnen

Sie meinen, wenn Sie es als Textzeichenfolge vergleichen sollten oder int umwandeln als int in int und vergleichen?

Das ist normalerweise nicht der Engpass in dieser Art von Lookups. Sie können nur versuchen, beide Methoden zu implementieren und sehen, die man schneller läuft.

Das eigentliche Problem mit der IP-Adresse Lookup macht in der Regel eine effiziente Abfragen, unter Ausnutzung der Tatsache, dass Sie mit IP-Adressen handelt und nicht nur Zufallszahlen. um dies zu erreichen können Sie Nachschlag LC Trie und vielleicht dieser Artikel

Offensichtlich sollten Sie interessieren nur, wenn die schwarze Liste Zehntausende oder Millionen von Einträgen enthält. Wenn es nur 10-20 Einträge eine lineare Suche hat bevorzugt werden soll, und in der Tat die interessantere Frage ist Textvergleich vs integer Vergleich.

static public bool IsEqual(string ToCompare,
                                      string CompareAgainst)
  {

     return IPAddressToLongBackwards(ToCompare)==IPAddressToLongBackwards(CompareAgainst);
  }

static private uint IPAddressToLongBackwards(string IPAddr)
  {
     System.Net.IPAddress oIP=System.Net.IPAddress.Parse(IPAddr);
     byte[] byteIP=oIP.GetAddressBytes();


     uint ip=(uint)byteIP[0]<<24;
     ip+=(uint)byteIP[1]<<16;
     ip+=(uint)byteIP[2]<<8;
     ip+=(uint)byteIP[3];

     return ip;
  }

Wenn ich Sie richtig verstanden habe, ist dieser Code zwei IP-Adressen zu vergleichen. Willst du das? Sie können weiterhin solche Dinge wie:

static public bool IsGreater(string ToCompare,
                               string CompareAgainst)
  {

     return IPAddressToLongBackwards(ToCompare)>
        IPAddressToLongBackwards(CompareAgainst);
  }

, weil Sie die Adresse Bytes bekommen.

Ja, ich habe festgestellt, dass effizient zu sein, wird es aber ein langer sein, und natürlich haben Sie indizieren die schwarze Liste gesetzt IPs in ganzzahligen Form.

ein Tool wie Peerguardian verwenden, die auf einer schwarzen Liste zu IPs auf Treiberebene eingehende TCP / IP-Verbindungen nicht zulässt. Hochsichere, benötigt kein Code (wohl: hochsichere, weil kein Code erforderlich).

Ich habe dies getan, und ich habe es getestet, ein unsigned int mit (32 Bit) ist die schnellst -. Ich gehe davon aus, dass Sie dies mit der Stringdarstellung sind zu vergleichen

Eine andere Sache, die helfen könnten Sie, wenn Sie die Tabelle erstellen, in der Vergangenheit habe ich 2 colums hatte: LowIP und HighIP; auf diese Weise konnte ich ganze Bereiche von IP-Adressen mit 1 Datensatz Eintritt in der schwarzen Liste und immer noch gute Leistung im Bereich des IP-Überprüfung.

ich einmal geerbt Code, wo jemand dachte , dass das Speichern von IP-Adressen als 4 int ist eine wirklich gute Sache war, es sei denn sie alle Umwandlung ihrer Zeit damit verbracht zu / von int ist.

sie als Zeichenfolgen in der Datenbank zu halten war viel einfacher, und es bedurfte nur einen einzigen Index. Sie werden überrascht sein, wie gut SQL Server kann Index Strings als 4 Spalten von ganzen Zahlen entgegengesetzt. Aber diese IP-Liste war nicht für die schwarze Liste. Eine Datenbank Round-Trip ist ziemlich teuer.

Wenn eine Datenbank übertrieben, speichern sie in einem Wörterbuch im Speicher, aber das ist nur eine Vermutung, da wir keine Ahnung haben, wie viele Sie vergleichen müssen. Da die meisten Hashcodes 32-Bit-int die sind, und IPv4-Adressen sind 32 Bits, sich die IP-Adresse kann nur eine gute Hash-Code sein.

Aber wie andere darauf hin, die beste Option könnte sein, die Last auf dem Server zu reduzieren und spezielle Hardware kaufen. Vielleicht halten Sie vor kurzem im Speicher IP schwarze Liste gesetzt und in regelmäßigen Abständen an den Router neu jemandes veröffentlichen.

Wenn Sie derjenige versuchen, einige Software in einem Router zu machen, dann müssen Sie Ihre Daten-Strukturen Buch heraus fischen und schaffen so etwas wie ein B-Baum.

Der Radix oder PATRICIA Trie ist die optimale Struktur für diese.

Überprüfen Sie die C-Quelle für flow-tools aus: http://www.splintered.net/sw/flow-tools/

Ich arbeitete an vor Jahren.

Haben Sie ein bestehendes Problem mit Effizienz?

Wenn ja, dann mit allen Mitteln nach dem Code (oder Pseudo-Code) und wir können an der Leiche holen.

Wenn nicht, dann würde ich vorschlagen, etwas versuchen, einfach wie die Einträge in einer sortierten Liste zu speichern und Ihre Umgebung vorhandene Sort() und Find() verwendet wird.

Integer-Vergleiche sind viel schneller als String-Vergleiche.

Wenn Sie die ganzen Zahlen in einer sortierten Liste speichern, können Sie sie schneller finden als in einer unsortierten Liste.

Wenn Sie die IP-Adresse als String empfangen, es in einen String zu vergleichen kann effizienter sein als es die Umwandlung Darstellung nach integer

, aber ich würde beiden Lösungen Profil sicher sein, wenn ein paar Millisekunden (ns!) Auf dieser Operation Materie gehen; -)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top