<?xml version="1.0"?>
<!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.de.xsl"?>
<modulesynopsis metafile="mod_unique_id.xml.meta">

<name>mod_unique_id</name>
<description>Stellt eine Umgebungsvariable mit einer eindeutigen Bezeichnung
f&uuml;r jede Anfrage zur Verf&uuml;gung.</description>
<status>Erweiterung</status>
<sourcefile>mod_unique_id.c</sourcefile>
<identifier>unique_id_module</identifier>

<summary>

    <p>Dieses Modul stellt eine Umgebungsvariable mit einer
    Bezeichnung f&uuml;r jede Anfrage zur Verf&uuml;gung, die unter bestimmten
    Bedingungen f&uuml;r jede Anfrage eindeutig ist. Diese Bezeichnung
    ist auch f&uuml;r unterschiedliche Rechner eines korrkt konfiguierten
    Rechnerblocks eindeutig. Die Umgebungsvariable <code>UNIQUE_ID</code>
    wird f&uuml;r jede Anfrage gesetzt. Eindeutige Bezeichnungen werden f&uuml;r
    verschiedene Zwecke ben&ouml;tigt, die &uuml;ber den Rahmen des eigentlichen
    Dokuments hinausgehen.</p>
</summary>

<section id="theory">
    <title>Hintergrund</title>

    <p>Es folgt eine kurze Zusammenfassung der Funktionsweise des
     Apache-Servers unter Unix funktioniert. (Unter Windows NT wird dieses
     Modul nicht unterst&uuml;tzt.) Auf Unix-Rechnern erzeugt der Apache
     mehrere Kindprozesse f&uuml;r jeweils eine Anfrage. Jeder Kindprozess kann
     w&auml;hrend seiner Lebensdauer mehrere Anfragen bedienen. Im Zusammenhang
     dieser Erl&auml;uterung wird davon ausgegangen, dass die Kindprozesse keine
     Daten gemeinsam nutzen. Sie werden als HTTPD-Prozesse bezeichnet.</p>

    <p>Die Website operiert mit einem oder mehreren Rechnern, die in
    ihrer Gesamtheit als Cluster bezeichnet werden. Jeder Rechner kann mehrere
    Apache-Instanzen ausf&uuml;hren, die hier in ihrer Gesamtheit als
    "Universum" bezeichnet werden. Unter bestimmten Voraussetzungen kann dieses
    Universum eindeutige Bezeichnungen f&uuml;r jede Anfrage erzeugen, ohne 
dass daf&uuml;r
    eine ausf&uuml;hrlichere Kommunikation zwischen den Rechnern des Clusters
    erforderlich ist.</p>

    <p>Die Rechner des Clusters sollten die folgenden Anforderungen 
erf&uuml;llen
    (selbst wenn nur ein Rechner vorhanden ist, sollte des Uhr mit
    NTP synchronisiert werden):</p>

    <ul>
      <li>Die Uhrzeit des Rechners wird &uuml;ber NTP oder ein anderes
      Netzwerkprotokoll synchronisiert.</li>

      <li>Die Host-Namen der Rechner unterscheiden sich voneinander, so
      dass das Modul eine Suche nach Host-Namen durchf&uuml;hren kann und
      f&uuml;r jeden Rechner des Clusters eine andere IP-Adresse 
erh&auml;lt.</li>
    </ul>

    <p>Hinsichtlich des Betriebssystems wird davon ausgegangen, dass die
    Pids (Prozess-IDs) 32 Bit gro&szlig; sind. Verwendet das Betriebssystem 
mehr als
    32 Bit f&uuml;r eine Pid, dann l&auml;sst sich der Code leicht anpassen.</p>

    <p>Ausgehend von diesen Voraussetzungen, kann zu einem bestimmten
    Zeitpunkt jeder HTTPD-Prozess eines beliebigen Rechners aus dem
    Cluster von allen anderen HTTPD-Prozessen unterschieden werden. Hierf&uuml;r
    reichen die IP-Adresse des Rechners und die Pid des HTTPD-Prozesses
    aus. Um eindeutige Bezeichnungen f&uuml;r jede Anfrage erzeugen zu 
