4. Termin 2: Paketfehlerrate vs. Präambellänge
Vorbereitung:
Zur Vorbereitung auf den Termin lesen Sie sich bitte dieses Kapitel die Folien der Vorlesung der Unit 6 (Framing, Error Detection, Forward Error Correction (FEC)) und die zusätzliche Literatur zu PLL durch. Diese Kapitel sowie die Befehle und Skripte sind relevant für den Präsenztest.
Im ersten Termin wurden einige Aspekte der Bit-Übertragung untersucht. In diesem Versuchstermin werden nun mehrere Bits zu Rahmen (“Frames”) zusammengefasst und von einem Sender zu einem Empfänger übertragen. Durch die Rahmenbildung können erstmals rudimentäre Mechanismen eines Protokolls benutzt werden. Hierzu gehört die Fehlererkennung. Allerdings bereitet die Rahmenbildung auch Probleme:
- Bit-Synchronization: Es muss sichergestellt werden, dass sich zuerst auf Bit-Ebene Sender und Empfänger synchronisieren können. Erst nach der Phase der Bit-Synchronisation können sinnvolle Daten übertragen werden. Die Bit-Synchronisation wird in der Regel von einer „Phase Look Loop (PLL)“ erzielt. Meistens wird die Bit-Synchronisation durch senden von Präambeln erleichtert.
- Rahmenerkennung: Nachdem die Bit-Synchronisation erfolgt ist, muss der Anfang eines Frames gefunden werden. In der Regel wird der Rahmenbeginn vom Sender durch eine definierte Bitfolge kenntlich gemacht. Sie wird “Flag” oder auch “Start Frame Delimiter (SFD)” genannt. Erkennt der Empfänger einen SFD, so interpretiert er die nachfolgenden Daten als den Beginn eines Rahmens. Bei einer Bit-transparenten Übertragung muss dafür gesorgt werden - z.B. durch “Bit-Stuffing”, dass die Rahmenkennung nicht in den Daten auftreten kann. Wird ein Rahmenlängenfeld verwendet, ist keine Rahmenendkennung notwendig. Ebenso wird keine Rahmenenderkennung benötigt, wenn die Rahmengröße fest vorgegeben ist.
Zusammenfassend besteht ein Rahmen in diesem Termin aus einer Präambel mit variabler Länge, einem SFD-Feld (16Bit), einem Längen-Feld (16Bit), das die Größe der Nutzdaten angibt, und einer Prüfsummemit entweder 8, 16 oder 32 Bit Größe. Als Prüfsumme steht eine CRC für die Nutzdaten und eine Paritätsprüfung (als Bestandteil) des Längenfeldes im Rahmenkopf zur Verfügung. Die Länge der Präambel und des Nutzdatenfeldes kann eingestellt werden. Somit hat der Header eine Größe von 4 Byte ohne Präambel.
Das bei der Übertragung verwendete Protokoll ist recht einfach:
Ein Sender sendet Rahmen nach dem oben beschriebenen Aufbau mit Nutzdaten mit einer festgelegten Länge. Während der Übertragung über den Kanal können einzelne Bits verfälscht werden. Zusätzlich gehen einzelnen Bits durch fehlende Bit-Synchronisationen zwischen Sender und Empfänger verloren. Wird z.B. das SFD-Feld verfälscht, dann wird der Rahmen gar nicht erkannt.
Der Empfänger filtert nicht erkannte Rahmen und nicht fehlerfreie Rahmen, die durch eine falsche Prüfsumme erkannt werden. Die korrekt übertragenen Rahmen werden am Bildschirm ausgegeben. Mit diesem einfachen Protokoll sollen nun folgende Abhängigkeiten untersucht werden:
Präambellänge: Welche Länge muss sie haben, um Rahmenverluste aufgrund fehlender Bit-Synchronisation zu minimieren?5.1 Versuchsaufbau
Um diesen Versuch durchzuführen wird ein Lastgenerator benötigt, der Rahmen mit einer festen Länge erzeugt. Die Rahmen werden anschließend mittels eines Transceivers vom sendenden Rechner zu einem Transceiver übertragen, der am empfangene Rechner angeschlossen ist. Beim Empfänger wird eine Datensenke benötigt, um die empfangenen Daten zu verarbeiten.
Als Lastgenerator und Datensenke wird das Programm iperf verwendet, wobei im sendenden Rechner ein iperf-Client und im empfangenen Rechner ein iperf-Server installiert wird.
Damit der iperf-Client und auch der iperf-Server mit einem Transceiver kommunizieren kann, wird das Programm plccd benötigt. Das Programm plccd empfängt IP Pakete über die Socket-Schnittsteller vom iperf-Client und übergibt die Nutzdaten des IP Pakets an den Transceiver, der sie anschließend sendet. Daten, die von einem Transceiver empfangenen werden, sendet das Programm plccd an den iperf-Server. Auch hier wird die Socket-Schnittstelle zur Kommunikation zwischen dem Programm plccd und dem iperf-Server verwendet.
Die Konfiguration (verwendete IP Adressen und Portnummern, Paketgröße etc.) für den iperf-Client und iperf-Server sind in den Skripten iperfB2client und iperfB2server enthalten.
Mittels dieses Versuchsaufbaus soll die Größe der Präambel bestimmt werden ab der eine nahezu fehlerfrei Übertragung garantiert werden kann. Dies bedeutet, es sollen nicht die Rahmenverluste gemessen werden, die durch Bitfehler im Übertragungsmediument stehen, sondern durch fehlende Bit-Synchronisation zwischen Sender und Empfänger.
Dazu müssen die folgenden Voraussetzungen geschaffen werden:
- Damit möglichst keine Bitfehler die Übertragung stören, sollte die maximale Sendeleistung am sendenden Transceiver eingestellt werden.
- Die Entfernung zwischen Sender und Empfänger sollte aus dem selben Grund klein sein. Natürlich sollten die Antennen angeschraubt sein.
- Die Anzahl an Nutzdaten im Rahmen (das Minimum sind 12 Bytes) sollte möglichst gering sein, damit die Wahrscheinlichkeit sehr gering wird, dass ein Bitfehler einen Rahmen zerstört.
- Es muss dafür gesorgt werden, dass der Sender und der Empfänger nicht Bit-synchronisiert sind: Erst wenn der Empfänger einen Rahmen empfängt, soll er versuchen sich auf die Bits im Rahmen zu synchronisieren. Anschließend, nachdem der Rahmen korrekt empfangen wurde, muss eine Zeit gewartet werden, damit Sender und Empfänger nicht mehr synchronisiert sind. Hierdurch wird gewährleistet, dass sich der Empfänger immer (ob sofort, nach einer Stunde oder in einem Jahr) mit dem Sender synchronisieren kann.
Wie kann nun dafür gesorgt werden, dass sich der Empfänger nur beim Empfang eines Rahmen mit dem Sender synchronisiert, aber sonst nicht ?
Wenn die PLL, die für die Synchronisation zuständig ist, beim Empfang eines Rahmens eingeschaltet wird und nachdem der Rahmen empfangen wurde wieder eingeschaltet wird, dann wäre das Problem gelöst. Leider kann die PLL nicht beeinflusst werden.
Die einzige Alternative ist, dann man eine gewisse Zeit wartet und hofft, dass Sender und Empfänger nicht mehr synchronisiert sind. Nach unendlicher Wartezeit wird dies der Fall sein. Um die Wartezeit zu verkürzen, muss ein Kriterium gefunden werden, von dem abgeleitet werden kann, dass die beiden Transceiver nicht mehr synchron sind. Und diese Kriterium ist die Rahmenverlustrate selbst:
Wir gehen davon aus, dass keine Präambel vorhanden ist. Nun werden Rahmen mit einer konstanten Rate gesendet und die Rahmenverlustrate bestimmt. Anschließend wird die Zeit zwischen zwei Paketen vergrößert und nochmals die Rahmenverlustrate gemessen. Die Verlustrate sollte nun gestiegen sein. Die Zeit wird solange vergrößert, bis nahezu alle Rahmen verloren gehen. Dieser Paketabstand wird bei der Messung eingestellt.
5.2 Versuchsdurchführung
Für den Versuch hat sich die folgende Vorgehensweise bewährt:
- Sender und Empfänger sind mit montierten Antennen im Abstand von etwa 2-3 Metern aufzustellen und jeweils zu initialisieren (per CCPacketMode.sh <freq>).
- Testen Sie die Übertragung durch Senden einer Zeichenfolge (z.B. durch Eingabe des Befehls echo Hallo > /dev/cc1020).
- Am Empfänger sollte die Zeichenfolge nun nach Eingabe des Befehls cat /dev/cc1020 sichtbar sein.
- Für diesen Versuch wird eine Payloadlänge von 12 Byte verwendet. Diese wird aber schon durch die Größe der von iperf generierten Pakete bestimmt, es muss also nichts eingestellt werden.
- Mit dem Befehl ccconfig -t <time in ms> wird die Verzögerungszeit zwischen 2 Paketen eingestellt. Die Verzögerung ist die zeitliche Differenz zwischen der das 2. Paket gesendet wird, nachdem das 1. Paket gesendet wurde.
- Nun wird die Rate eingestellt, bei der Sender und Empfänger nicht mehr synchronisiert sind.
- Die Präambel ist in sinnvollen Schritten zwischen 0 und 100 Bit zu erhöhen. Hierzu verwenden Sie den Befehl ccconfig -pal <0..100>.
- Die Paketverlustrate beim Senden von jeweils 1000 Rahmen ist zu ermitteln. Auch dies wird von iperf automatisch übernommen. Es ist aber zu beachten, dass die Pakete durch die künstliche Verzögerung wesentlich länger unterwegs sind, als dies bei Beobachtung des iperf-Clients erscheinen mag.
- Es wird wieder iperf als Lastgenerator verwendet. Vorgegebene Konfigurationen können mit den Befehlen iperfB2server und iperfB2client aufgerufen werden. Was diese genau einstellen, kann über den Befehl alias ausgegeben werden.
- Auf der Empfängerseite sind die empfangenen Pakete per iperf zu protokollieren.