6. Beschreibung unserer Testimplementierung

In den letzten Kapiteln beschäftigten wir uns mit der Frage, wie wir Multimediadaten, insbesondere RTP-Daten, über eine PPP-Verbindung übertragen können. Wir beschrieben verschiedene Probleme und zeigten zum Teil Lösungen auf.

Damit unsere Überlegungen nicht isoliert im Raum stehen, haben wir eine Testumgebung geschaffen, in der wir unsere Überlegungen probieren konnten.


6.1. Welche Testumgebung können wir verwenden?

Eigentlich war es unser Ziel, eine existierende PPP-Implementierung zu nehmen und zu erweitern, so daß wir mit dieser Multimediadaten übertragen können. Wir heben jedoch aus zwei Gründen davon Abstand genommen:

Wir überlegten uns somit, was die günstigste Simulationsumgebung sein könnte. Es standen dabei mehrere Möglichkeiten zur Diskussion, von denen zwei in den nächsten Abschnitten genauer beschrieben sind.

6.1.1. Verwendung eines Tunnels

Als erstes kam uns der Gedanke eine Art Tunnel über eine PPP-Verbindung zu realisieren. Dieser sollte mit Hilfe zweier Prozesse, die miteinander über eine UDP-Verbindung verbunden sind, realisiert werden. Diese Variante hätte die folgenden Vorteile:

Es ergeben sich jedoch einige gravierende Nachteile:

Alles im allen erschien es uns recht fraglich, ob man mit dieser Umgebung vernünftige Ergebnisse erzielen kann.


6.2. Eine eigene kleine PPP-Implementierung

Aus diesem Grunde entschieden wir uns, eine eigene Simulationsumgebung zu implementieren, bei der im Grunde alle Komponenten einer PPP-Implementierung mit enthalten sind. Dies erforderte zwar einen höheren Aufwand, jedoch konnten wir unsere Testumgebungen somit optimal gestalten. Es auch möglich, Messungen an allen Stellen der Implementierung vorzunehmen, was im Falle einer echten Implementierung im PPP-Kern nicht ohne weiteres möglich gewesen wäre.

Die Abbildung [testImpl-1] gibt einen Überblick über die von uns implementieren Komponenten und deren Interaktionen. In den folgenden Abschnitten ist jedes der implementieren Module separat beschrieben. Der Source-Code der Testimplementierung ist im Anhang [srcTestImpl] enthalten.

6.2.1. TTY Interface

Das unterste Modul realisiert den Zugriff auf das Modem, das wir für unsere physikalische Verbindung benutzten ([server.c]). In erster Linie initialisiert es die "TTY Line Characteristics", so daß es möglich ist binäre Daten zu übertragen. Da wir in unserer Testumgebung immer eine Modemverbindung zur TU-Berlin herstellten, war auch eine "Not-Aus-Taste" nötig, um im Fehlerfall die Implementierung auf der Seite der TU ohne Abbruch der Verbindung terminieren konnten. Wir wählen einfach die Tastenkombination CTRL/B. Sobald diese empfangen wurde, wurde das gesammte Programm beendet.

Neben dieser Rolle stellte es auch das eigentliche Hauptmodul auf der entfernten Seite dar. Für die Seite des "Anrufers" war noch eine weitere Zusatzkomponente nötig, bei der es möglich ist, die Eingaben der Tastatur direkt zum Modem zu schicken. Nur so war es möglich, mit Hilfe des Modems zu wählen und das Programm auf der Seite in der TU zu starten. Auch hier galt, daß durch Eingabe von CTRL/B die Verbindung unterbrochen werden konnte. Es wurde jedoch nicht die physikalische Modemverbindung getrennt, sondern nur der in der Abbildung sichtbare Protokollstack sauber terminiert. Danach befand man sich wieder im "Terminal-Modus".

6.2.2. HDLC-Layer

