Protokolle

Zusammenfassung

Ein Protokoll legt vollständig fest, wie zwei Seiten Nachrichten austauschen. Dazu gehören nicht nur die Bedeutung der Symbole, sondern auch Anfang, Ende, Reihenfolge und die Reaktion auf Abweichungen. Eine andere Person muss die Absprache ohne Rückfragen umsetzen können.

Fragen, um die es geht

  • Was muss festgelegt sein, bevor zwei Seiten miteinander reden können?
  • Woran erkennt ein Empfänger den Anfang und das Ende einer Nachricht?
  • Warum muss ein Anfangsmuster länger sein als ein einzelnes Symbol?
  • Warum braucht ein Empfänger ein Gedächtnis, und was passiert ohne?
  • Wann ist eine Beschreibung vollständig genug, dass jemand anderes sie umsetzen kann?

Dieses Konzept müsst ihr für Challenge 2 und vor allem für Challenge 3 verstanden haben, damit ihr dort erfolgreich seid. Die Frage, wie zwei Geräte ohne gemeinsame Uhr im Takt bleiben, gehört zum Nachbarkonzept Abtastung und Synchronisation; hier geht es um die Absprache darüber, was gesendet wird.

Erläuterung des Konzepts

Ein Notruf über Seefunk beginnt immer mit dreimal „Mayday”. Nicht aus Ordnungsliebe: Der Kanal rauscht, und niemand weiß, wann ein Ruf beginnt. Ein einzelnes Wort geht unter oder ist Zufall, drei gleiche Wörter hintereinander sind ein Muster, das das Rauschen nicht erzeugt. Danach hat der Ruf eine feste Form: wer ruft wen, dann die Nachricht, dann „over” (ich bin fertig, du bist dran) oder „out” (Gespräch beendet). Seeleute haben damit vor hundert Jahren erfunden, was euer Empfänger ab Challenge 3 braucht.

Bisher hat ein Mensch „jetzt” gesagt

In Challenge 1 und 2 hat jemand beide Programme kurz nacheinander gestartet, auf beiden Rechnern Enter gedrückt. Damit war der Anfang klar, und wie lang die Nachricht ist, wusste der Empfänger auch. Diese Hilfe fällt weg. Der Empfänger läuft, bevor der Sender anfängt, und er sieht dauernd Messwerte, denn das Zimmer ist nie dunkel. Irgendwo in diesem Strom steckt die Nachricht. Nichts an den Zahlen selbst sagt ihm, wo sie beginnt und wo sie aufhört.

Das ist der Satz, um den es geht: Ein Bitstrom ohne Rahmen bedeutet nichts. Bits sind erst dann eine Nachricht, wenn beide Seiten wissen, wo sie anfängt, wo sie endet und was sie bedeutet. Diesen Rahmen liefert kein Sensor, den vereinbart ihr. Drei Fragen muss eure Absprache beantworten: Wo fängt es an? Wo hört es auf? Und was tut der Empfänger, wenn etwas schiefgeht, etwa wenn ein erwartetes Muster ausbleibt? Die dritte vergisst man am leichtesten, und eine Absprache, die nur den Normalfall regelt, lässt den Empfänger im Fehlerfall raten.

Abbildung 1: Der Rahmen einer Nachricht aus Sicht des laufenden Empfängers: links und rechts das Rauschen des Zimmers, dann ein vereinbartes Anfangsmuster aus zwei wechselnden Farben (die Präambel), die Nachricht selbst und eine Endmarke. Ob das Ende über eine Marke oder ein Längenfeld erkannt wird, entscheidet ihr.

Der Anfang: die Präambel

Wenn jemand vorn im Saal erst zufällige Farben sendet, dann eine Nachricht, dann wieder zufällige Farben, findet niemand den Anfang. Beginnt jede Nachricht dagegen mit derselben auffälligen Folge, etwa dreimal Rot-Blau im Wechsel, erkennt der Saal den Anfang nach zwei Durchgängen von selbst. Diese Folge heißt Präambel: ein vereinbartes Muster vor der Nachricht, das keine Information trägt, sondern nur „ab hier” sagt. Sie ersetzt den Menschen, der bisher Enter gedrückt hat.

Zwei Eigenschaften machen eine Präambel brauchbar: Sie ist vereinbart, und sie kommt im Rauschen nicht vor. Daraus folgt zweierlei. Erstens besteht sie aus aktiven Farben, nicht aus Hell und Dunkel: LED aus sieht für den Sensor genauso aus wie das Zimmer, ein Muster mit Aus-Anteil wäre also zur Hälfte Rauschen. Zweitens genügt ein einzelnes Symbol nicht. Ein einzelnes Rot entsteht im Raumlicht ständig von selbst, eine Lampe, ein Schatten, eine Schwankung, und an jeder dieser Stellen würde der Empfänger „Nachricht beginnt” melden. Die Folge Rot, Blau, Rot, Blau, Rot, Blau entsteht zufällig praktisch nie. Je länger und je regelmäßiger das Muster, desto seltener bildet der Zufall es nach; der Preis sind ein paar Symbole Vorlauf je Nachricht. Wer mit Fehlstarts kämpft, ändert also die Absprache, nicht die Verstärkung oder die Integrationszeit. Die heben das Rauschen genauso an wie das Signal.

Eine Frage muss eure Spezifikation außerdem beantworten: Was passiert, wenn die Präambel zufällig auch mitten in einer Nachricht auftaucht? Ein Empfänger, der nach dem Muster sucht, hält das für einen neuen Anfang, verwirft, was er bisher hatte, und beginnt mittendrin neu. Das Problem ist echt und hat in der Praxis einen Namen. Die Lösung sagt euch niemand; es gibt mehr als eine gute Antwort, und eure Spezifikation muss eine davon festlegen.