k&ouml;nnen,
    m&uuml;ssen lediglich die verschiedenen Zeitpunkte unterschieden werden.</p>

    <p>F&uuml;r diese Unterscheidung wird ein Unix-Zeitstempel
    (die seit dem 1. Januar 1970 (UTC) vergangegenen Sekunden) und ein
    16-Bit-Z&auml;hler verwendet. Der Zeitstempel hat nur eine Genauigkeit von
    einer Sekunde, weshalb mit dem Z&auml;hler 65.536 Werte
    innerhalb einer Sekunde erzeugt werden. Dieses Quartett aus
    <code>ip_addr</code>,
    <code>pid</code>, <code>time_stamp</code> und Z&auml;hler reicht
    aus, um 65.536 Anfragen pro Sekunde und HTTPD-Prozess zu
    nummerieren. Die Tatsache, dass die Prozess-IDs im Laufe der
    Zeit wiederverwendet werden, wird durch den Z&auml;hler abgefangen.</p>

    <p>Wird ein HTTPD-Kindprozess erzeugt, wird der Z&auml;hler mit
    dem Restwert der Division der Anzahl der vergangenen Mikrosekunden
    durch 10 dividiert durch 65.536 initialisiert, um Varianzprobleme
    mit den niederwertigen Bits des Mikrosekunden-Zeitgebers einiger
    Systeme zu vermeiden. F&uuml;r das Erzeugen einer eindeutigen Bezeichnung
    wird der Zeitstempel der Eingangszeit der Anfrage beim Webserver benutzt.
    Der Z&auml;hler wird beim Erzeugen einer Bezeichnung immer
    inkrementiert (und darf &uuml;berlaufen).</p>

    <p>Der Serverkern erzeugt beim Aufspalten jedes Prozesses eine Pid
    (bei vielen Unix-Systemen ist sie 16 Bit und bei neueren 32 Bit 
gro&szlig;), bei
    der es irgendwann zum &Uuml;berlauf und damit zur Wiederverwendung der
    Pids kommt. Erfolgt diese Wiederverwendung jedoch nicht innerhalb der
    gleichen Sekunde, wird die Eindeutigkeit des Quartetts nicht gest&ouml;rt. 
Es wird also
    davon ausgegangen, dass das System nicht mehr als 65.536 Prozesse
    pro Sekunde startet (bei einigen Unix-Systemen k&ouml;nnen es zwar bis zu
    32.768 Prozessen sein, was allerdings sehr unwahrscheinlich ist).</p>

    <p>Wiederholt sich die Zeit aus irgendwelchen Gr&uuml;nden (wenn 
beispielsweise
    die Systemuhr zur&uuml;ckgegestellt wird), kann es zu einer
    Wiederverwendung der Pid und des Zeitstempels kommen, was durch
    die Initialisierung des Z&auml;hler aufgefangen werden soll. Er soll mit 
einer
    echten Zufallszahl initialisiert werden, die aber bei den meisten Systemen 
nicht
    zur Verf&uuml;gung steht (die Funktion <code>rand()</code> kann nicht
    verwendet werden, weil  der Generator bei einer Zeitaufl&ouml;sung von einer
    Sekunde mit der gleichen Zeit operieren w&uuml;rde). Diese L&ouml;sung ist 
nicht perfekt.
    </p>

    <p>Wie gut ist die L&ouml;sung? Angenommen ein Rechner bedient
    500 Anfragen pro Sekunde (was eine realistische Obergrenze ist, weil die
    Systeme in der Regel mehr leisten, als nur statische Dateien zu 
verschieben).
    Hierf&uuml;r ben&ouml;tigt er eine Reihe von Kindprozessen, deren Zahl von
    der Anzahl der konkurrierenden Clients abh&auml;ngt. Bei einer 
pssimistischen
    Einsch&auml;tzung kann ein einzelner Kindprozess bis zu 500 Anfragen pro
    Sekunde bedienen. Daraus ergeben sich 1.000 m&ouml;gliche Anfangswerte 
f&uuml;r den
    Z&auml;hler, so dass sich zwei Sequenzen von 500 Anfragen &uuml;berlappen. 
Bei einer
    Zeitwiederholung und einer Zeitaufl&ouml;sung in Sekunden besteht daher eine
    Wahrscheinlichkeit von 1,5 % f&uuml;r eine Wiederholung des 
Z&auml;hlerwertes und
    f&uuml;r eine Aufhebung der Eindeutigkeit. Dies ist eine sehr pessimistische
    Ausgangssituation, die in der Praxis wahrscheinlich nicht eintreten wird.
    Ist ein Rechner so beschaffen, dass dennoch eine Chance besteht, dass diese
    Situation eintritt, dann sollte ein 32-Bit-Z&auml;hler benutzt werden 