Um auch genausoviele Bytes für die Übertragung der Daten zu benötigen, wie bei einer echten PPP-Implementierung, haben wir auch das Versenden der Daten nach RFC 1662 [rfc1662] implementiert. Hierbei werden die PPP-Pakete in HDLC [iso9106:HDLC-4335] Frames eingekapselt, und durch Flags getrennt verschickt. Wir implementierten auch die Option, das Adress- und Kontrollfeld zu komprimieren. In unserer Testumgebung wurde diese vom Hauptprogramm stets eingeschaltet, weil das auch der Realität entspricht[ Bei einer realen Implementierung ist diese Komprimierung zu Beginn einer Verbindung immer ausgeschaltet. Mit Hilfe von LPC [rfc1661] Nachrichten kann jedoch ausgehandelt werden, diese Kompression zu verwenden. Aus Effizienzgründen wird diese Form der Kompression bei PPP-Verbindungen in der Regel immer eingeschaltet.]. Auch die Verwendung der ACCM, der "Asynch Control Character Map" wurde berücksichtigt. Durch den Server werden bei uns

escaped. XON und XOFF wird bei Modemverbindungen oft eingeschaltet, da die unterliegenden Verbindungen diese oft von sich aus einstreuen. Durch das escapen dieser Werte ist man somit immer auf der sicheren Seite. Das CTRL/B wird nun bei uns escaped, da wir es (wie oben schon erwähnt) zum Abbruch der Verbindung benutzen[ Der Wert wurde nicht ganz zufällig gewählt. 0 wurde nicht verwendet, da dieser des öfteren in realen Daten vorkommt. Würde dieser escaped erden müssen, hätte das ein erhöhtes zu übertragendes Datenvolumen zur Folge. CRTL/A wurde von unserem Terminal Programm bereits benutzt, so daß sie die Verwendung von CTRL/B anbot.].

In unserer Implementierung wird das FCS-Feld mit einen 16 Bit CRC berechnet und übertragen. Für unsere Testimplementierung sollte das ausreichen. Verwendet wurde hierzu die in RFC 1662 angegebene CRC Tabelle aus Appendix C.2, sowie das dort beschriebene Verfahren zur Berechnung.

6.2.3. PPP Layer

Aufsetzend auf dem HDLC-Layer ist der PPP-Layer angelegt. Dieser ist als Empfänger für Pakete beim HDLC-Layer registriert, so daß alle korrekt auf HDLC-Ebene empfangenen Pakete zum PPP weitergereicht werden.

Das PPP-Modul entspricht eigentlich einer ganz normalen PPP-Implementierung jedoch mit der Einschränkung, daß kein LCP (Link Control Protocol)[ Dieses wird benutzt, um verschieden Optionen, die die PPP-Verbindung betreffen, ausgehandelt werden. ] vorhanden ist. Da sich unser Interesse nicht auf die Realisierung einer weiteren PPP-Implementierung richtet, gingen wir von festen, bereits ausgehandelten Voraussetzungen aus:

Wie jedes PPP-Modul wird anhand des Protokoll-Feldes das verwendete Protokoll erkannt. Andere Module, die ein spezielles Protokoll behandeln können, müssen sich für dieses beim PPP-Modul mit einer Callback-Routine registrieren.

6.2.4. IP-UDP-RPT Header-Compression-Layer

Diese Modul realisiert die eigentliche IP/UDP/RTP Header-Compression, wie im Internet-Draft [Casner9611:Compressing] von Stephen Casner und Van Jacobson beschrieben[ Während des Implementieren gab es einige Fragen an Stephen, die er mir alle sehr bereitwillig beantwortete. Durch dieses Dialoges klärten sich viele Fragen meinerseits. Wir stießen auch auf einige unsauber formulierte Passagen in dem Draft, die in der nächsten Version klarer formuliert werden.]. Der Draft ist derzeit jedoch noch nicht in allen Teilen vollständig implementiert. Fertig sind derzeit:

Es fehlen:

Für die drei verschiedenen Pakettypen wurde auch drei verschiedene Werte für das PPP Protokoll-Feld genommen. Diese Werte sind von uns frei erfunden und wurden NICHT beim IANA registriert. Sie dienten nur für unsere Testzwecke.

6.2.5. RTP Mixer / Translator