Das Ende: Längenfeld oder Endmarke

Schickt der Sender zwei Nachrichten direkt hintereinander, muss der Empfänger wissen, wo die erste aufhört. Dafür gibt es zwei Antworten, und beide sind richtig. Ein Längenfeld steht am Anfang und sagt, wie viele Zeichen folgen; der Empfänger zählt mit. Sein Preis: Das Feld muss fehlerfrei ankommen, sonst verdirbt es die ganze Nachricht, und seine Größe begrenzt die Nachricht, mit 8 Bit auf 255 Zeichen. Eine Endmarke ist ein vereinbartes Zeichen nach dem letzten Zeichen; der Empfänger hört auf, sobald sie kommt, und die Nachricht darf beliebig lang sein. Ihr Preis ist dieselbe Frage wie bei der Präambel: Die Marke darf nicht zufällig in den Daten vorkommen, sonst endet die Nachricht zu früh. Keiner der beiden Wege ist der richtige. Ihr wählt einen und schreibt ihn auf.

Was nicht funktioniert: sich darauf zu verlassen, dass die nächste Präambel das Ende der vorigen Nachricht anzeigt. Die letzte Nachricht endet dann nie. Und der Empfänger kann auch nicht am Inhalt erkennen, dass ein Wort „vollständig” ist, denn er kennt den Inhalt nicht. Das Ende muss aus der Absprache folgen, nicht aus dem Text.

Ein Programm mit Gedächtnis

Euer Empfänger erkennt gerade ein Rot. Was soll er damit tun? Das lässt sich aus der Messung allein nicht entscheiden. Solange er auf den Anfang wartet, ist das Rot vielleicht Rauschen oder ein Stück Präambel; liest er gerade eine Nachricht, ist es ein Datensymbol. Dieselbe Messung, verschiedene Reaktionen, je nachdem, was vorher war. Deshalb braucht der Empfänger ein Gedächtnis: einen Zustand, der festhält, wo er gerade steht.

Abbildung 2: Die zwei Zustände des Empfängers. Beim Warten wird alles außer der Präambel ignoriert, beim Lesen alles bis zur Endmarke gespeichert. Dasselbe rote Symbol bedeutet in jedem Zustand etwas anderes, und nach dem Ende geht es zurück ins Warten.

In Python ist ein Zustand nur eine Variable, etwa state, und je Zustand ein Zweig in der Schleife. Im Zustand waiting wird nur geprüft, ob das Anfangsmuster vollständig ist; im Zustand reading wird jedes Symbol angehängt, bis die Endmarke kommt, dann wird die Nachricht ausgegeben und der Zustand zurückgesetzt. Der Pfeil zurück ist wichtig: Wer das Zurücksetzen vergisst, hat einen Empfänger, der genau eine Nachricht kann. Das ist der häufigste Fehler bei der Abnahme, und die Live-Änderung „zwei Nachrichten hintereinander” findet ihn. Das Programm stürzt dabei nicht ab; ein nicht behandelter Zustand tut in Python einfach nichts, und die zweite Nachricht verschwindet stumm.

Die Absprache, die jemand anderes umsetzen kann

Ein Protokoll ist eine Absprache zwischen zwei Seiten darüber, wie sie miteinander reden. Nichts daran versteht sich von selbst, und alles muss vor dem ersten Bit festgelegt sein: die Symbole, der Anfang, das Ende, die Zeit, der Fehlerfall. Die Probe ist nicht, ob es zwischen euch beiden läuft. Die Probe ist, ob jemand, der euch nicht kennt, danach einen Empfänger bauen kann. Genau das passiert beim Interop-Test in Challenge 3.

Der Test für eure Spezifikation lautet: Streicht in Gedanken alles, was ihr wisst, aber nicht aufgeschrieben habt. Reicht der Rest? Die klassische Lücke ist die Zeit. Symbole, Präambel, Zeichencode und Endmarke stehen drin, aber nicht, wie lange ein Symbol steht. Für euch ist das selbstverständlich, für ein fremdes Team ist die Spezifikation damit unbaubar, denn ohne Symboldauer kann es nicht einmal das Anfangsmuster zuverlässig abtasten. Ein vollständiges Beispiel, etwa HI als komplette Symbolfolge mit Anfang und Ende, rettet mehr Spezifikationen als jeder Erklärtext. Und wenn der fremde Empfänger eure Nachrichten nicht versteht, während es zwischen euren eigenen Geräten läuft, ist das zuerst ein Befund über euer Dokument, nicht über das Partnerteam.

Am Ende von Challenge 3 einigt sich die Klasse auf einen gemeinsamen Rahmen, aus euren Vorschlägen. So entstehen Standards wirklich: nicht am Reißbrett, sondern aus dem Vergleich funktionierender Lösungen. Ein Standard ist eine Vereinbarung zwischen Menschen, keine technische Notwendigkeit. Was unterhalb des Rahmens liegt, Farben, Tempo, Kalibrierung, bleibt auch danach eures.

Folien

Der Input zu diesem Konzept aus Sitzung 9. Das Plenumsexperiment „Der Horcher” liegt in seiner Mitte, weil ihr die Präambel selbst erfinden sollt, bevor sie einen Namen bekommt.

Fragen üben

Hier könnt ihr euch an Fragen im Klausurformat versuchen, mit sofortiger Auflösung und Begründung.

Literatur