DNS Cache implementieren - sinnvoll?

OP Persönliche Seite #1382632
Hallo an alle,

Ich schreibe gerade meinen eigenen TCP/IP Stack für einen ARM Cortex M3 
und bin gerade beim DNS Resolver.

Ich habe mir überlegt ich implementiere einen Cache, indem ich die 
letzten 10 Anfragen speichere. Jeder Eintrag hat eine Leasetime die bei 
jedem Zugriff zurückgesetzt wird und nach einer bestimmten Zeit abläuft. 
Um jeden Eintrag eindeutig identifizieren zu können habe ich mir gedacht 
ich speichere eine CRC aus Querry-Adresse.

Ist dieses Konzept so eine gute Lösung?

Danke im Voraus
lg Robert
#1382793
Ich denke mal bei 10 Einträgen ist die CRC Berechnung langsamer, als wie 
wenn du in einer Schleife mittels strcmp einfach alle DNS Namen 
durchgehst.
Bei so kleinen Datenmengen muss man immer berücksichtigen, dass man 
jegliche 'Beschleuniger' auch nicht umsonst bekommt.
Moderator Persönliche Seite #1382841
Robert S. schrieb:

> Jeder Eintrag hat eine Leasetime die bei
> jedem Zugriff zurückgesetzt wird und nach einer bestimmten Zeit abläuft.

Die Antwort eines DNS-Servers beinhaltet ohnehin eine Gültigkeits-
dauer.  Das sollte deine obere Schranke für das Caching sein.  Falls
der Cache überfüllt wird, musst du ggf. vorher Einträge rauswerfen.

CRCs sind so konzipiert, dass sie bestmöglich Bitfehler bei einer
bitorientierten Übertragung erkennen können, für allgemeine Hashes
gibt's andere Algorithmen.  Wenn du sowas machst, musst du natürlich
immer die Möglichkeit von hash collisions mit einbeziehen.
OP Persönliche Seite #1383137
Karl heinz Buchegger schrieb:
> Ich denke mal bei 10 Einträgen ist die CRC Berechnung langsamer, als wie
> wenn du in einer Schleife mittels strcmp einfach alle DNS Namen
> durchgehst.
> Bei so kleinen Datenmengen muss man immer berücksichtigen, dass man
> jegliche 'Beschleuniger' auch nicht umsonst bekommt.

Da der Domainname 255 Zeichen lang sein kann, wird der DNS Chache 
ziemlich groß. Da ich RAM beschränkt bin denke ich ist es keine gute 
Idee.

Der Hash muss ja für jede Querry nur einmal generiert werden. Somit 
denke ich schon, dass es schneller ist.

Welche Hash Algorithmen sind den in einer solchen Situation passend?

lg Robert
#1383158
Robert S. schrieb:

> Der Hash muss ja für jede Querry nur einmal generiert werden. Somit
> denke ich schon, dass es schneller ist.

Du scheinst in der Vorstellung zu leben, dass es genügt nur den Hash zu 
speichern. Dem ist aber nicht so. Der Hash kann dir nur das Auffinden 
des Eintrags beschleunigen. Danach musst du sowieso noch vergleichen, ob 
die Strings übereinstimmen!

Wenn es so einfach wäre, hättest du einen perfekten 
Kompressionsalgorithmus gefunden. 255 Bytes in einen einzigen int 
quetschen, sodass jede der möglichen 255 Bytes Kombinationen einen 
eindeutigen Hash-Code hat.

Beim Hashen schmeisst man immer Information weg! Mehrere 
unterschiedliche Strings können daher denselben Hashcode erzeugen. Man 
nennt das Kollisionen. Im Extremfall (zugegeben: konstruiert) sind alle 
deine 10 Hashcodes identisch, obwohl jedesmal nach einer anderen DNS 
gesucht wurde.

> Der Hash muss ja für jede Querry nur einmal generiert werden. Somit
> denke ich schon, dass es schneller ist.

Kommt drauf an.
Um den Hashcode zu erzeugen, musst du quer durch den kompletten String. 
Ein Vergleich kann aber auch dann schon abbrechen, wenn die ersten 
beiden Bytes unterschiedlich sind.

Ich will dich nicht davon abhalten, da etwas Komplizierters zu benutzen. 
Ich möchte nur darauf hinweisen, dass es praktisch immer einen Breakeven 
Point gibt, an dem die Optimierung mehr kostet als sie bringt.
OP Persönliche Seite #1383231
Karl heinz Buchegger schrieb:
> Du scheinst in der Vorstellung zu leben, dass es genügt nur den Hash zu
> speichern. Dem ist aber nicht so. Der Hash kann dir nur das Auffinden
> des Eintrags beschleunigen. Danach musst du sowieso noch vergleichen, ob
> die Strings übereinstimmen!

Danke für die Information. Genau das dachte ich. Wieder was gelernt =)

> Ich will dich nicht davon abhalten, da etwas Komplizierters zu benutzen.
> Ich möchte nur darauf hinweisen, dass es praktisch immer einen Breakeven
> Point gibt, an dem die Optimierung mehr kostet als sie bringt.

Ich werde mal in den sauren Apfel beißen und die Domain als Klartext 
speichern. Optimieren kann man ja immer noch.

Danke für die Hilfe und noch einen schönen Tag
lg Robert

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.