Das eigentliche Ziel war es, einen RTP-Mixer zu benutzen. Falls mehrere Sender (für eine Multicast-Adresse) zur gleichen Zeit aktiv sind, sollte dieser die eingehenden RTP-Ströme mixen und dann übertragen. Da es jedoch ein wenig aufwendig ist, einen RTP-Mixer zu implementieren und der Kern dieser Arbeit nicht die Implementierung eines solchen ist, entschlossen wir und für den einfacheren Weg. Wir implementierten nur einen RTP-Translator. Dieser ist bei weitem einfacher zu realisieren. Da wir bei unserer Testumgebung auch nicht mit mehreren Quellen arbeiteten (das war für unsere Tests auch nicht nötig), war dieser durchaus ausreichend.

Es existiert ein entscheidender Unterschied zwischen einem RTP-Mixer und einem Translator. Der Translator empfängt einen RTP-Strom und sendet ihn wieder neu aus. Jede Daten-Quelle bleibt für den Empfänger weiterhin erkennbar. Der Translator hat auch die Option, eine Formatwandlung durchzuführen. Hauptsächliches Einsatzgebiet sind Proxies für Firewalls, Multicast zu Unicast Konverter und Wandler für exotische oder nicht überall unterstützte Datenformate.

Der RTP-Mixer hingeben mischt mehre eingehende Datenquellen, und erscheint als eigener Sender. Er hat also den ganzen Aufwand, die Daten zu ordnen, Lücken zu erkennen, die Daten zu mischen, dabei eventuell das Format zu ändern etc. Er wird hauptsächlich dort eingesetzt, wo es um die Verringerung der Bandbreite geht, wenn es oft vorkommt, daß viele Quellen gleichzeitig aktiv sind.

Neben der Funktion als Proxy für die Multicast Daten zu fungieren, führt unser Translator die notwendige Formatwandlung der RTP Daten durch. In der Tabelle [formate] ist abgegeben, welche Ausgangsformate bei welchem Ziel- und Quellformat verwendet wird. Andere Formate als in der Tabelle aufgeführt werden derzeit nicht unterstützt.

Ziel- / Quellformat PCM µ-law PCM A-law GSM LPC
GSM GSM GSM GSM LPC
LPC LPC LPC LPC LPC
Ausgangsformat in Abhängigkeit von Quell- und Zielformat

6.2.6. cSAP

Neben dem IP/UDP/RTP Header Compression Modul, ist auch das cSAP (Compressed Session Announcement Protocol) Module beim PPP mit einem Transportprotokoll registriert. Es realisiert die komprimierte Übertragung von Session Announcements wie in Abschnitt [cSAP] und [cSAP-draft] beschrieben. Auch hier verwenden wir eine eigene, nicht beim IANA registrierte Protokollnummer.

6.2.7. cSDP

Dieses Modul ist für die Komprimieren einer einzelnen Session Description, also einem SDP [Hand9611:SDP] Paket verantwortlich. In der derzeitigen Implementierung ist diese Modul zwar vorgesehen, wurde jedoch noch nicht richtig getestet.

6.2.8. Bandbreiten-Messung

Um die Bandbreite während einer Verbindung messen zu können, implementieren wir noch ein weiteren Modul (Bandwidth). Dieses benutzt das in Kapitel [bandwidth] vorgestellte Verfahren zur Messung der Bandbreite. Derzeit werden die Ergebnisse noch NICHT für die Entscheidung mit verwendet, welches Datenformat für die ausgehenden RTP-Pakete zu benutzen ist.

Die Beschreibung der Meßergebnisse ist in Abschnitt [messungen] enthalten.

6.2.9. Simuliertes Netzwerk-Interface

Da unsere Implementierung ohne root Privilegien läuft, ist es auch nicht möglich direkt das Netzwerk-Interface zu benutzten. Wir simulierten aus diesem Grunde dieses Interface unter der Benutzung von Standard-Sockets. Für jede RTP-Multicast-Adresse und für den Zugriff auf SAP erstellten wir ein normalen UDP Socket. Die eingehenden Pakete wurden dann um einen künstlich erzeugten IP und UDP-Header ergänzt, und an die untere Schicht weitergegeben. Somit war sichergestellt, daß die anderen Module (cSAP, RTP-Mixer etc.) auch so arbeiten, wie sie es in einer realen Implementierung würden. Alle Protokollköpfe waren somit ebenfalls vorhanden.

