mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DNS Cache implementieren - sinnvoll?


Autor: Robert S. (razer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

: Verschoben durch Moderator
Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Robert S. (razer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Robert S. (razer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.