-
In
vielen digitalen Kommunikationssystemen werden Daten in Paketform übertragen.
Diese Datenpakete enthalten vor Beginn der eigentlichen Daten einen
Kopfteil („Header"). Dieser Header
beinhaltet Informationen beispielsweise zu der Zieladresse des betreffenden
Datenpakets, der Länge
des Datenpakets und der Art der in dem Datenpaket enthaltenen Nutzdaten
(„Payload").
-
Der
Header kann als ein einziges langes Zeichen betrachtet werden, welches
aus einer Kette von Bits besteht.
-
Mobilfunkgestützte Telekommunikationsnetze
und das Internet konvergieren im Hinblick auf ihre Funktionalitäten. Es
ist wünschenswert,
dass Mobiltelefone der dritten Generation Datenpakete aus dem Internet (IP
oder ATM) direkt „verstehen", um nahtlose E-Mail-,
Web-Browser- und Multimedia-Dienste für den mobilen Teilnehmer zu
ermöglichen.
Protokolle wie das IP (Internet-Protokoll) sind dafür ausgelegt,
in Festnetzen zu laufen, in denen Bandbreite im Überfluss zur Verfügung steht,
daher sind sie in der Mobiltelefonieumgebung relativ teuer. Bei
Verwendung für
den Transport von Sprache können
die vermittlungstechnischen Daten („Overhead"), die aus der Verwendung des IP resultieren,
bis zu 75 % der gesamten Netzkapazität beanspruchen, was für Mobilfunknetze
nicht akzeptabel ist.
-
Eine
Lösung
für dieses
Problem besteht darin, den IP-Header, unmittelbar bevor er die Luftschnittstelle passiert,
zu komprimieren. Für
diesen Zweck existiert eine Reihe von Komprimierungsschemata (Van
Jacobson, CRTP etc.), die in unterschiedlicher Weise Kompromisse
im Hinblick auf Effizienz, Flexibilität und Unkompliziertheit eingehen.
-
Das
IBM Technical Disclosure Bulletin „JPEG Huffman Decoder", Bd. 36, Nr. 5,
vom 1. Mai 1993, Seiten 455-458 – XP000409057, ISSN: 0018-8689,
beschreibt ein Verfahren zur Beschleunigung der Decodierung von
komprimierten Bildern, die mittels der von JPEG unabhängigen Funktion
der verlustfreien Huffman-Codierung codiert wurden.
-
Es
ist eine Aufgabe der Erfindung, ein verbessertes Verfahren zur Komprimierung
und anschließenden Dekomprimierung
von Headern und Zeichen binärer
(oder anderer) Dateneinheiten bereitzustellen.
-
Der
Erfinder hat ein verbessertes Verfahren der Komprimierung von digitalen
Daten gefunden, welches das Erkennen von Verhaltensmustern in aufeinander
folgenden Datenblöcken
nutzt, was eine effiziente Datenkomprimierung erlaubt. Verhaltensmuster
sind definiert als eine beliebige Form von Nicht-Zufälligkeit und
können
jede beliebige geeignete Form annehmen, beispielsweise Wiederholungen,
Zähler,
bei denen der Zähler
jeweils um einen (1) Schritt erhöht
wird, oder Datenblöcke,
die zwischen einer kleinen Anzahl verschiedener Werte wechseln.
-
Bekannte
Datenkomprimierungssysteme beinhalten den Huffman-Algorithmus, der
ausführlich
in einer ebenfalls anhängigen
Patentanmeldung beschrieben wird. Dieser öffentlich zugängliche
Standard wird verbreitet in zahlreichen Komprimierungsschemata verwendet,
darunter etwa „Winzig". Bei der Huffman-Codierung wird
ein Datenstrom zeichenweise komprimiert, wobei ein Zeichen in der
Regel einem Byte entspricht. Die Basiskomprimierung ist nicht sehr
effizient, jedoch ist es möglich,
bessere Ergebnisse zu erzielen, indem das Verfahren wiederholt angewendet
oder die Größe eines
Zeichens vergrößert wird.
Allerdings werden hierdurch auch die Verarbeitungs- und/oder Speicheranforderungen
des Algorithmus erhöht.
-
Der
Erfinder hat eine verbesserte Version des Huffman-Verfahrens entwickelt,
welche erheblich geringere Speicheranforderungen stellt als der
herkömmliche
Huffman-Algorithmus
und es erlaubt, die Größe eines Zeichens
zu vergrößern und
somit ein besseres Komprimierungsverhältnis zu erzielen.
-
Für ein besseres
Verständnis
der Erfindung wird nun zunächst
der Stand der Technik erläutert.
-
Herkömmliche Huffman-Codierung
-
Die
Huffman-Codierung ist ein öffentlich
zugänglicher
Komprimierungsstandard, der in zahlreichen gängigen Komprimierungsschemata
zum Einsatz kommt, beispielsweise bei „WinZip". Alle Huffman-Komprimierer bearbeiten
einen Strom von Zeichen (beispielsweise ASCII-Zeichen). Der Grundgedanke
hierbei ist, einen neuen Satz komprimierter Zeichen oder Codes zu
erzeugen, in dem jedes normale Zeichen auf ein komprimiertes Zeichen
abgebildet ist und umgekehrt. Häufig
auftretende, d.h. gängige
Zeichen, erhalten dabei kürzere
komprimierte Codes als selten verwendete Zeichen, sodass die durchschnittliche
Größe des Datenstroms reduziert
wird. Das Komprimierungsverhältnis
kann verbessert werden, indem die Größe eines Zeichens vergrößert wird,
jedoch um den Preis eines höheren
Speicherbedarfs. Tatsächlich
nimmt der belegte Speicher bei der Verwendung eines Huffman-Komprimierers
mit der Zeichengröße exponentiell
zu, sodass 16-Bit-Zeichen 256 mal so viel Speicher beanspruchen
wie 8-Bit-Zeichen.
-
1 veranschaulicht,
wie die herkömmliche
Huffman-Codierung
funktioniert. In dem Beispiel betrifft sie zehn (10) verschiedene
mögliche
Zeichen (einen Satz von 10 ASCII-Zeichen),
wie in Hochkommata dargestellt (allgemein kann ein Zeichen ein beliebiges
Zeichen sein, beispielsweise ein Byte, ein Header, ein ASCII-Zeichen
etc.). Eine Voraussetzung ist, dass für die Zeichen die ungefähre Wahrscheinlichkeit
bekannt ist, mit der ein bestimmtes Zeichen in der Datensequenz
vorkommt, wobei für
den Fachmann offensichtlich ist, dass diese Voraussetzung in jeder
beliebigen geeigneten Weise erfüllt
werden kann (beispielsweise indem ein umfangreicher Strom von Zeichen
herangezogen wird und ermittelt wird, wie häufig jedes Zeichen darin enthalten
ist).
-
In
dem hier dargestellten Beispiel erfordert der herkömmliche
Huffman-Baum 10 Ausgangsknotenpunkte, jeweils einen pro möglichem
Zeichen. Diese Knotenpunkte sind am oberen Ende des Huffman-Baums dargestellt,
zusammen mit einer Prozentangabe zur Wahrscheinlichkeit, mit der
das jeweilige Zeichen in einem nicht komprimierten Datenstrom auftritt.
Die Zeichen sind allgemein in der Reihenfolge ihrer Wahrscheinlichkeit aufsteigend
geordnet. Das Leerzeichen ist ein besonders häufig verwendetes Zeichen und
steht somit an letzter Stelle. Wie in der Abbildung gezeigt, gibt
das Kästchen
unter jedem Zeichen die Wahrscheinlichkeit des Auftretens an. Um
nun den Baum zu erstellen, werden die beiden Knotenpunkte mit den
geringsten Wahrscheinlichkeitswerten zusammengefasst, um einen neuen
Knotenpunkt zu bilden. Der linke Zweig wird mit einer „1" bezeichnet, der
rechte mit einer „0". Für den neuen
Knotenpunkt gilt die Wahrscheinlichkeit der kombinierten Ausgangsknotenpunkte
(im ersten Fall beträgt
diese 6 %). Dieser Prozess wird solange wiederholt, bis nur noch
ein Knoten übrig
ist, an welchem Punkt der Baum fertig gestellt ist. Im Allgemeinen
wird der Zweig mit der niedrigsten Wahrscheinlichkeit mit einer „1" bezeichnet und der
Zweig mit der zweitniedrigsten Wahrscheinlichkeit mit einer „0". Die Summe dieser
beiden Wahrscheinlichkeitswerte wird dem neuen Knotenpunkt zugewiesen.
Der fertige Huffman-Baum für
das hier gezeigte Beispiel ist nachstehend dargestellt:
Zum
Komprimieren eines Zeichens geht man von dem betreffenden Knotenpunkt
aus und folgt dem Baum abwärts,
wobei man die Einsen („1") und Nullen („0") der Reihe nach
abliest. Die so erzeugte Kette von Bits stellt das komprimierte
Zeichen dar. Nehmen wir beispielsweise das Zeichen „$" und folgen dem Baum
abwärts,
so erhalten wir „0001". Demnach wird „$" durch „0001" repräsentiert.
-
Das
komprimierte Zeichen wird manchmal von hinten nach vorn ausgeschrieben,
sodass „$" als „1000" dargestellt ist.
Auf diese Weise lässt
es sich einfacher dekomprimieren (da wir dem Baum aufwärts folgen
können,
indem wir das komprimierte Zeichen von links nach rechts lesen).
-
In
derselben Weise muss zum Dekomprimieren eines Zeichens der Baum
einfach nur aufwärts
verfolgt werden, wobei die komprimierte Kette von Bits dazu verwendet
wird, an jedem Knotenpunkt zu entscheiden, ob nach links oder nach
rechts abgezweigt werden muss. Schließlich ist einer der zehn ursprünglichen
Knotenpunkte erreicht und das korrekte dekomprimierte Zeichen erkannt.
-
Wie
zu sehen ist, werden häufig
vorkommende Zeichen durch eine geringere Anzahl von Bits dargestellt;
ein Leerzeichen („Space") wird hier durch
eine „0" repräsentiert.
-
Verbesserte Huffman-Codierung.
-
Bei
einem ausreichend bekannten, verbesserten Verfahren zur Komprimierung
eines Stroms von Zeichen auf der Grundlage des Huffman-Algorithmus
wird jedes Zeichen einer Gruppe zugewiesen und sind es die Gruppen,
die als Zeichen des herkömmlichen
Huffman-Algorithmus behandelt werden. Dieses Verfahren stellt erheblich
geringere Anforderungen an den Speicher als das herkömmliche
Huffman-Verfahren, da es die Vergrößerung der Größe eines
Zeichens erlaubt und damit ein besseres Komprimierungsverhältnis ergibt.
Das verbesserte Huffman-Verfahren
verwendet darüber
hinaus eine „Zeichengruppe" anstelle der Zeichen
selbst für
die Erstellung eines Baumes; die Gruppen werden somit effektiv zu
den Zeichen der herkömmlichen
Huffman-Codierung.
-
Der
verbesserte Huffman-Baum wird in zwei Stufen erstellt. In der ersten
Stufe werden die Zeichen entsprechend einem gemeinsamen Verhaltensmuster
in Gruppen eingeteilt. Ein Verhaltensmuster kann beispielsweise
dieselbe Wahrscheinlichkeit sein, sodass die Zeichen je nach ihrer
relativen Häufigkeit
in Gruppen geordnet werden.
-
Das
Problem ist jedoch, dass sich in einem komprimierten Zeichen an
den Huffman-Code für
die Gruppe ein Bitmuster anschließen muss, das angibt, welches
Zeichen innerhalb der Gruppe komprimiert wurde. Wenn die Gruppe
keine Zweierpotenz Zeichen enthält,
dann werden Bitmuster verschwendet, was zu einer geringeren Effizienz
der Komprimierung führt.
Die Erfinder haben ein Verfahren entdeckt, das diese Probleme überwindet.
-
Die
Erfindung umfasst ein Verfahren zur Komprimierung von Daten, bei
dem die besagten Daten in Form von diskreten Einheiten vorliegen,
indem ein globaler, für
die Einheiten spezifischer Code ermittelt wird, wobei das Verfahren
die folgenden Schritte umfasst:
- a) Einteilen
der Einheiten in Gruppen gemäß gemeinsamer
Verhaltensmuster;
- b) Zuweisen eines gruppenspezifischen Codes für jede der
besagten Gruppen von Einheiten, wobei die Größen der besagten gruppenspezifischen
Codes entsprechend der Wahrscheinlichkeit des Auftretens der Einheit
geordnet werden; und
- c) Zuweisen eines spezifischen Einheitenkenncodes zum Identifizieren
eines bestimmten Zeichens innerhalb der Gruppe, wobei der Gesamtcode
die verketteten gruppenspezifischen und Kenncodes umfasst, wobei
der Kenncode die minimale Größe hat,
damit jede Einheit, die in der Gruppe möglicherweise vorkommt, spezifisch
zugewiesen werden kann;
dadurch gekennzeichnet, dass die diskreten
Einheiten in eine Anzahl von Untereinheiten untergliedert sind und
dass mindestens eine Untereinheit bearbeitet und komprimiert wird;
der gesamte komprimierte Code eine Verkettung aller Codes von komprimierten
Untereinheiten sowie eventuelle nicht komprimierte Untereinheiten
selbst beinhaltet; und wobei
mindestens einer Untereinheit
eine Mehrzahl von Verhaltensmustern zugewiesen ist und die besagten Gruppen
von Einheiten danach so in Gruppen eingeteilt werden, dass sie eine
jeweilige Kombination von Untereinheiten-Verhaltensmustern aufweisen.
-
Die
Erfindung wird nun anhand von Beispielen ausführlicher beschrieben.
-
Beispiel 1
-
Im
Folgenden wird ein einfaches, grundlegendes Beispiel für die Erfindung
unter Bezugnahme auf 2 beschrieben. In dem ausgearbeiteten
Beispiel sind vier (4) Gruppen oder Verhaltensmuster vorhanden. Die
Gruppe A enthält
alle Zeichen, die mit einer Wahrscheinlichkeit von 3 % auftreten,
nämlich 'B', 'C', '1' und '2',
die übrigen
Gruppen sind entsprechend der Wahrscheinlichkeit des Auftretens
der jeweiligen Zeichen zusammengestellt: Gruppe B enthält die Zeichen 'A', 'E' und '?'.
-
Gruppe
C enthält
die Zeichen 'D' und '$', und Gruppe D schließlich enthält nur das
Leerzeichen (SPACE).
-
-
Der
Baum beginnt zunächst
mit einem Knotenpunkt pro Gruppe (insgesamt vier). Die Knotenpunkte sind
beschriftet mit der Anzahl der in der Gruppe enthaltenen Zeichen
sowie der Wahrscheinlichkeit, mit der ein Zeichen dieser Gruppe
in einem zufälligen
Strom von Zeichen enthalten ist.
-
Für die Erstellung
des Baums gibt es drei mögliche
Operationen. Wo die Gruppe eine gerade Anzahl von Zeichen enthält, wird
ein Knotenpunkt platziert; diesem Knotenpunkt wird der zweifache
Wahrscheinlichkeitswert zugewiesen, der Zähler für den neuen Knotenpunkt weist
jedoch nur die halbe Anzahl Zeichen auf. Dem Knotenpunkt wird eine
Variable „X" von Zeichen zugewiesen,
die zu einem späteren
Zeitpunkt ausgefüllt wird,
je nachdem, welches Zeichen in der Gruppe für die Komprimierung ausgewählt wird.
Bei jedem weiteren Schritt in Richtung der Wurzel des Baums wird
ein neuer Knotenpunkt erstellt; dabei verdoppelt sich die Wahrscheinlichkeit
und halbiert sich die Anzahl der Elemente im Zähler. Wenn der Baum zum Komprimieren
von Daten verwendet wird, werden die Variablen „X" entsprechend dem auftretenden Zeichen
ausgefüllt.
Statt am oberen Ende des Baums eine Vielzahl von Verzweigungen zu
haben, hat man so einen einzigen Zweig und einen nur kleinen Bereich
für einen
Kennzeichner.
-
Beispielsweise
lautet der Zeichencode zum Dekomprimieren dieser Daten 101011: 1
gehe nach links, 0 gehe nach links, 1 gehe nach links. Danach ist
bekannt, dass das Zeichen B, C, 1 oder 2 ist – die letzten beiden Bits geben
Aufschluss darüber,
welches Zeichen genau gemeint ist.
-
Effektiv
besteht der komprimierte Code aus zwei Teilen: ein Teil enthält den Code,
der die Gruppe identifiziert, den Gruppencode. Wie auch bei Huffman
haben Gruppen, die beispielsweise Zeichen enthalten, welche nur
sehr selten vorkommen, längere
Gruppencodes als diejenigen Gruppen, die häufig verwendete Zeichen enthalten.
Der andere Teil des komprimierten Codes enthält den Kenncode, das heißt den Code,
der es von anderen Zeichen in der Gruppe unterscheidet. Gruppen
mit einer ungeraden Anzahl von Zeichen werden in zwei Gruppen untergliedert;
ein Zeichen wird herausgenommen, um eine neue Gruppe zu bilden,
die eine gerade Anzahl von Zeichen enthält, und eine neue Gruppe, die
nur ein einziges, nämlich
das herausgenommene Zeichen enthält.
-
Wenn
in einer Gruppe eine ungerade Anzahl von Zeichen enthalten ist,
wird die Gruppe auf zwei Knotenpunkte verteilt. Ein Zweig steht
dann für
nur ein einziges der Zeichen; der andere repräsentiert alle anderen Zeichen
und steht nun für
eine Gruppe, die eine gerade Anzahl von Zeichen enthält. Die
verbesserten Huffman-Bäume
weisen an Knotenpunkten, an denen keine Verzweigung erfolgt, effektiv
ein zusätzliches
Symbol „X" auf, das als Kennzeichner
dient. Wo von einer Gruppe mit ungerader Anzahl von Elementen eine
Verzweigung erfolgt, steht ein Kennzeichner „D", der entweder den Wert „1" oder den Wert „0" hat, um anzuzeigen, welcher
Zweig nach der vorstehend erwähnten
Aufteilung welcher ist, das heißt,
wenn „D" den Wert „1" hat, kann es den
Zweig repräsentieren,
der für
das Zeichen steht, welches aus der Gruppe herausgenommen wurde,
um eine Gruppe mit einer geraden Anzahl von Elementen zu erhalten,
und kann der Wert „0" die neue Gruppe
mit einer geraden Anzahl von Elementen bezeichnen.
-
Das
Symbol „D" dient dazu, die
Gruppe in zwei neue Gruppen zu untergliedern. Da jede neue Gruppe einen
eigenen Gruppenkennzeichner besitzt, müssen dem Symbol „D" keine Nullen („0") und Einsen („1") zugewiesen werden.
-
Die
Kennzeichner „X" in den ursprünglichen
und in den neuen Gruppen mit gerader Anzahl von Zeichen identifizieren
das Zeichen in der betreffenden Gruppe mit gerader Anzahl von Zeichen.
-
Wie
schon erwähnt,
hat der Erfinder festgestellt, dass es zur Optimierung der Effizienz
möglich
ist, einen Knotenpunkt in zwei Knotenpunkte zu unterteilen, was
durch einen einstelligen Kennzeichner angezeigt wird. In der vorliegenden
Patentschrift bezeichnen wir diesen als „D".
-
„X" und „D" sind tatsächlich Stellen
des Kenncodes und dienen dazu, zwischen zwei beliebigen Zeichen
mit gleichem Verhaltensmuster zu unterscheiden. Der erste Schritt
der Komprimierung besteht darin, jedes Zeichen mit einer eindeutigen
Kennnummer zu versehen, die es von anderen Zeichen mit demselben
Verhaltensmuster unterscheidet.
-
Das
allgemeine Verfahren zum Erstellen eines Baums für den verbesserten Huffman-Algorithmus
ist wie folgt:
- – Suchen nach dem Knotenpunkt
mit der geringsten Wahrscheinlichkeit. Nehmen wir an, dieser Knotenpunkt
enthielte n Zeichen. Der nächste
Schritt ist abhängig
von dem Wert von n:
1) Wenn n eine gerade Zahl ist, einen neuen
Knotenpunkt mit der doppelten Wahrscheinlichkeit, jedoch nur der
halben Anzahl von Zeichen n erstellen. Diesen neuen Knotenpunkt
mit dem alten verbinden und den Zweig mit einem „X" beschriften.
2) Wenn n eine ungerade
Zahl ist und n>1 ist,
zwei neue Knotenpunkte mit derselben Wahrscheinlichkeit erstellen,
wobei derjenige auf der linken Seite n – 1 Zeichen enthält und derjenige
auf der rechten Seite ein (1) Zeichen enthält. Diese beiden neuen Knotenpunkte
mit dem alten verbinden und die Zweige mit einem „D" beschriften.
3)
Wenn n = 1 ist, den Knotenpunkt mit der zweitgeringsten Wahrscheinlichkeit
suchen. Nehmen wir an, dieser Knotenpunkt enthielte m Zeichen.
a)
Wenn m>1 ist, zwei
neue Knotenpunkte mit derselben Wahrscheinlichkeit erstellen, wobei
einer m – 1 Zeichen
enthält
und der andere ein (1) Zeichen enthält. Diese beiden neuen Knotenpunkte
mit dem alten verbinden und die Zweige mit einem „D" beschriften.
b)
Es ist nun ein Knotenpunkt mit der geringsten Wahrscheinlichkeit
und ein Knotenpunkt mit der zweitgeringsten Wahrscheinlichkeit vorhanden,
die beide jeweils ein Zeichen enthalten. Diese beiden Knotenpunkte
zu einem neuen Knotenpunkt zusammenfassen, der ein einzelnes Zeichen
enthält.
Den Zweig mit der geringsten Wahrscheinlichkeit mit einer „1" und den Zweig mit
der zweitgeringsten Wahrscheinlichkeit mit einer „0" beschriften. Die
Summe der beiden Wahrscheinlichkeitswerte in den neuen Knotenpunkt
eintragen.
-
Für die Komprimierung
und Dekomprimierung sollte jedes Zeichen in einer Gruppe mit einer
eindeutigen Kennummer aus der Reihe {0, 1, 2, ...} bezeichnet sein.
Dies dient zum Unterscheiden zwischen zwei Zeichen innerhalb derselben
Gruppe.
-
Angenommen,
das Zeichen, das komprimiert werden soll, hat den eindeutigen Kennzeichner
i. Suchen Sie in dem Baum das richtige Verhaltensmuster und folgen
Sie dem Baum abwärts,
wobei Sie bei jedem der Knotenpunkte die folgenden Schritte ausführen:
- 1) Wenn der Knotenpunkt einen Zweig „0" oder „1" hat, das Bit in
die Kette der komprimierten Bits einfügen.
- 2) Wenn das Etikett „X" lautet, das niedrigstwertige
Bit von i in die Kette der komprimierten Bits einfügen. Danach
i durch 2 dividieren (abgerundet).
- 3) Dann für
ein Etikett „D", wenn i den Wert „0" hat, dem Zweig nach
rechts folgen. Andernfalls i um 1 vermindern und dem Zweig nach
links folgen.
-
Die
daraus resultierende Kette von Bits ist das komprimierte Zeichen.
Für die
Dekomprimierung wird dieser Ablauf einfach umgekehrt, indem anhand
der komprimierten Bits der Baum nach oben bis zu dem richtigen Verhaltensmuster
verfolgt wird. Der eindeutige Kennzeichner i sollte anfänglich auf „0" gesetzt werden und
wird rekonstruiert, indem an jedem der Knotenpunkte die folgenden
Schritte ausgeführt
werden:
- 1) Wenn sich der Knotenpunkt verzweigt,
anhand des entsprechenden Bits in der komprimierten Bitkette entscheiden,
welchem Zweig zu folgen ist.
- 2) Bei Erreichen eines „X", i mit 2 multiplizieren
und anschließend
i um 1 erhöhen,
wenn das entsprechende komprimierte Bit ebenfalls „1" ist.
- 3) Bei Erreichen eines linken „D"-Zweigs, i um 1 erhöhen.
-
Wie
zu sehen ist, besteht der Unterschied zwischen den beiden Verfahren
darin, dass bei der herkömmlichen
Huffman-Codierung für
jedes Zeichen ein eigener Knotenpunkt erforderlich ist.
-
Anwendung auf Header
-
In
einer spezifischen Ausführungsform
der Erfindung wird ein vollständiger
Header als ein einzelnes Zeichen behandelt.
-
Bei
Headern mit 320 Bit bedeutet dies, dass es 2^320 verschiedene mögliche Header
gibt. Es wäre nicht
möglich,
in diesem Fall einen herkömmlichen
Huffman-Baum zu realisieren. Mit dem verbesserten Huffman-Verfahren
gemäß der Erfindung
jedoch können
alle möglichen
Header in eine beträchtlich
geringere Anzahl von Gruppen eingeordnet werden, wobei jede Gruppe
Header enthält,
die ein gemeinsames Verhaltensmuster aufweisen. Beispielsweise können sie
in, sagen wir, 1000 Gruppen unterteilt werden, wobei jede Gruppe
Header enthält,
die mit derselben Wahrscheinlichkeit auftreten; auf diese Weise
sind 1000 verschiedene Wahrscheinlichkeitswerte vorhanden, dass
einer der Header vorkommt. Es können
unter Umständen
(insbesondere bei weniger häufigen
Headern) viele Millionen Header in jeder Wahrscheinlichkeitsgruppe
enthalten sein. Bei der Implementierung des verbesserten Huffman-Verfahrens für Header
werden die Header nach ihrer Wahrscheinlichkeit in Gruppen eingeteilt
und werden diese Gruppen als Huffman-Zeichen behandelt.
-
Beispiel 2
-
3 zeigt
ein Beispiel eines Codierungsverfahrens nach Huffman.
-
Ein
Header enthält
320 Bits und kann unregelmäßig („irregular") sein, das heißt, es gibt
2 hoch 320 mögliche
Header. Diese sind in, sagen wir, vier (4) Verhaltensmuster gruppiert:
Solche, die mit der Wahrscheinlichkeit A % auftreten (beispielsweise
4 Header enthaltend), solche mit der Wahrscheinlichkeit B % (4 Header enthaltend),
solche mit der Wahrscheinlichkeit C % (beispielsweise 10 Header)
und solche mit der Wahrscheinlichkeit D % (diese Gruppe soll beispielsweise
unregelmäßig sein
und enthält
die übrigen
Header, also 2 hoch 320-18). Die Wahrscheinlichkeitswerte A bis
D sind der Reihe nach absteigend. Der verbesserte Huffman-Baum ist wie in 3 aufgebaut.
Die Gruppe A wird durch eine „1" dargestellt, die
Gruppe B durch „01", die Gruppe C durch „001" und die Gruppe D
durch „000". Diese sind der
erste Teil der komprimierten Header und bilden effektiv die Huffman-Codes für die Gruppen.
Der zweite Teil ist der Kennzeichner, der den Header von andern
Headern in derselben Gruppe unterscheidet. In der ersten Gruppe
A sind vier Header enthalten, daher wird hier nur ein Kennzeichnerregister
mit zwei Bits benötigt,
das vier Kombinationsmöglichkeiten
bietet. Damit umfasst der komprimierte Header für ein Element der Gruppe A
insgesamt drei Bits: „0" gefolgt von dem Kennzeichner.
Für die
Gruppe D gibt es noch immer sehr viele verschiedene Header-Kombinationen: 2^320-18.
In diesem Fall ist es unmöglich,
eine Nachschlagetabelle mit Kennzeichnern für jeden Header zu haben, daher
wird der Header selbst zum Kennzeichner. So wird der gesamte Header
gebildet, indem „000" zu dem Header selbst
hinzugefügt
wird. Obwohl der komprimierte Header in diesem Fall eigentlich um
drei (3) Bits länger
wird, werden durch Verwendung dieses Systems Einsparungen erzielt,
da die meisten Header, die vorkommen, nicht unregelmäßig sein
werden und somit mit kürzeren
Gruppencodes wie bei Huffman, jedoch mit wesentlich kürzeren Kennzeichnern,
komprimiert werden.
-
Damit
muss der Baum nicht mit einem Knotenpunkt für die Unterscheidung jedes
einzelnen möglichen Headers
ausgestattet werden; er wäre
dann aufgrund der Größe nicht
realisierbar.
-
Das
Beispiel beschreibt ein einfaches Beispiel, in dem Header in vier
Gruppen eingeteilt sind. Dies ist ein Extremfall, um die Erfindung
zu veranschaulichen, und die Anzahl der Gruppen würde in einer
geeigneten Weise gewählt,
um optimale Effizienz zu gewährleisten.
Typischerweise können
1000 Gruppen vorhanden sein, doch wäre dies immer noch besser zu
bewältigen
als 2^320, ein Wert, mit dem ein Computer überfordert ist. Im Allgemeinen
ist bei Huffman die Anzahl der Zeichen ein Maß der Verarbeitungszeit.
-
In
noch einer weiteren bevorzugten Ausführungsform macht man sich die
Tatsache zunutze, dass der Header in eine Reihe von Feldern unterteilt
ist. Diese Felder tendieren dazu, sich unabhängig voneinander zu verhalten.
-
Beispiel 3
-
In
einem einfachen Beispiel einer bevorzugten Ausführungsform können eine
oder mehrere der Untereinheiten gemäß dem vorstehend beschriebenen
verbesserten Huffman-Verfahren komprimiert werden. Der komprimierte
Code für
den gesamten Header würde
die verketteten komprimierten Codes für die Untereinheiten sowie
die Untereinheiten selbst für
jede Untereinheit, die nicht komprimiert wird, enthalten.
-
Wenn
beispielsweise ein Header zwei Untereinheiten umfasst, wobei die
erste Untereinheit eine Adresse beinhaltet und die zweite Untereinheit
eine zufällige
Datenkette, umfasst der gesamte komprimierte Header das komprimierte
Adressfeld, das mit der zufälligen
Datenkette verkettet ist.
-
Zu
beachten ist, dass die Felder in dem komprimierten Header nicht
in derselben Reihenfolge erscheinen müssen wie die Felder in dem
unkomprimierten Header.
-
Die
nachstehende Tabelle zeigt einen typischen Header; dieser kann Felder
enthalten wie beispielsweise IP-Header, Versionsnummer, Header-Länge, Reserviert-Flag,
Quelladresse, Zieladresse, Art des Dienstes. Jedes Feld hat eine
Anzahl unterschiedlicher möglicher
Verhaltensmuster: beispielsweise ist das Adressfeld ein 32-Bit-Feld,
welches das Ziel des Datenpakets angibt; sehr häufig ist dies identisch mit
demjenigen des vorherigen Headers, beispielsweise sind die Datenpakete
für das
Mobiltelefon bestimmt, und nur bei seltenen Gelegenheiten ist es
unter Umständen
auf ein anderes Telefon umgeschaltet worden, beispielsweise „static" (statisch; identisch
mit dem Feldwert im vorherigen Header), „alternating" (alternierend; wechselt
zwischen einer kleinen Anzahl von Werten), „irregular" (unregelmäßig; völlig zufällig – kann nicht komprimiert werden), „inferred" (abgeleitet; Wert
kann von einem anderen Feld abgeleitet werden, beispielsweise das
Längenfeld – wie lang
der Header ist, kann anhand aller anderen Felder festgestellt werden).
Dies ist in dem nachstehenden ausgearbeiteten Beispiel dargestellt,
das eine Tabelle eines Headers enthält, welcher sich aus drei Feldern
zusammensetzt:
-
Jedes
Feld kann ein oder mehrere Verhaltensmuster aufweisen; in dem Beispiel
kann das erste Feld zwei Verhaltensmuster aufweisen, STATIC (statisch)
und INFERRED (abgeleitet), das zweite Feld hat drei verschiedene
Arten von Verhaltensmustern, STATIC, INFERRED und ALTERNATING (alternierend),
und das dritte Feld lediglich eines, STATIC. Dies ist in der Spalte
2 der nachstehenden Tabelle angegeben.
-
Beispiel 4
-
Es
wird nun eine bevorzugte, komplexere Ausführungsform beschrieben. Sie
ist auf Header anwendbar, welche Felder enthalten, wobei eines oder
mehrere der Felder unterschiedliche Verhaltensmuster aufweisen kann/können. Der
erste Schritt für
jedes Feld ist, einen oder mehrere verschiedene Verhaltenstyp(en)
zuzuweisen. Der nächste
Schritt besteht darin, für
jedes Feld die Wahrscheinlichkeit zu bestimmen, dass es einen bestimmten
Verhaltenstyp aufweist, beispielsweise für jedes Feld die Wahrscheinlichkeit
festzustellen, dass es STATIC oder INFERRED etc. ist. Dies wird
in der letzten Spalte der nachstehenden Tabelle angegeben.
-
Um
die Anzahl der verschiedenen Gruppen zu ermitteln, die für das verbesserte
Huffman-Verfahren angewendet werden, das heißt, die Anzahl verschiedener
globaler Headerverhaltensmuster, wird die Anzahl der verschiedenen
Feldverhaltensmuster für
jedes Feld herausmultipliziert. Im Beispiel wird ein Verhaltensmuster
von Feld 1 ausgewählt,
ein Verhaltensmuster von Feld 2 und ein Verhaltensmuster von Feld
3. Dies wird anschließend
für jede
Kombination von Feldverhaltensmustern wiederholt. Dies ist in der
zweiten Tabelle unten dargestellt. Zusätzlich wird die Wahrscheinlichkeit
jeder Kombination ermittelt wie in der letzten Spalte der zweiten
Tabelle angegeben. Danach wird der Huffman-Baum so aufgebaut, dass
die Gruppen am oberen Ende des Huffman-Baums, die der jeweiligen
Kombination von Header-Typen entsprechen, derart angeordnet sind,
dass diejenigen mit der geringsten Wahrscheinlichkeit die meisten
Verzeigungen und damit den längsten Gruppencode
aufweisen und diejenigen mit der größten Wahrscheinlichkeit des
Auftretens die kürzesten
Verzweigungen und Gruppencodes haben.
-
In
einer weiteren Ausführungsform
der vorliegenden Erfindung ist es vorteilhaft, für jedes Verhaltensmuster ein
Register darüber
zu führen,
wie viele Varianten es annehmen kann. So gibt es beispielsweise
nur eine Möglichkeit,
dass ein Feld „static" sein kann, das heißt, sich
nicht verändert,
für ein
8-Bit-Feld jedoch 256 Möglichkeiten, „irregular" zu sein, und vielleicht
4 Möglichkeiten
zu alternieren („alternating"). Das Wissen hierüber ermöglicht es,
die Größe des Kennzeichners
zu bestimmen. Wenn das Feld „irregular" ist und es 256 Möglichkeiten
hierfür
gibt, dann muss das Kennzeichnercoderegister eine Größe von 8
Bit haben und würde der
Kennzeichnercode das Feld selbst beinhalten. Alterniert das Feld
zwischen 4 Werten, muss das Kennzeichnerregister nur zwei Bits groß sein,
was vier verschiedene Kombinationen erlaubt.
-
-
-
Verschiedene
Verfahren können
angewandt werden, um dafür
zu sorgen, dass die Komprimierung erfolgt. In einem statischen Modus
wird das Schema manuell programmiert, um einen Protokollstack mit
optimaler Effizienz zu komprimieren. Eingabe ist eine Liste der
Felder innerhalb des Protokollstacks sowie für jedes Feld ein Satz möglicher
Varianten, wie sich das Feld verhalten kann. Diese Eingabeliste
wird in eine Form umgewandelt, die sich für das verbesserte Huffman-Verfahren
eignet, wie vorstehend beschrieben. Das Verfahren berechnet das
beste Format für
die komprimierten Header und speichert die Ergebnisse in Form eines
Huffman-Baums. Alternativ werden der Komprimierer und der Dekomprimierer
programmiert, indem eine spezielle Profilierungsnachricht gesendet
wird, welche die Liste der Feldverhaltensmuster enthält. Diese
Nachricht wird üblicherweise
immer dann vom Netzadministrator gesendet, wenn ein neuer Protokollstack
in das System eingefügt
werden muss. Eine weitere Alternative ist ein „Lern-Modus", der einen beliebigen
Datenpaketstrom abtastet und dynamisch lernt, wie die Header der
Datenpakete am besten zu komprimieren sind. Wie effizient dieses
Verfahren ist abhängig
von der Anzahl der Verhaltensmustertypen, die erkannt werden können. Eine weitere
bevorzugte Ausführungsform
ist ein „Hybrid-Modus", bei dem das System
vorab programmiert wird, einen Protokollstack wie im „Static"-Modus zu komprimieren,
jedoch auch der Lern-Modus aktiviert ist für den Fall, dass der Protokollstack
noch effizienter komprimiert werden könnte. Dieser Modus ist besonders
nützlich für die Bewältigung
unerwarteter Veränderungen
in der Art und Weise, wie sich der Protokollstack verhält.
-
Erzeugen eines Byte-aligned
Headers
-
Bestimmte
Protokolle der Sicherungsschicht („Link Layer") machen es erforderlich,
dass alle Pakete eine auf ganze Bytes aufgestockte Länge haben
(= Byte-aligned sind). Da die Nutzlast („Payload") bereits diese Form hat, bedeutet das,
dass die komprimierten Header ebenfalls Byte-aligned sein müssen. Byte-aligned Header
können
auf zweifache Weise erzeugt werden. Die einfachste weise ist, jeden
Header mit ausreichend vielen Bits so weit aufzufüllen, dass
er nur ganze Bytes enthält.
Diese zusätzlichen
Bits können
dann für
die Prüfsumme
der zyklischen Redundanzprüfung
(CRC, Cyclic Redundancy Check) oder die Folgenummer zum Schutz vor
dem Verlust von Datenpaketen genutzt werden. Allerdings ist dieses
Verfahren ineffizient und neigt dazu, den Umfang der Fehlerprüfung von
einem Header zum nächsten
willkürlich
zu wählen.
Eine bessere Alternative ist, immer an erster Stelle Byte-aligned
Header zu erzeugen. Im herkömmlichen
Huffman-Verfahren ist dies zu realisieren, indem rekursiv die 256
Knotenpunkte mit den niedrigsten Wahrscheinlichkeitswerten zusammengefasst
werden (anstatt die beiden Knoten mit den niedrigsten Wahrscheinlichkeitswerten).
Jeder der 256 Zweige wird mit einem anderen 8-Bit-Muster bezeichnet.
Der verbesserte Huffman-Algorithmus kann außerdem so modifiziert werden,
dass er in ähnlicher
Weise Byte-aligned Header erzeugt.
-
Das
System kann auch problemlos Felder mit variabler Länge verarbeiten.
Tatsächlich
ist es einfach nur eine Frage des Hinzufügens eines Verhaltensmusters
für jede
mögliche
Länge des
Feldes mit variabler Länge.
Zu beachten ist, dass diese Codierung implizit die Länge des
Feldes beinhaltet, sodass es, wenn ein separates Feld mit dem Längenwert
vorhanden ist, als INFERRED klassifiziert werden sollte, um eine
doppelte Übertragung
dieser Information zu vermeiden.