Wenn das simulierte Netzwerkinterface ein Paket von einer unteren Schicht empfing, wurden die IP und UDP-Header wieder entfernt. Mit Hilfe der Zieladresse des IP-Headers und der Zielportnummer des UDP-Headers, wurden die Daten an exakt diese Adresse gesendet. Da diese Felder von dem Sendeteil der Implementierung auf der anderen Seite des Modems generiert wurden, bestimmte diese auch das Ziel. Insofern kommt dies Implementierung einem realen Netzwerkinterface recht nahe.

6.2.10. Filehandler

Wie in der Beschreibung aufgefallen sein dürfte, heben wir es hierbei mit mehreren Datenquellen zu tun:

Es ist somit nötig, mit select oder poll[ select und poll sind zwei C-Funktionen unter UNIX, die es ermöglichen auf Daten und Ereignissen von mehren Filedescriptoren gleichzeitig zu warten.] zu arbeiten. Damit sich dies in der Implementierung der einzelnen Module nicht weiter berücksichtigt werden muß, implementierten wir ein weiteres Modul (Filehandler). Dieses besitzt eine Main-Loop, in der ein select ausgeführt wird. Routinen, die auf Daten eines Filedescriptors warten, müssen sich und den Filedescriptor beim Filehandler mit einer Callback-Routine registrieren. Wenn Daten für einen solchen Filedescriptor bereitstehen, ruft der Filehandler die entsprechende Callback-Routine auf.

Wie schon zu Beginn dieses Kapitels erwähnt, kann das Programm durch Eingabe eines bestimmten Zeichenwertes (CRTL/B) beendet werden. Realisiert wird dies durch eine globale Variable, mit Hilfe die Main-Loop des Filehandlers beendet werden kann.


6.3. Messungen an der Implementierung

Nachdem die oben beschriebene Testumgebung implementiert war, galt es diese zu Testen. Als erstes Testszenario versuchten wir die zu der Zeit zufälliger Weise aktive Übertragung der NASA STS-82 Space-Shuttle-Mission zu verfolgen. Wir verwendeten hierzu die in Abbildung [testImpl-2] dargestellte Umgebung.

Die RTP-Daten wurden im PCMU2 Format (40ms Frames mit PCM µ-law) gesendet. Dies entspricht 320 Bytes je Frame. Für die Komprimierung der Daten verwendeten wir GSM. Anhand von Tracinginformationen, die auf unserer Seite ausgegeben wurden waren deutliche Paketverluste zu erkennen, auch kam es vor, daß die Pakete in der falschen Reihenfolge ankamen. Unsere Implementierung verhielt sich jedoch stabil, so daß es möglich war der Übertragung zu folgen. Nach diesem ersten Test gingen wir davon aus, daß die Implementierung hinreichend arbeitet, um Messungen durchführen zu können.

Die erste Messung beschäftigte sich mit Fragestellung, wie hoch die tatsächliche benötigte ausgehende Bandbreite für unseren komprimierten RTP-Datenstrom ist. Wir sendeten hierzu von einem Windows 95 PC mit Hilfe von vat RTP-Daten (PCMU2, 40ms Frames) in das Netz. In unserer Implementierung protokollierten wir dann die Anzahl der pro Sekunde über das Netz empfangenen Bytes, und addierten den Overhead für einen einfachen IP und UDP Header (28 Bytes)[ Zur Erinnerung, in unserer Implementierung haben wir nur Zugriff auf die Nutzdaten, jedoch nicht auf den IP und UDP-Header.].

Ebenfalls wurden die Bytes gezählt, die durch die Modemverbindung jede Sekunde gesendet wurden. In Abbildung [testImpl-plot1] sind die beiden Messungen gegenübergestellt. Der eingehende Datenstrom beinhaltete 40 ms RTP Frames, mit PCM µ-law codierten Audiosamples. Für den komprimierten Datenstrom verwendeten wie die GSM Kodierung. Für die Messungen wurde ein Text vorgelesen und übertragen.