(hierf&uuml;r
    muss der Code ge&auml;ndert werden).</p>

    <p>Das Zur&uuml;ckstellen der Zeit bei der Umstellung von Winter- und 
Sommerzeit
    kann au&szlig;er Acht gelassen werden, weil die hier verwendte UTC-Zeit 
immer
    vorgestellt wird. Bei x86-Unixrechnern kann eine korrekte Konfiguration
    erforderlich sein. Die Uhr der Hauptplatine muss f&uuml;r die Kompensation 
auf
    UTC-Zeit eingestellt werden. Bei Verwendung des NTP-Protokolls ist die
    UTC-Zeit aber unmittelbar nach dem Rechnerstart korrekt.</p>

    <p>Die Umgebungsvariable <code>UNIQUE_ID</code>  wird durch
    Verschl&uuml;sselung des 112 Bit gro&szlig;en Quartetts (32-Bit-IP-Adresse,
    32-Bit-Pid, 32-Bit-Zeitstempel, 16-Bit-Z&auml;hler) mit Hilfe des Alphabets
    <code>[EMAIL PROTECTED]</code> in einer mit der 
MIME-base64-Verschl&uuml;sselung
    vergleichbaren Form mit 19 Zeichen konstruiert. Das MIME-base64-Alphabet
    umfasst eigentlich die Zeichen <code>[A-Za-z0-9+/]</code>, die Zeichen
    <code>+</code> und <code>/</code> m&uuml;ssen in URLs jedoch speziell
    kodiert werden und sind daher nicht so erw&uuml;nscht. Alle Werte werden
    in der Netzwerk-Bytereihenfolge kodiert, so dass die Verschl&uuml;sselung
    bei Architekturen mit unterschiedlicher Bytereihenfolge vergleichbar ist. 
Die
    tats&auml;chliche Reihenfolge der Verschl&uuml;sselung lautet: Zeitstempel, 
IP-Adresse,
    Pid, Z&auml;hler. Diese Reihenfolge hat einen Sinn und sollte von
    Verschl&uuml;sselungsprogrammen nicht durcheinander gebracht werden.
    Programme sollten die komplette kodierte <code>UNIQUE_ID</code>
    als in sich geschlossene Einheit betrachten, die nur mit anderen
    <code>UNIQUE_ID</code>-Variablen auf Gleichheit verglichen
    werden kann.</p>

    <p>Die Reihenfolge wurde gew&auml;hlt, damit die Verschl&uuml;sselung 
ge&auml;ndert werden
    kann, ohne dass es Probleme mit vorhandenen
    <code>UNIQUE_ID</code>-Datenbank gibt. Bei den neuen
    Verschl&uuml;sselungen sollte der Zeitstempel ebenfalls an erster Stelle 
stehen
    und das gleiche Alphabet und die Bitl&auml;nge in anderer Weise verwendet
    werden. Da die Zeitstempel im Wesentlichen eine ansteigende Sequenz sind,
    reicht ein Sekunden-Flag f&uuml;r die Sekunde aus, zu der alle Rechner des 
Clusters 
    die Verarbeitung von Anfragen unterbrechen, das Verschl&uuml;sselungsformat
    wechseln und anschlie&szlig;end die Arbeit mit der neuen 
Verschl&uuml;sselung wieder
    aufnehmen.
    </p>

    <p>Diese tragbare L&ouml;sung kann auch f&uuml;r Multithread-Systeme wie
    Windows NT &uuml;bernommen und zuk&uuml;nftigen Bed&uuml;rfnissen angepasst
    werden. Die erzeugten Bezeichnungen sind im Prinzip ewig g&uuml;ltig,
    weil zuk&uuml;nftige Bezeichnungen l&auml;nger sein k&ouml;nnen. Eine
    Kommunikation zwischen den Rechnern des Clusters ist abgesehen von der
    nicht weiter ins Gewicht fallenden NTP-Synchronisation nicht erforderlich.
    Eine Kommunikation zwischen den HTTPD-Prozessen ist ebenfalls nicht
    notwendig (sie findet implizit &uuml;ber die vom Serverkern zugewiesene Pid
    statt). In ganz speziellen Situationen kann die Bezeichnung verk&uuml;rzt 
werden 
    (die 32 Bit gro&szlig;e IP-Adresse ist beispielsweise &uuml;bertrieben, es 
gibt jedoch keine
    geeignete k&uuml;rzere Ersetzung). </p>
</section>


</modulesynopsis>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to