Es sind deutlich die kurzen Unterbrechungen zu erkennen, die aus den Sprechpausen resultieren. Ebenfalls gut zu erkennen ist, daß für die eingehenden Daten etwas mehr als 70 benötigt werden. Dieser gemessene Wert deckt sich auch sehr gut mit der theoretischen Betrachtung aus Abschnitt [needed-bandw] (wir ermittelten dort 72 ). Die benötigte Bandbreite zum Senden der komprimierten RTP Daten schwingt im gleichen Takt, wie die für den eingehenden Datenstrom. Im Mittel liegt sie bei ca. 15 . Zum Vergleich leiten wir uns den zu erwartenden Wert her:

B

= (GSM + IP/UDP/RTP-Header + PPP + HDLC) / 40
= (66 + 2 + 2 + 4) / 40
= 14,8

Der gemessene Wert liegt somit sehr nahe an dem zu erwartenden theoretischen Wert.

Die gleiche Messung führten wir nocheinmal durch, jedoch wurde nun die ausgehenden Daten nicht mit GSM, sondern mit LPC komprimiert. Die graphische Auswertung zeigt die Abbildung [testImpl-plot2].

Die nun benötigte Bandbreite beträgt nun nur noch ca. 7 . Setzt man anstelle der bei GSM benötigten 66 Bytes für 40 ms Audiodaten die für LPC nötigen 24 Bytes ein, so ergibt sich ein theoretischer Wert von 6,4 . Dieser Wert liegt ebenfalls dicht bei dem von uns gemessenen.


6.4. Vorhersage der verfügbaren Bandbreite

Nachdem unsere Implementierung so weit funktionierte, waren wir interessiert zu sehen, ob es möglich ist die Bandbreite während einer Verbindung zu messen. Wir verwendeten hierzu das bereits in Kapitel [packet-pair] beschriebene Packet-Pair Verfahren.

Um Messungen durchführen zu können, benötigten wir somit zwei Pakete, von denen wir wissen, daß sie direkt aufeinander folgen. Da wir jedoch nur die RTP-Daten übertrugen, und diese in einem größeren Abstand gesendet wurden, reichten diese nicht. Versuchsmessungen bestätigten dies Annahme auch. Aus diesem Grunde führten wir ein weiteres PPP-Protokoll-Paket ein. Dieses Paket wurde vor jedem eigentlichem PPP-Paket gesendet, so daß wir sicher waren, daß es die beiden Pakete auch wirklich in Folge gesendet wurden. Dieses Triggerpaket bestand nur aus der PPP-Protokollnummer ohne Daten.

Für die Bestimmung machten wir immer 100 Messungen. Gemessen wurde die Zeit die verging, vom Eintreffen des Triggerpaketes bis zum Eintreffen des nächsten PPP-Paketes. Die Messungen sind wie in Abschnitt [cum-freq] als kumulierte Häufigkeitsverteilung dargestellt (siehe Abbildung [testImpl-plot3]). Die Messungen wurden während eines realen Gespräches mit Dr. Henning Schulzrinne aufgenommen, und entsprechen somit einem real vorkommenden Datenaufkommen. Zur Erinnerung, der definierten, daß die Bandbreite, bei der das 0,5-Quartil liegt näherungsweise als die real zur Verfügung stehende Bandbreite angesehen werden kann.

Im Gegensatz zu unseren Testmessungen aus Kapitel [bandwidth] verlaufen die Kurven ein wenig linearer. Das war auch zu erwarten, da wie es bei den Testmessungen mit optimalen Verhältnissen zu tun hatten. Dennoch ist deutlich zu sehen, daß alle Meßreihen, mit zwei Ausnahmen, sehr dicht beieinander liegen. Das heißt, daß solche Messungen durchaus ein reproduzierbares Ergebnis liefern können. Die statistische Streuung der Meßergebnisse ist insofern als verhältnismäßig klein zu bezeichnen. Mit Ausnahme der beiden "Ausreißer" liegt die gemessene Bandbreite somit zwischen 17 und 20 kbit/s.

Um die Güte dieser Messungen bestimmen zu können, müssen wir zunächst jedoch die theoretisch zu erwartende Bandbreite mathematisch herleiten. Gemessen wurde die Bandbreite, die für PPP-Nutzdaten zur Verfügung steht. Es entfallen also die HDLC-Framing-Informationen (Flag und FCS), sowie das PPP-Protokoll-Feld. Übertragen wurden in der Regel 40 ms GSM Frames (66 Bytes), die zusammen mit dem komprimierten IP/UDP/RTP-Headern 68 Bytes ausmachten. Für die Framinginfomrationen fielen 2 Bytes für die HDLC Flags, 2 Bytes für das FCS Feld, und ein Byte für das komprimierte PPP-Protokoll-Feld (zusammen 5 Bytes) an.

Laut Aussage des Modems[ Bei dem von uns verwendeten US-Robotics Modem können die Parameter der letzten Verbindung mit dem Befehl ATI6 abgefragt werden.] betrug die Datenrate in der von uns gemessenen Richtung 24 . Wie bereits in Abschnitt [v42] errechnet wurde, kommen zu den zu übertragenden Daten ca. 1,6% Overhead durch bitstuffing hinzu. Die für Modemdaten zur Verfügung stehende Bandbreite Bmodembeträgt somit:

B

= 24000 - 1,6%
= 23616

Bei der von uns verwendeten ACCM waren 3 Werte zum Escapen maskiert. Es ergibt sich somit ein Overhead O für E gesetzte Bits in der ACCM von:

O

= (E + E + E) / 256
= (3 + 1 + 1) / 256 = .01953
O(n) = .01953 * n

Übertragen wurden immer Frames mit 68 + 5 Bytes, so daß sich die theoretische Bandbreite B ergibt zu:

B

= 68 / (68 + 5 + O(68 + 5)) * 23616
= 21,6

Die Bandbreite, die unser vorgestelltes Meßverfahren ermittelte, lag mit ca. 18,5 um ca. 15% niedriger, als die theoretisch zu erwartende.


6.5. Zusammenfassung

Wir haben während der letzten Monate eine Testumgebung entwickelt, mit der wir unsere zuvor theoretisch Überlegungen der letzten Kapitel überprüfen wollten. Aus verschiedenen, oben beschriebenen Gründen waren wir nicht in der Lage, diese direkt in einer PPP-Implementierung einzubetten. Wir versuchten daher eine Referenzimplementierung zu schaffen, die die gleichen Aufgaben zu bewältigen hat, wie eine reale PPP-Implementierung.

Durch die Integrierung von Timern an verschiedenen Stellen waren wir in der Lage, die verschiedenen Messungen durchzuführen. So konnten wir die resultierende benötigte Bandbreite für den ausgehenden Datenstrom in Relation zum eingehenden betrachten. Wie zu erwarten zeigte sich eine nahezu proportionale Verringerung der benötigten Bandbreite. Durch die Konvertierung der eingehenden IP/UDP/RTP-Daten, konnte die benötigte Bandbreite bei PCM µ-law auf ca. 21% verringert werden, wenn GSM, sowie IP/UDP/RTP-Header-Komprimierung eingesetzt wurden. Bei der Verwendung von LPC, verringerte sie sich sogar auf ca. 10%.

Mit Hilfe dieses Verfahrens ist es somit möglich, ausgesendete RTP-Datenströme aus dem INTERNET über eine Verbindung mit niedriger Bandbreite transparent zu übertragen. Eine Modemverbindung erwies sich dabei als durchaus brauchbar.

Weiterhin konnten wir durch Messungen zeigen, daß unser entwickeltes Verfahren zur Bestimmung der zur Verfügung stehenden Bandbreite sehr gute Ergebnisse liefert. Durch geeignetes Koppeln dieser beiden Komponenten müßte es somit auch möglich sein, das RTP-Datenformat entsprechend der gemessenen Bandbreite dynamisch anzupassen.


File was created Wed Feb 26 17:43:10 1997 by tex2html