-
Gebiet der Erfindung
-
Die
vorliegende Erfindung bezieht sich im Allgemeinen auf Kommunikationsnetze
und insbesondere auf ein Verfahren und eine Vorrichtung zum Bestimmen
des längsten übereinstimmenden
Präfixes
in Kommunikationsnetzen.
-
Hintergrund der Erfindung
-
Datenkommunikationsnetze
verwenden Adressen, um Informationspakete zwischen den Anwendern
weiterzuleiten. Da sich die Datenkommunikationsnetze fortgesetzt
entwickeln, nehmen die Anzahl der unterstützten Adressen, die Menge des
Verkehrs und die Geschwindigkeit, mit der sich der Verkehr bewegt,
alle zu. Als solche müssen
die Router in derartigen Kommunikationsnetzen die Quellen und die
Ziele der Endstationen, die dem Verkehr zugeordnet sind, schneller
als in der Vergangenheit bestimmen.
-
Die
Lenkung von Datenpaketen in Internetprotokoll-Netzen (IP-Netzen)
erfordert das Bestimmen des besten übereinstimmenden Präfixes, das den
Quell- und Zieladressen für
das Paket entspricht, was außerdem
als die Bestimmung einer längsten Präfix-Übereinstimmung
(LPM) für
die Adressen bezeichnet werden kann. Die Router, die die Pakete weiterleiten,
enthalten typischerweise eine Datenbank, die eine Anzahl von Adressenpräfixen und
ihre zugeordneten Weiterleitungsentscheidungen speichert, die angeben,
wohin die Daten als Nächstes
gesendet werden sollten (die nächsten
Sprünge).
Wenn der Router ein Paket empfängt,
muss er bestimmen, welches der Präfixe in der Datenbank die beste Übereinstimmung
für das
Paket besitzt.
-
Es
sind im Allgemeinen binäre
Tries verwendet worden, um die LPM für Datenpakete zu bestimmen. 1 veranschaulicht
eine grundlegende binäre
Trie-Struktur, die eine Menge binärer Präfixe enthält. Der in 1 veranschaulichte
Beispiel-Trie entspricht einem Sechs-Bit-Adressenraum, der verwendet wird, um
die Erörterung
zu vereinfachen. Die dunkel getönten
Kreise geben die gültigen
Präfixe
an. Der in 1 veranschaulichte binäre Trie
enthält eine
vorgegebene Route, die der Wurzel des Tries entspricht, und mehrere
gültige
Präfixe,
die nur teilweise (z. B. 000XXX) oder vollständig (z. B. 000100) spezifiziert
sein können.
Die in der aufzulösenden Adresse
enthaltenen Bits werden verwendet, um Verzweigungsentscheidungen
bei jedem der Knoten innerhalb des Tries zu treffen, wobei 0-Bits
eine Verzweigung nach links verursachen, während Eins-Bits eine Verzweigung
nach rechts verursachen. Wie veranschaulicht ist, ist das binäre Präfix 000XXX
so wie das Präfix
000100 ein gültiges
Präfix.
Obwohl ein Paket, das eine Adresse besitzt, die dem Präfix 000100 entspricht,
außerdem
dem gültigen
Präfix
000XXX entsprechen würde,
ist das längste übereinstimmende
Präfix
000100, wobei folglich 000100 das Präfix ist, das für die Adresse
ausgewählt
werden muss.
-
2 veranschaulicht
eine Technik des Standes der Technik, um den in 1 veranschaulichten
grundlegenden binären
Trie zu vereinfachen. 2 veranschaulicht einen Patricia-Trie,
der den grundlegenden binären
Trie in Bereichen abflacht, wo die Entscheidungen bei den Knoten
innerhalb der Trie-Struktur nicht zu mehr als einer möglichen
Präfixbestimmung
führen
können.
Mit anderen Worten, die Knoten innerhalb der Trie-Struktur, die
auf einer Route zu einem gültigen
Präfix
durchquert werden, ohne dass eine weitere Entscheidung erforderlich
gemacht wird, sind unterdrückt.
Eine derartige Wegkomprimierung kann die durchschnittliche Anzahl von
Speicherzugriffen, die erforderlich ist, um die LPM für eine Adresse
bestimmen, auf log2N Zugriffe verringern,
wobei N die Anzahl der gültigen
Präfixe ist,
die im Trie gespeichert sind. Im schlimmsten Fall, in dem ein Weg
nicht komprimiert werden kann, können
jedoch die Patricia-Bäume
L Speicherzugriffe erfordern, um eine LPM aufzulösen, wobei L gleich der Anzahl
der Bits in der Adresse ist, die in einigen Anwendungen, wie z.
B. dem IP, Version 4, 32 Bits und für das IP, Version 6, 128 Bits
betragen kann. Die Variabilität
der Anzahl der erforderlichen Speicherzugriffe stellt Probleme für die Konstruktion
von Hochgeschwindigkeits-Routern dar. Außerdem würden die Anforderungen an die
Speicherbandbreite die Router-Konstruktion
trotzdem unpraktisch machen, wenn hohe Verbindungsraten unterstützt werden
müssen, selbst
wenn alle LPM-Bestimmungen mit log2N Speicherzugriffen
ausgeführt
werden könnten.
-
Ein
weiteres Trie-Verarbeitungsverfahren, das versucht, die Zeit zu
verringern, die erforderlich ist, um das geeignete Präfix zu bestimmen,
besteht darin, einen Mehrwegeverzweigungs-Trie zu erzeugen, der
mehrere Bits der Adresse in einem einzigen Schritt verarbeitet.
Dies ist in 3 veranschaulicht, wo ein Trie,
der in einem 32-Bit-Adressenraum vorhanden ist, in eine Menge von
Schritten oder Strides aufgebrochen worden ist. Wie veranschaulicht
ist, können
die Strides so ausgewählt
sein, dass sie verschiedene Bitlangen besitzen. Folglich können 4-Bit-Strides,
8-Bit-Strides und sogar 16-Bit-Strides verwendet werden, um die
Trie-Struktur zu durchqueren. Für
jeden Stride wird ein Abschnitt der Adresse mit der Menge von Bits
verglichen, die diesem Stride entspricht, um zu bestimmen, ob eine
LPM aufgelöst worden
ist oder ob ein oder mehrere weitere Strides durchquert werden müssen, um
die LPM zu bestimmen.
-
Um
eine Anzahl von Adressenbits in einem Stride verarbeiten zu können, muss
eine Präfixexpansion
ausgeführt
werden, so dass es ein gültiges Präfix für jeden
binären
Wert bei der Schnitttiefe für den
Stride gibt, wobei die Schnitttiefe durch die Größe des Strides bestimmt ist. 4 zeigt
die Wurzelebene eines 5-Bit-Abschnitts
einer Trie-Struktur nach der Präfixexpansion.
Die Schnitttiefe ist die unterste Menge der Präfixe der in 4 veranschaulichten Trie-Struktur,
wobei sie durch einen langen rechteckigen Kasten umgeben gezeigt
ist. Um gültige
Präfixe bei
allen Knoten auf der Schnittebene zu haben, kann es notwendig sein,
neue Knoten auf der Schnitttiefe zu erzeugen, um den Trie vollständig zu
machen. Die Werte für
die neu erzeugten Knoten werden dann von den Elternknoten ausgebreitet.
Die Ausbreitung eines Präfixwertes
zu einem neu erzeugten Knoten ist über die Pfeile veranschaulicht,
die von den Elternknoten ausgehen. Ein Beispiel ist der beschriftete
Elternknoten, der ein gültiges
Präfix
zu drei beschrifteten ausgebreiteten Knoten ausbreitet. Wie zu sehen ist,
dient der Knoten auf der höchsten
Ebene oder der Wurzelknoten außerdem
als ein Elternknoten für
einige der Knoten auf der Schnittebene.
-
Jene
Knoten in der Trie-Struktur nach 4, die eine
endgültige
Präfixübereinstimmung
und eine getroffene Weiterleitungsentscheidung darstellen, sind
durch einen dunkel getönten
Kreis dargestellt, wohingegen jene Knoten, die angeben, das auf
den nächsten
Stride zugegriffen werden muss, um in Richtung auf die Bestimmung
einer Weiterleitungsentscheidung fortzufahren, durch dunkel getönte Quadrate
dargestellt sind. Folglich stellen die dunkel getönten Kreise
einen Punkt dar, an dem die Suche nach einer Präfixübereinstimmung beendet wird,
wohingegen die dunkel getönten
Quadrate angeben, dass die Präfixübereinstimmung
auf einer tieferen Ebene in der Gesamt-Trie-Struktur vorhanden sein muss
und deshalb die Suche ausgedehnt wird.
-
Der
Artikel von UGA, M., u. a., "A
Fast and compact longest match prefix look-up method using pointer
cache for very long network address", Computer Communications ans Networks,
1999, Proceedings 8th International Conference
an Boston, MA, USA, 11.-13. Okt. 1999, Piscataway, NJ, USA, IEEE, USA,
11. Oktober 1999, Seite 595-602, offenbart ein Tabellennachschlageverfahren
für die
längste Übereinstimmung
für sehr
lange Netzadressen, wie das IP, Version 6. Das Verfahren verwendet
zwei Ideen für
eine Lenkungstabelle, die in einer Baumstruktur angeordnet ist.
Die erste Idee ist, das Nachschlagen in der Tabelle schnell zu machen,
indem die Zeiger auf die Zwischenknoten im Baum in einem Cache-Speicher
gespeichert werden und die Anzahl der Knotendurchquerungen verringert
wird. Die zweite Idee ist, die für
jeden Knoten im Baum erforderliche Speichergröße um ein Drittel zu verringern,
indem gemeinsame Abschnitte der Adressen benachbarter Knoten beseitigt
werden.
-
Weil
2N gültige
Präfixe
typischerweise gespeichert sind, um einen N-Bit-Stride zu verarbeiten, erfordern
größere Strides
eine große
Menge an Speicher, was ein begrenzender Faktor für die gewählte Stride-Größe sein
kann. Kleinere Strides erfordern im Durchschnitt mehr Speicherzugriffe,
um die Weiterleitungsentscheidungen zu ermitteln. Folglich gibt
es einen Kompromiss zwischen der Menge des Speichers, die erforderlich
ist, um die Daten für
eine Trie-Struktur zu speichern, und der Anzahl der Speicherzugriffe,
die erforderlich sind, um die Trie-Struktur zum geeigneten Endpräfix vollständig zu
durchqueren.
-
Folglich
gibt es einen Bedarf an einem Verfahren und einer Vorrichtung, die
den Speicher verringern, der erforderlich ist, um die den Strides
in der Trie-Struktur zugeordneten Werte zu speichern, so dass die
Präfixübereinstimmung
unter Verwendung einer minimalen Anzahl von Speicherzugriffen ausgeführt werden
kann.
-
Kurzbeschreibung der Zeichnung
-
1 veranschaulicht
eine graphische Darstellung einer binären Trie-Struktur des Standes
der Technik;
-
2 veranschaulicht
eine graphische Darstellung einer Patricia-Trie-Struktur des Standes
der Technik;
-
3 veranschaulicht
eine graphische Darstellung einer binären Trie-Struktur des Standes
der Technik, die in eine Anzahl von Strides aufgebrochen ist;
-
4 veranschaulicht
eine graphische Darstellung eines Tries des Standes der Technik
mit expandiertem Präfix;
-
5 veranschaulicht
die Komprimierung der Stride-Ergebnisse
für einen
Trie-Schnitt zu einer Menge von komprimierten Stride-Ergebnissen
gemäß einer
speziellen Ausführungsform
der vorliegenden Erfindung;
-
6 veranschaulicht
eine graphische Darstellung eines Trie-Schnittes, der einem Stride
zugeordnet ist, der komprimierte Knoten enthält;
-
7 veranschaulicht
die weitere Komprimierung der komprimierten Stride-Ergebnisse in
einen Stride-Datensatz
und entsprechende Blatt- und Zweigtabellen gemäß einer speziellen Ausführungsform
der vorliegenden Erfindung;
-
8 veranschaulicht
eine alternative Form der weiteren Komprimierung der komprimierten
Stride-Ergebnisse
in einen Stride-Datensatz, der Unter-Tries und eine entsprechende Blattzeigertabelle gemäß einer
speziellen Ausführungsform
der vorliegenden Erfindung enthält;
-
9 veranschaulicht
eine graphische Darstellung eines Trie-Schnittes mit komprimierten
Knoten, der zwischen nachfolgenden dicht gepackten und nicht dicht
gepackten Datensätzen
gemäß einer speziellen
Ausführungsform
der vorliegenden Erfindung unterscheidet;
-
10 veranschaulicht
eine graphische Darstellung eines nicht dicht gepackten Stride-Datensatzes
gemäß einer
speziellen Ausführungsform der
vorliegenden Erfindung;
-
11 veranschaulicht
eine graphische Darstellung eines dicht gepackten Datensatzes gemäß einer
speziellen Ausführungsform
der vorliegenden Erfindung;
-
12 veranschaulicht
eine graphische Darstellung eines dicht gepackten Blockes gemäß einer
speziellen Ausführungsform
der vorliegenden Erfindung;
-
13 veranschaulicht
einen Ablaufplan eines Verfahrens zum Komprimieren von Stride-Daten gemäß einer
speziellen Ausführungsform
der vorliegenden Erfindung;
-
14 veranschaulicht
einen Blockschaltplan einer Paketweiterleitungsschaltung gemäß einer speziellen
Ausführungsform
der vorliegenden Erfindung;
-
15 veranschaulicht
einen Blockschaltplan eines Paketweiterleitungsprozessors gemäß einer speziellen
Ausführungsform
der vorliegenden Erfindung;
-
16 veranschaulicht
einen Ablaufplan eines Verfahrens zur Paketlenkung gemäß einer
speziellen Ausführungsform
der vorliegenden Erfindung;
-
17 veranschaulicht
einen Ablaufplan eines Verfahrens zum Verarbeiten eines dicht gepackten
Stride-Datensatzes
gemäß einer
speziellen Ausführungsform
der vorliegenden Erfindung; und
-
18 veranschaulicht
eine graphische Darstellung der Bestimmung einer Weiterleitungsentscheidung
für eine
spezielle Adresse gemäß einer speziellen
Ausführungsform
der vorliegenden Erfindung.
-
Ausführliche Beschreibung einer
bevorzugten Ausführungsform
der Erfindung
-
Im
Allgemeinen schafft die vorliegende Erfindung ein Verfahren und
eine Vorrichtung zum Komprimieren der den Trie-Schnitten (Strides)
zugeordneten Daten und ein Verfahren und eine Vorrichtung für die Verwendung
derartiger komprimierter Daten zum Bestimmen der Weiterleitungsentscheidungen für Datenpakete
in einem Kommunikationsnetz. Die dargestellte Komprimierungstechnik
erzeugt für
jede Menge komprimierter Daten ein Paar von Bitmaps und ein Paar
von Basiszeigern. Die Bitmaps werden mit einem Abschnitt der Adresse
verglichen, um zu ermitteln, ob die Weiterleitungsentscheidung innerhalb
dieses Abschnitts des Tries bestimmt ist. Die Weiterleitungsentscheidungen
sind in einer Blatttabelle gespeichert, auf die über einen Blatttabellen-Index
zugegriffen wird. Der Blatttabellen-Index wird erzeugt, indem ein
aus wenigstens einer der Bitmaps erzeugter Blatttabellen-Offset
mit einem im Stride-Datensatz enthaltenen Blatttabellen-Basiszeiger kombiniert
wird. Folglich wird, falls die Weiterleitungsentscheidung innerhalb
des Strides bestimmt ist, über
den Blatttabellen-Index auf die Blatttabelle zugegriffen, um die
Weiterleitungsentscheidung wiederzugewinnen. Falls die Weiterleitungsentscheidung
innerhalb des Strides nicht vollständig bestimmt ist, wird eine
Zweigtabelle verwendet, um den Ort des nachfolgenden Strides zu
bestimmen, der zu verarbeiten ist. Auf die Zweigtabelle wird über den
Zweigtabellen-Index zugegriffen, der durch das Kombinieren des Zweigtabellen-Basiszeigers
des Strides mit einem Zweigtabellen-Index, der aus einer oder mehreren
der im Stride-Datensatz enthaltenen Bitmaps erzeugt wird, erzeugt
wird.
-
Das
hierin beschriebene Verfahren und die hierin beschriebene Vorrichtung
schaffen Techniken zum Komprimieren der den Stride-Datensätzen zugeordneten
Daten. Es werden außerdem
Techniken zum Speichern der Daten in einer effizienten Weise beschrieben,
so dass die Weiterleitungsentscheidungen unter Verwendung einer
minimalen Anzahl von Speicherzugriffen bestimmt werden können. Die
hierin beschriebenen Komprimierungstechniken ermöglichen, dass die großen Strides
zugeordneten Daten in einer effizienten Weise gespeichert werden,
so dass der Speicher, der erforderlich ist, um die Weiterleitungs- oder Verzweigungsentscheidungen
für jeden Stride
zu speichern, im Vergleich zu den Lösungen des Standes der Technik
im hohen Maße
verringert ist. Als solches kann die schnelle Bestimmung der Weiterleitungsentscheidungen
in einem System ausgeführt
werden, das den Speicher effizient verwendet, so dass große Strides
mit einer praktischen Menge des Speichers in einem System untergebracht werden können, das
die Hochgeschwindigkeitslenkung unterstützen kann.
-
Die
Erfindung kann unter Bezugnahme auf die 5-18 besser
verstanden werden. 5 zeigt die Liste oder Tabelle
der Stride-Ergebnisse 62, wobei sie die entsprechenden
Zeiger für
jeden der Knoten in der erweiterten Trie-Struktur nach 4 darstellt.
Im Kopf der Liste entspricht der Blattzeiger für 000XXX dem dunkel getönten Kreis
am weitesten links in der Schnittebene der Trie-Struktur nach 4.
Der unterste Eintrag in der Liste der Stride-Ergebnisse 62,
ein Blattzeiger für
11111X, entspricht dem dunkel getönten Kreis am weitesten rechts
auf der Schnittebene der Trie-Struktur nach 4.
-
Wie
aus der Liste der Stride-Ergebnisse 62 in 5 ersichtlich
ist, gibt es eine beträchtliche
Menge von Wiederholungen für
bestimmte Einträge.
Die ersten zwei Einträge
der Tabelle der Stride-Ergebnisse 62 sind z. B. die gleichen.
Dies ist so, weil diese Einträge
einem Paar der ausgebreiteten Knoten entsprechen, die erzeugt und
mit dem Blattzeiger gefüllt worden
sind, der dem Elternknoten entspricht. Ähnliche Mengen sich wiederholender
Zeiger können
innerhalb der Stride-Ergebnisse 62 beobachtet werden.
-
Durch
das Erkennen, dass die Komprimierung der Stride-Ergebnisse 62 durch eine Form
der Lauflängencodierung
erreicht werden kann, kann die Menge des Speichers, die erforderlich
ist, um die Ergebnisse für
diesen 5-Bit-Stride
zu speichern, im hohen Maße
verringert werden. 6 veranschaulicht eine komprimierte
Trie-Struktur 50, in der aufeinanderfolgende wiederholte
Ergebnisse in ein einziges Ergebnis komprimiert sind. Eine Bitmap 54 wird
verwendet, um anzugeben, ob ein Ergebnis für einen speziellen Knoten gespeichert
ist. Das erste Bit in der Bitmap 54 ist z. B. eine Eins,
die folglich angibt, dass die Ergebnisse in der komprimierten Menge
der Ergebnisse für
den ersten Knoten 52 auf der Schnittebene enthalten sind.
-
Wie
in der Tabelle der Stride-Ergebnisse 62 gesehen worden
ist, sind die Ergebnisse für
den zweiten Knoten 51 die gleichen wie das Ergebnis für den ersten
Knoten 52. Als solche speichert die Bitmap eine 0 an der
Bitstelle, die dem zweiten Knoten 51 entspricht. Ein 0-Bit-Eintrag
in der Bitmap 54 entspricht einem Knoten, für den das
Ergebnis komprimiert worden ist und der zugeordnete Zeiger als solcher
nicht unmittelbar verfügbar
ist. Um diesen komprimierten Zeiger wiederzugewinnen, muss ein Suchalgorithmus
nach dem ersten nicht komprimierten Eintrag (der durch ein 1-Bit
dargestellt ist) nach links vom komprimierten Eintrag in der Bitmap 54 suchen.
Der bei diesem Eintrag zurückgeschickte
Zeiger ist zu jenem völlig
gleich, der für
den komprimierten Eintrag in einem unkomprimierten Format gespeichert
worden wäre.
Das nächste
gesetzte Bit entspricht einem Knoten, für den gültige Ergebnisse in der in 5 veranschaulichten
Menge der komprimierten Stride-Ergebnisse 66 gespeichert
sind. Dieses Ergebnis ist außerdem
auf die nachfolgenden Knoten anwendbar, für die eine 0 in der Bitmap 54 gespeichert
ist. Wie veranschaulicht ist, verringern die komprimierten Stride-Ergebnisse 66 die
Anzahl der Zeiger im hohen Maße,
die gespeichert werden müssen,
um die Ergebnisse für
jeden der Knoten auf der Schnittebene in der erweiterten Trie-Struktur
darzustellen. Die Bitmap 54 wird im Zusammenhang mit der
Menge der komprimierten Stride-Ergebnisse 66 verwendet,
um den geeigneten Zeiger für
jeden der Knoten auf der Schnittebene zu bestimmen.
-
Viele
moderne Prozessoren enthalten einen Einzyklusbefehl, der ein Register
nach dem gesetzten niedrigst- oder höchstwertigen Bit abtastet.
Wenn derartige Operationen mit der Maskierung von Abschnitten der
Bitmap 54 kombiniert werden, schaffen sie ein einfaches
Mittel zum Bestimmen des nächsthöheren gesetzten
Bits in einer speziellen Bitmap in Bezug auf eine durch eine Adresse
ausgewählte
Bitposition.
-
Wie
oben dargelegt worden ist, kann die Bitmap 54, um den geeigneten
Zeiger oder das geeignete Ergebnis für einen Knoten innerhalb des Schnittabschnitts
eines Strides wiederzugewinnen, im Zusammenhang mit den komprimierten
Stride-Ergebnissen 66 verwendet werden. Falls die komprimierten
Stride-Ergebnisse 66 in einer zusammenhängenden Weise im Speicher einzeln
gespeichert sind, kann ein geeigneter Zeiger bestimmt werden, indem
ein Offset innerhalb der Menge der zusammenhängenden komprimierten Ergebnisse
anhand der Anzahl der gesetzten Bits in der Bitmap 54 von der
gewünschten
Bitstelle nach links berechnet wird. Obwohl dies ausgeführt werden
kann, indem die Bitmap 54 sequentiell abgetastet wird und
die Anzahl der 1en gezählt
wird, sind effizientere Mittel zum Berechnen der Anzahl der 1en
in einer speziellen Menge von Bits allgemein verfügbar. In
vielen Prozessoren kann die Operation der Populationszählung (Popzähl) verfügbar sein,
die die Anzahl der 1en in einer Menge von Bits berechnet. Indem
der untere Abschnitt der Bitmap 54 unter der ausgewählten Bitstelle
maskiert wird und eine Populationszählung der verbleibenden Menge
der Bits ausgeführt
wird, kann folglich ein Offset für
die Tabelle der komprimierten Stride-Ergebnisse 66 bestimmt
werden. In Prozessoren, die eine spezifische Populationszählungs-Operation nicht unterstützen, kann
eine einfache lineare Menge von Befehlen verwendet werden, um die
Populationszählung
für eine
Menge von Bits zu berechnen. Eine derartige Menge von Befehlen ist
in der GNU-C-Bibliothek
ausführlich
beschrieben.
-
Obwohl
die Kombination aus der Bitmap 54 und einer Menge der komprimierten
Stride-Ergebnisse 66, die in 6 veranschaulicht
ist, die Menge des Speichers verringert, die erforderlich ist, um
die Ergebnisse für
einen speziellen Trie-Schnitt oder Stride zu speichern, sind immer
noch zwei Speicherzugriffe erforderlich, um ein spezifisches Ergebnis
für einen
Knoten zu bestimmen, ein Speicherzugriff, um die Bitmap 54 wiederzugewinnen,
und ein weiterer, um den geeigneten Zeiger aus der Liste der komprimierten
Stride-Ergebnisse 66 wiederzugewinnen. 7 veranschaulicht
eine Verfeinerung der Datenstruktur nach 6, in der
eine weitere Bitmap zum komprimierten Datensatz hinzugefügt ist,
um anzugeben, welche der Zeiger Blattzeiger sind. Durch das Speichern
der Blattzeiger in einer separaten Blattzeigertabelle und das Berechnen
eines Index für
diese Tabelle, wenn ein Blatt bestimmt wird, kann die Gesamtzahl
der erforderlichen Speicherzugriffe verringert werden.
-
7 veranschaulicht
die komprimierten Stride-Ergebnisse 66, die in einen Stride-Block 70 weiter
komprimiert sind, der eine Zweig-Bitmap 72, eine Blatt-Bitmap 74,
einen Blattbasiszeiger 75 und eine Menge von Zweigen 77 (Unterbäumen) enthält. "Block" ist ein Begriff,
der verwendet werden kann, um einen Abschnitt der Trie-Struktur zu beschreiben, der
die Informationen für
die Verarbeitung eines Strides enthält. Ein gesetztes Bit in der
Zweig-Bitmap 72 gibt an, dass der der Bitstelle in der
Zweig-Bitmap 72 entsprechende Knoten ein Ergebnis besitzt,
das einem Eintrag in der Liste der Zweigzeiger entspricht. Ein gesetztes
Bit in der Blatt-Bitmap 74 gibt an, dass der Knoten, dem
die Bitstelle in der Blatt-Bitmap 74 entspricht, ein Ergebnis
besitzt, das ein in der Blattzeigertabelle 76 gespeicherter
Blattzeiger ist. Falls auf einen Blattzeiger Bezug genommen werden muss,
kann eine Populationszählung
verwendet werden, um einen Index in der Blattzeigertabelle 76 zu bestimmen.
Dieser Index kann mit dem Blattbasiszeiger 75 kombiniert
werden, der auf den ersten Eintrag der Blattzeigertabelle 76 zeigt,
um auf den geeigneten Eintrag innerhalb der Blattzeigertabelle 76 zuzugreifen.
-
Um
die Liste der Unter-Trie-Zeiger aus dem Stride-Block 70 zu
beseitigen, werden die Unter-Tries in einen zusammenhängenden
Speicher gesetzt, wobei die einzelnen Unter-Trie-Zeiger durch eine Bitmap
und einen Basiszeiger auf die Stelle im zusammenhängenden
Speicher ersetzt werden. Dies ist in 8 veranschaulicht.
Der Stride-Datensatz 80 nach 8 ist
auf die Zweig-Bitmap 72, die Blatt-Bitmap 74,
den Blattbasiszeiger 75 und einen Zweigbasiszeiger 86 verringert
worden. Der Zweigbasiszeiger 76 zeigt auf einen Basiseintrag
einer Zweigtabelle 89 (die außerdem als ein nächster Unter-Trie-Block bezeichnet
werden kann), der die Zweige (Unter-Tries) für den speziellen Stride speichert.
Wie es der Fall bei der Blattzeigertabelle 76 gewesen ist,
kann auf die Zweigtabelle 89 durch eine Kombination aus
dem Zweigbasiszeiger 76 und einem unter Verwendung der
Zweig-Bitmap 72 erzeugten
Offset zugegriffen werden. Folglich kann durch das Maskieren eines
Abschnitts der Zweig-Bitmap 72 und das Ausführen einer
Populationszählung
im verbleibenden Abschnitt ein geeigneter Offset für die Zweigtabelle 89 bestimmt
werden.
-
Der
Stride-Block 80 im komprimierten Format, der in 8 gezeigt
ist, ist kompakt genug, um in eine Cache-Zeile einer Cache-Struktur
zu passen, die durch einen Prozessor für die Verarbeitung des Strides
verwendet wird. Wie im Stand der Technik bekannt ist, kann eine
ganze Cache-Zeile (Gruppe von Wörtern)
in etwa der gleichen Zeit wie der, die erforderlich ist, um ein
einziges Wort zu lesen, aus dem Cache-Speicher gelesen werden. Dies
erlaubt, dass der Stride in einer effizienten Weise verarbeitet
wird, so dass die Weiterleitungsentscheidung für eine Adresse unter Verwendung
einer minimalen Anzahl von Speicherzugriffen bestimmt werden kann.
Weil die Komprimierung ausgeführt
wird, wird außerdem die
Menge des Speichers, die erforderlich ist, um die Daten zu speichern,
die erforderlich sind, um jeden Stride zu verarbeiten, im Vergleich
zu den Lösungen des
Standes der Technik im hohen Maße
verringert.
-
Um
die Speicherung der Ergebnisse für
einen speziellen Stride weiter zu optimieren, kann zwischen nachfolgenden
Blöcken,
die verarbeitet werden müssen,
um die endgültige
Weiterleitungsentscheidung zu bestimmen, eine Differenzierung ausgeführt werden.
Einige Strides der Gesamt-Trie-Struktur können eine kleine Anzahl von Zeigern
enthalten, die in einer kleinen Menge des Speichers gespeichert
sein kann. Die nicht dicht gepackten Abschnitte des Tries können in
ein spezielles nicht dicht gepacktes Komprimierungsformat komprimiert
werden, das hinsichtlich der Verarbeitung effizienter ist, da es
statt der Zeiger für
eine Blatttabelle die tatsächlichen
Ergebnisse für
die Blätter
enthalten kann. Um die Differenzierung zwischen nicht dicht gepackten
und dicht gepackten Blöcken
auszunutzen, kann der Stride-Block, der auf einen nachfolgenden
nicht dicht gepackten oder dicht gepackten Block zeigt, eine Codierung
enthalten, so dass der für
die nachfolgenden Blöcke
verwendete Typ der Komprimierung bekannt ist. 9 veranschaulicht
eine spezielle Codierungstechnik, die verwendet werden kann, um
diese Differenzierung auszuführen. 9 veranschaulicht
einen Stride, der komprimierte Knoten enthält. Jeder Knoten auf der Schnittebene
kann einen von vier Zuständen
besitzen. Diese vier Zustände
sind durch die Kombination einer Ausdehnungs-Bitmap 95 und
einer Typ-Bitmap 96 codiert, die im Stride-Datensatz 99 enthalten
sind. Für
jeden Knoten auf der Schnittebene gibt es ein Bit in der Ausdehnungs-Bitmap 95 und
ein Bit in der Typ-Bitmap 96. Die Kombination aus diesen
zwei Bits für
jeden Knoten gibt den speziellen Zustand dieses Knotens an.
-
Die
Ausdehnungs- und Typ-Bitmaps erlauben, dass die vier Zustände für jeden
Knoten codiert werden, was unter Verwendung der bis jetzt beschriebenen
Blatt- und Zweig-Bitmaps
nicht möglich gewesen
ist. Wie es für
einen Durchschnittsfachmann auf dem Gebiet offensichtlich ist, ist
die Unterscheidung zwischen der Verwendung der Zweig- und Blatt-Bitmaps
im Gegensatz zu den Typ- und Ausdehnungs-Bitmaps nur davon abhängig, ob
in dem System eine verschiedene Codierung der Blöcke (nicht dicht gepackt gegen
dicht gepackt) verwendet wird. Für
Ausführungsformen,
die nur eine Blockcodierung verwenden, stellen die Zweig- und Blatt-Bitmaps
ausreichend codierte Zustände
bereit. Für
Ausführungsformen,
die nicht dicht gepackte und dicht gepackte Blöcke unterstützen, stellen die Ausdehnungs-
und Typ-Bitmaps die notwendige Anzahl von Zuständen bereit, um den Typ der
Codierung für die
nachfolgenden Blöcke
anzugeben.
-
Es
ist gezeigt, dass der erste Knoten einen Zustand besitzt, der einer
Blattangabe 91 entspricht. Knoten, die einen Zustand besitzen,
der einer Blattangabe entspricht, sind als dunkel getönte Kreise gezeigt.
Eine Blattangabe gibt an, dass in der Blatttabelle für diesen
speziellen Knoten ein gültiger
Eintrag enthalten ist. Eine Kombination aus der Ausdehnungs-Bitmap 95 und
der Typ-Bitmap 96 erzeugt
die früher
beschriebene Blatt-Bitmap 74, die dann manipuliert werden
kann, um einen Offset für
die Blatttabelle zu bestimmen. Dieser Offset kann dann mit dem Blattbasiszeiger 75 kombiniert
werden, um auf die Blatttabelle zuzugreifen und die Weiterleitungsentscheidung
für den
Knoten aus der Blatttabelle zu holen. Die Blattangaben sind mit
einer 0 in der Ausdehnungs-Bitmap 95 und einer 1 in der
Typ-Bitmap 96 codiert. Wie für einen Durchschnittsfachmann
auf dem Gebiet offensichtlich ist, sind die in den hierin beschriebenen
Beispielen verwendeten speziellen Bitcodierungen beliebig, wobei,
solange wie die speziellen Beziehungen zwischen den verschiedenen Bitmaps
bewahrt werden, unterschiedliche Bitwerte für verschiedene Codierungen
verwendet werden können.
-
Es
ist gezeigt, dass die zweite Knotenstelle einer leeren Angabe 94 entspricht,
die durch einen nicht dunkel getönten
Kreis veranschaulicht ist. Leere Angaben sind mit einer 0 in der
Ausdehnungs-Bitmap 95 und einer 0 in der Typ-Bitmap 96 codiert.
Eine leere Angabe bedeutet, dass eine Suche nach links ausgeführt werden
muss, um das geeignete Ergebnis für diesen speziellen Knoten
zu bestimmen, da er komprimiert worden ist.
-
Es
ist gezeigt, dass die dritte Knotenstelle auf der Schnittebene einer
nicht dicht gepackten Angabe 92 entspricht. Nicht dicht
gepackten Angaben sind durch eine 1 in der Ausdehnungs-Bitmap 95 und eine
0 in der Typ-Bitmap 96 angegeben.
Eine nicht dicht gepackte Angabe bedeutet, dass die Suche über die
in der Trie-Struktur 90 vorhandene Schnittebene ausgedehnt
wird. Sie gibt ferner an, dass der nachfolgende Stride-Block, der
anhand des für
diesen Knoten erzeugten Index geholt wird, ein nicht dicht gepackter
Stride-Block ist, der in einer Ausführungsform einen Stride von
8 Adressenbits verarbeiten kann. Die Kenntnis, dass dieser zu holende
nachfolgende Block ein nicht dicht gepackter Block ist, ermöglicht es
dem Prozessor, den Wirkungsgrad zu verbessern, mit dem der nachfolgende
Stride-Block verarbeitet wird. Dies ist so, weil zusätzliche
Informationen in dem nicht dicht gepackten Block gespeichert sein
können,
da er nicht so viele Endergebnisse wie ein dicht gepackter Block
enthält.
Ein beispielhafter nicht dicht gepackter Stride-Block 901 ist
in 10 veranschaulicht.
-
Der
nicht dicht gepackte Block 901 enthält einen Zweigbasiszeiger,
der auf den nächsten
Block in der Trie-Struktur
zeigt. Der in dem nicht dicht gepackten Block enthaltene Blattbasiszeiger
speichert eine Basisadresse für
die Blatttabelle. Alle Blätter
für den nicht
dicht gepackten Block sind von dieser Basisadresse zusammenhängend gespeichert,
wobei auf sie zugegriffen werden kann, indem unter Verwendung der
Typ- und Ausdehnungs-Bitmaps ein geeigneter Offset erzeugt wird.
Es ist gezeigt, dass die zweite Zeile des nicht dicht gepackten
Blocks acht Werte enthält.
Jeder dieser Werte kann direkt mit dem Abschnitt der Adresse verglichen
werden, der verwendet wird, um diesen Stride aufzulösen. Wenn eine
exakte Übereinstimmung
gefunden wird, dann gibt es entweder in der Zweigtabelle oder in
der Blatttabelle einen dieser Adresse zugeordneten Zeiger. Wenn
keine Übereinstimmung
bestimmt wird, wird eine Suche nach links so ausgeführt, dass
der nächsthöchste Wert
in der Anordnung der Werte ausgewählt wird, was zur Abtastbitoperation
an einer Bitmap analog ist. Weil in dem nicht dicht gepackten Block
nur acht Werte gespeichert sind, sind die Typ- und Ausdehnungs-Bitmaps
jede nur 8-Bit-Bitmaps. Die Verwendung der Typ- und Ausdehnungs-Bitmaps ist zu jener
eines dicht gepackten Blocks völlig
gleich, wobei sie verwendet werden können, um die Offsets entweder
für die
Zweigtabelle oder für
die Blatttabelle zu bestimmen, wobei die Bitmaps außerdem verwendet
werden können,
um zwischen nachfolgenden nicht dicht gepackten und dicht gepackten
Blöcken zu
unterscheiden.
-
In 9 ist
gezeigt, dass die sechste Bitstelle in der Schnittebene des Strides
einer dicht gepackten Angabe 93 entspricht. Die dicht gepackte
Angabe 93 ist in der Ausdehnungs-Bitmap 95 durch
eine 1 und in der Typ-Bitmap 96 durch eine 1 angegeben. Eine
dicht gepackte Angabe 93 gibt an, dass ein Offset erzeugt
und mit dem Zweigbasiszeiger 76 kombiniert werden sollte,
um auf einen nachfolgenden Stride-Block Bezug zu nehmen, der ein
dicht gepackter Block ist. Der Stride-Block 99 nach 9 ist
ein dicht gepackter Stride-Block, weil er eine volle Ausdehnungs-Bitmap
und eine volle Typ-Bitmap für
alle Knoten auf der Schnittebene für den Stride enthält. Dies steht
im Gegensatz zu einem nicht dicht gepackten Block, der nur eine
begrenzte Menge von Werten, die einer begrenzten Menge von Knoten
entspricht, und die geeigneten Typ- und Ausdehnungs-Bitmaps für diese
speziellen Werte enthält.
-
Wie
früher
dargelegt worden ist, ist ein Block ein Abschnitt der Trie-Struktur,
der verwendet wird, um einen Stride zu verarbeiten. Ein Block kann
in eine Anzahl von Datensätzen
unterteilt sein, wobei ein spezieller Datensatz durch einen Abschnitt
der Adressenbits ausgewählt
wird, die verwendet werden, um den Stride zu durchlaufen. Ein Block
für einen
8-Bit-Stride kann z. B. in acht Datensätze unterteilt sein, wobei
drei der acht Adressenbits, die verwendet werden, um diesen Stride
zu verarbeiten, verwendet werden, um einen spezifischen der Datensätze in dem
Block, der dem Stride entspricht, auszuwählen. Die verbleibenden fünf Bits
könnten
dann verwendet werden, um den ausgewählten Datensatz zu verarbeiten,
wobei die Struktur des Datensatzes zu den bis jetzt für einen
5-Bit-Block beschriebenen Strukturen ähnlich sein kann. Mit anderen
Worten, jeder Datensatz könnte
als ein Block strukturiert sein, weil er Bitmaps und Basiszeiger
enthalten würde. 11 veranschaulicht einen
dicht gepackten Datensatz 911. Die Differenzierung zwischen
den Blöcken
und den Strides wird im Folgenden unter Bezugnahme auf 18 weiter
erklärt.
-
Der
dicht gepackte Datensatz 911 enthält eine Ausdehnungs-Bitmap, eine Typ-Bitmap,
eine Anzahl von Bits, die für
die zukünftige
Verwendung reserviert sind (RFU), einen Zweigtabellen-Basiszeiger
und einen Blatttabellen-Basiszeiger
und kann eine Angabe enthalten, wie viele der Blöcke in dem Unter-Trie darunter
nicht dicht gepackte Blöcke
sind. Die Angabe, wieviel Blöcke
in dem Unter-Trie darunter nicht dicht gepackte Blöcke sind,
kann verwendet werden, um die Zugriffe auf den Unter-Trie darunter zu
optimieren.
-
Die
dicht gepackten Blöcke
werden verwendet, wo die Dichte der Zeiger innerhalb eines Stride die
Verwendung der speichereffizienteren nicht dicht gepackten Blöcke verhindert.
Ein Beispiel eines dicht gepackten Blocks 921 für einen
8-Bit-Stride ist in 12 gezeigt.
-
Es
wird angegeben, dass es für
die Software schwierig sein kann, große Bitmaps, die in dem obigen
dicht gepackten Block enthalten sind, zu manipulieren, wobei die
Menge der Daten, die wiederzugewinnen ist, um einen derartigen Block
zu verarbeiten, groß ist.
Außerdem
sind die Felder innerhalb des Blocks nicht auf die normalen Grenzen
der Cache-Zeilen ausgerichtet, wobei die Menge des zusammenhängenden
Speichers, die wahrscheinlich für
die Blatttabelle und die Zweigtabelle erforderlich sein würde, der
dynamischen Zuweisung von Speicher bei der Implementierung Einschränkungen
auferlegen würde.
Die oben veranschaulichte Darstellung stellt jedoch die minimale
Speicherverwendung für
einen dicht gepackten Block dar. In Ausführungsformen, die unfangreiche
oder separate Speicherstrukturen enthalten, kann eine derartige
dicht gepackte Blockstruktur praktisch sein.
-
In
anderen Ausführungsformen,
in denen die dicht gepackten Blöcke,
wie z. B. die oben veranschaulichten, weniger praktisch sind, können die dicht
gepackten Blöcke
in Datensätze
aufgebrochen werden, um sowohl die Hardware-Implementierung des Systems als auch
die effiziente Verarbeitung durch die Software zu unterstützen. Dies
ist oben kurz erörtert
worden. Ein 32-Bit-Mikroprozessor würde z. B. am wahrscheinlichsten
zu bevorzugen sein, um 32-Bit-Bitmaps
zu manipulieren. Folglich könnten für einen
8-Bit-Stride acht
Stride-Datensätze
verwendet werden, die unter Verwendung der oberen drei Bits des
Strides indexiert sind. Jeder der Datensätze würde dann verwendet werden,
um die unteren fünf Bits
des Strides zu verarbeiten, wobei die Bitmaps in einem dicht gepackten
5-Bit-Stride-Datensatz 32-Bit-Bitmaps
sein würden.
-
Um
das Holen der Datensätze
für einen nachfolgenden
Stride zu unterstützen,
kann jeder Datensatz eine Angabe der Anzahl der nicht dicht gepackten
Datensätze
enthalten, die im folgenden Stride-Block enthalten sind. Falls die
nicht dicht gepackten Datensätze
vor den dicht gepackten Datensätzen zusammenhängend in
der Zweigtabelle gespeichert sind, wird die Indexierung der Zweigtabelle
vereinfacht, indem eine Zählung
der Anzahl der nicht dicht gepackten Datensätze ausgeführt wird.
-
13 veranschaulicht
einen Ablaufplan eines Verfahrens zum Komprimieren eines dicht gepackten
Stride-Blocks. Im Schritt 102 wird der Stride-Block in
mehrere Stride-Abschnitte
getrennt. Dies ist zum Trennen des Blocks in eine Anzahl von Datensätzen analog.
Für jeden
Stride-Abschnitt
oder Datensatz werden die Schritte 104-112 ausgeführt.
-
Im
Schritt 104 werden die Stride-Ergebnisse für den Abschnitt
komprimiert, um eine komprimierte Bitmap und eine komprimierte Liste
der Stride-Ergebnisse zu erzeugen. Dies ist der in 6 veranschaulichte
Komprimierungsschritt. Im Schritt 106 werden die komprimierte
Bitmap und die komprimierte Liste der Stride-Ergebnisse weiter komprimiert,
um eine Blatt-Bitmap, eine Zweig-Bitmap,
einen Blatttabellenabschnitt und einen Zweigtabellenabschnitt zu
erzeugen. Dies ist zu dem in 7 gezeigten
Schritt ähnlich,
wo der Blatttabellenabschnitt der Menge der Blattzeiger entspricht,
die in der Blattzeigertabelle für den
Stride-Abschnitt enthalten ist, und der Zweigtabellenabschnitt der
Menge der Zweigzeiger für
den Stride-Abschnitt entspricht. Im Schritt 108 wird der Blatttabellenabschnitt
im Abschnitt des Speichers oder der Tabelle gespeichert, der den
Blattzeigern für den
Trie zugeordnet ist. Vorzugsweise werden diese Blattzeiger in einer
zusammenhängenden
Weise in der Blatttabelle beginnend mit einem Blattbasiszeiger für den Stride-Abschnitt so gespeichert,
dass auf sie durch die Kombination aus einem Basiszeiger und den
Offsets, die kombiniert werden, um die Indizes für die Tabelle zu erzeugen,
zugegriffen werden kann.
-
Im
Schritt 110 wird der Zweigtabellenabschnitt im Speicher
beginnend an einer Stelle, die dem Zweigbasiszeiger entspricht,
gespeichert. Vorzugsweise wird er in einer zusammenhängenden Weise
im Speicher gespeichert, so dass unter Verwendung eines Basiszeigers
und der Offsets der Direktzugriff auf die Einträge in der Zweigtabelle ausgeführt werden
kann.
-
Im
Schritt 110 wird ein Stride-Datensatz im Speicher für den Stride-Abschnitt
gespeichert, wobei der Stride-Datensatz
die Blatt-Bitmap, die Zweig-Bitmap, den Blatttabellen-Basiszeiger,
bei dem der Blatttabellenabschnitt gespeichert worden ist, und den
Zweigtabellen-Basiszeiger,
bei dem der Zweigtabellenabschnitt für den Stride-Abschnitt gespeichert
worden ist, enthält.
Das Speichern des Stride-Datensatzes im Schritt 112 kann
das Codieren der Blatt-Bitmap und der Zweig-Bitmap in eine Ausdehnungs-Bitmap
und eine Typ-Bitmap enthalten, wie oben in Bezug auf 9 beschrieben
worden ist. Die Ausdehnungs-Bitmap und die Typ-Bitmap ermöglichen
dem Stride-Datensatz, nicht dicht gepackte und dicht gepackte Formatunterscheidungen
für nachfolgende
Stride-Blöcke,
auf die über
die in der Zweigtabelle enthaltenen Zweigzeiger zugegriffen wird,
zu codieren.
-
14 veranschaulicht
einen Blockschaltplan einer Paketweiterleitungsschaltung 250,
die im Zusammenhang mit den bis jetzt erörterten Trie-Komprimierungstechniken
verwendet werden kann, um die Paketlenkung in einem Kommunikationsnetz
auszuführen.
Die Paketweiterleitungsschaltung 250 enthält einen
Speicher 220, einen Bestimmungsblock 200, einen
Paketspeicher 230 und eine Ausgangsschaltungsanordnung 240.
Die durch die Paketweiterleitungsschaltung 250 empfangenen
Pakete 202 werden im Paketspeicher 230 gespeichert, während eine
Weiterleitungsentscheidung für
jedes Paket bestimmt wird. Die Adresse 203 für jedes
Paket wird dem Bestimmungsblock 200 bereitgestellt, der
die Weiterleitungsentscheidung 242 für jedes Paket bestimmt. Der
Bestimmungsblock 200 kann als eine Zustandsmaschine, eine
diskrete Schaltungsanordnung oder als ein Paketweiterleitungsprozessor, wie
z. B. der, der in 15 veranschaulicht ist, implementiert
sein. Der Bestimmungsblock 200 ist funktional an einen
Speicher 220 gekoppelt, der eine Weiterleitungstabelle 222 speichert.
Vorzugsweise ist die Weiterleitungstabelle 222 in einer
Weise strukturiert, so dass die Weiterleitungsentscheidungen für die Pakete
durch die Verwendung einer komprimierten Trie-Struktur bestimmt
werden. Die komprimierte Trie-Struktur kann eine Anzahl von Strides
enthalten, wobei der jedem Stride entsprechende Block in eine Anzahl
von Datensätzen
aufgebrochen sein kann.
-
Wenn
der Bestimmungsblock 200 eine Paketadresse empfängt, verarbeitet
er die Adresse, um eine Weiterleitungsentscheidung 242 in
einer Weise zu bestimmen, die zu jener ähnlich ist, die im Ablaufplan
nach 16 veranschaulicht ist, der im Folgenden weiter
ausführlich
beschrieben ist. Um die Bestimmung der Weiterleitungsentscheidung 242 zu
unterstützen,
kann ein Cache-Speicher 210 in der Paketweiterleitungsschaltung 250 enthalten
sein. Der Cache-Speicher 210, der funktional an den Speicher 220 und
den Bestimmungsblock 200 gekoppelt ist, kann verwendet
werden, um bestimmte Abschnitte der Weiterleitungstabelle 222 im
Cache-Speicher zu speichern, so dass die Bestimmung der Weiterleitungsentscheidung 242 in
einer effizienteren Weise ausgeführt
werden kann, die weniger Zugriffe auf den Speicher 220 erfordert.
-
Sobald
eine Weiterleitungsentscheidung 242 durch den Bestimmungsblock 200 bestimmt
worden ist, wird sie der Ausgangsschaltungsanordnung 240 bereitgestellt.
Für jedes
Paket empfängt
die Ausgangsschaltungsanordnung eine Weiterleitungsentscheidung 242 und
leitet das Paket anhand der Weiterleitungsentscheidung zu wenigstens
einem der mehreren Ausgänge 246 weiter.
-
Vorzugsweise
ist die Paketweiterleitungsschaltung 250 in einem Router
für die
Verwendung in einem Datenkommunikationsnetz enthalten. Ein derartiger
Router kann in einem Datenkommunikationsnetz verwendet werden, das
IP-Verkehr unterstützt. Der
Speicher 220 kann mehrere Weiterleitungstabellen speichern,
wobei eine spezielle Weiterleitungstabelle für die Verwendung beim Bestimmen
der Weiterleitungsentscheidung für
ein spezielles Paket entweder anhand eines in dem Paket enthaltenen
Feldes oder anhand der Kennung eines Eingangs-Ports, über den
das Paket empfangen worden ist, ausgewählt wird.
-
15 veranschaulicht
einen Paketweiterleitungsprozessor 300, der ein Verarbeitungsmodul 302 und
einen Speicher 304 enthält.
Der Paketweiterleitungsprozessor führt vorzugsweise das in 16 veranschaulichte
Verfahren durch die Verwendung von Software aus, die als eine Menge
von Operationsbefehlen im Speicher 304 gespeichert ist. Das
Verarbeitungsmodul 302 kann eine einzige Verarbeitungs-Entität oder mehrere
Verarbeitungs-Entitäten
enthalten. Eine derartige Verarbeitungs-Entität kann ein Mikroprozessor,
ein Mikrocontroller, ein digitaler Signalprozessor oder irgendeine
Vorrichtung, die Informationen anhand von Operations- oder Programmbefehlen
verarbeitet, sein.
-
Der
Speicher 304 kann eine einzige Speichervorrichtung oder
mehrere Speichervorrichtungen sein. Eine derartige Speichervorrichtung
kann eine Festwert-Speichervorrichtung,
eine Schreib-Lese-Speichervorrichtung,
eine Diskette, ein Festplattenspeicher oder irgendeine Vorrichtung,
die digitale Informationen speichert, sein. Es wird angegeben, dass
der Speicher 304 im Speicher 220 enthalten sein
kann, der in der Paketweiterleitungsschaltung enthalten ist, oder
eine separate Speicherstruktur sein kann. Der Speicher 304 speichert
die Programm- oder Operationsbefehle, die, wenn sie durch das Verarbeitungsmodul 302 ausgeführt werden, dem
Verarbeitungsmodul 302 erlauben, die Paketweiterleitungsfunktionen
auszuführen,
wie z. B. jene, die im Ablaufplan nach
-
16 veranschaulicht
sind. Es wird angegeben, dass der Paketweiterleitungsprozessor 300 einige
der Funktionen nach 16 durch im Speicher 304 gespeicherte
Software implementieren kann, wohingegen andere Abschnitte unter
Verwendung von Hardware oder einer Schaltungsanordnung implementiert
sein können,
die im Paketweiterleitungsprozessor 300 enthalten ist.
Folglich kann in einigen Ausführungsformen
eine Mischung aus Hardware und Software verwendet werden, um das
in 16 veranschaulichte Verfahren auszuführen.
-
16 veranschaulicht
einen Ablaufplan eines Verfahrens zur Paketlenkung in einem Kommunikationsnetz.
Das Verfahren beginnt im Schritt 402, in dem ein Paket
empfangen wird. Das Paket enthält eine
Adresse, die verwendet wird, um eine Weiterleitungsentscheidung
für das
Paket zu bestimmen. Die Weiterleitungsentscheidung wird anhand einer
komprimierten Trie-Struktur bestimmt, die in einer Weiterleitungstabelle
gespeichert sein kann. Die komprimierte Trie-Struktur besteht vorzugsweise
aus einer Anzahl von Strides, wobei die Blöcke, die einen Stride bilden,
in eine Anzahl von Datensätzen
unterteilt sein können,
wobei die Blöcke
und die Datensätze vorzugsweise
so strukturiert sind, wie oben angegeben worden ist.
-
Im
Schritt 404 wird ein erster Stride-Block unter Verwendung
eines ersten Abschnitts der Adresse geholt. Wie oben dargelegt worden
ist, kann ein Stride-Block in eine Anzahl von Datensätzen aufgebrochen
werden, um die Verarbeitung zu vereinfachen. In einer Ausführungsform
werden die höchstwertigen Bits
der Adresse verwendet, um einen in einem Stride-Block enthaltenen
Stride-Datensatz wiederzugewinnen, wobei die höchstwertigen Bits zwischen
einer Anzahl von Stride-Datensätzen,
die einen dicht gepackten Block innerhalb der Trie-Struktur bilden, indexieren.
Jeder Stride-Block enthält
eine erste Bitmap, eine zweite Bitmap, einen Blatttabellen-Basiszeiger
und einen Zweigtabellen-Basiszeiger. Sobald der Stride-Block im
Schritt 404 geholt worden ist, wird er unter Verwendung
der Schritte 406-416 verarbeitet.
-
Im
Schritt 406 wird bestimmt, ob die Weiterleitungsentscheidung
für die
Adresse anhand des Stride-Blocks, der geholt worden ist, vollständig bestimmt
werden kann. Dies wird anhand wenigstens einer der ersten und zweiten
Bitmaps bestimmt. Die erste Bitmap ist eine Ausdehnungs-Bitmap,
während die
zweite Bitmap eine Typ-Bitmap
ist, wobei die Ausdehnungs-Bitmap allein verwendet werden kann,
um zu bestimmen, ob die Weiterleitungsentscheidung unter Verwendung
dieses Stride-Datensatzes
vollständig
bestimmt ist.
-
Falls
die Weiterleitungsentscheidung unter Verwendung des Stride-Blocks
vollständig
bestimmt ist, geht das Verfahren zu 408 weiter, wo aus
wenigstens einer der ersten und zweiten Bitmaps und dem zweiten
Abschnitt der Adresse ein Blatttabellen-Offset erzeugt wird. Der
zweite Abschnitt der Adresse wird verwendet, um eine spezifische
Bitstelle in einer oder mehreren der Bitmaps auszuwählen, wobei
eine Maskierungsoperation, gefolgt von einer Populationszählung, verwendet
wird, um einen Offset für
die Blatttabelle zu bestimmen. Die Ausdehnungs-Bitmap und die Typ-Bitmap
müssen
kombiniert werden, um die Blatt-Bitmap
zu erzeugen. Dies kann durch die Ausführung einer bitweisen UND-Operation
der Typ-Bitmap und der bitweisen Inversen der Ausdehnungs-Bitmap
ausgeführt
werden.
-
Im
Schritt 410 wird der im Schritt 408 erzeugte Blatttabellen-Offset
mit dem Blatttabellen-Basiszeiger kombiniert, um einen Blatttabellen-Index
zu erzeugen. Dieser Blatttabellen-Index wird dann im Schritt 412 verwendet,
um auf die Blatttabelle zuzugreifen, um die Weiterleitungsentscheidung
für das Paket
wiederzugewinnen. Die Blatttabelle kann entweder die Weiterleitungsentscheidungen
direkt speichern, oder sie kann die Zeiger auf eine Liste der Weiterleitungsentscheidungen
speichern.
-
Falls
im Schritt 406 bestimmt wird, dass die Weiterleitungsentscheidung
in diesem Stride nicht vollständig
bestimmt ist, geht das Verfahren zum Schritt 414 weiter,
wo die Schritte beginnen, die notwendig sind, um einen nachfolgenden
Stride-Datensatz oder -Block zu holen. Im Schritt 414 wird
aus dem zweiten Abschnitt der Adresse und wenigstens einer der ersten
und zweiten Bitmaps ein Zweigtabellen-Offset erzeugt. Falls durch
das System, in dem das Verfahren nach 16 verwendet
wird, nicht dicht gepackte und dicht gepackte Blöcke unterstützt werden, kann das Erzeugen
des Zweigtabellen-Offsets das Erzeugen eines Zweigtabellen-Offsets
entweder für
einen nicht dicht gepackten Block oder für einen dicht gepackten Block
enthalten. Die Unterscheidung zwischen nicht dicht gepackt und dicht
gepackt und die Codierungen, die notwendig sind, um zwischen nicht
dicht gepackten und dicht gepackten Blöcken zu unterscheiden, sind
oben in Bezug auf 9 beschrieben worden. Folglich
sind Ausdehnungs- und Typ-Bitmaps erforderlich, um zwischen nicht
dicht gepackten und dicht gepackten Blöcken zu unterscheiden. Die
Erzeugung des Zweigtabellen-Offsets wird unter Verwendung von Maskierungs- und
Populationszählungs-Schritten
in einer ähnlichen
Weise wie jener ausgeführt,
die verwendet wird, um den Blatttabellen-Offset zu erzeugen.
-
Im
Schritt 416 wird der Zweigtabellen-Offset mit einem Zweigtabellen-Basiszeiger kombiniert, um einen Zweigtabellen-Index zu erzeugen. Der Zweigtabellen-Index wird
dann verwendet, um im Schritt 418 einen nachfolgenden Stride-Block
wiederzugewinnen. Der Schritt 418 kann das Wiedergewinnen
eines nachfolgenden Blocks, der einem Stride entspricht, und dann
das Indexieren zu einem speziellen Datensatz innerhalb des Strides
enthalten. Er kann außerdem
das einfache Holen eines nachfolgenden nicht dicht gepackten Blocks
in seiner Gesamtheit umfassen.
-
Ein
Verfahren, das für
die Verarbeitung dicht gepackter Blöcke verwendet werden kann,
ist in 17 veranschaulicht, die für erhöhte Klarheit
aufgenommen worden ist. 17 veranschaulicht
einen Ablaufplan eines Verfahrens zum Bearbeiten eines dicht gepackten
Blockes oder Datensatzes unter Verwendung eines Abschnitts der dem
Paket entsprechenden Adresse. Im Schritt 502 wird unter
Verwendung des Adressenabschnitts ein spezielles Bit in den für den dicht
gepackten Datensatz enthaltenen Bitmaps ausgewählt. Im Schritt 504 wird
bestimmt, ob das Bit, dem der Adressenabschnitt entspricht, in der
Ausdehnungs-Bitmap
gesetzt ist. Falls nicht, gibt dies an, dass während dieses Datensatzes ein
Blatt erreicht wird, wobei die Schritte 506-516 ausgeführt werden,
um die Weiterleitungsentscheidung für dieses Blatt wiederzugewinnen.
-
Im
Schritt 506 wird die Blatt-Bitmap unter Verwendung der
bitweisen UND-Verknüpfung
der Typ-Bitmap mit der bitweisen Inversen der Ausdehnungs-Bitmap
erzeugt. Im Schritt 508 wird bestimmt, ob das Bit, dem
der Adressenabschnitt entspricht, in der Blatt-Bitmap gesetzt ist.
Falls es das ist, geht das Verfahren zum Schritt 510 weiter,
während,
falls es das nicht ist, das Verfahren zum Schritt 509 weitergeht.
Im Schritt 509 wird eine Abtastung nach links in der Blatt-Bitmap
ausgeführt,
um das nächste
gesetzte Bit zu finden. Im Schritt 510 werden unerwünschte Bits
in der im Schritt 506 erzeugten Blatt-Bitmap maskiert.
Die unerwünschten
Bits sind jene Bits rechts vom im Schritt 506 bestimmten
gesetzten Bit.
-
Im
Schritt 512 wird an den verbleibenden nicht maskierten
Bits in der Blatt-Bitmap eine Populationszählung ausgeführt, um
einen Blatt-Offset zu bestimmen. Im Schritt 514 wird der
Blatt-Offset mit dem Blattbasiszeiger für den Datensatz kombiniert,
um einen Blattindex zu erzeugen. Dieser Blattindex wird dann im
Schritt 516 verwendet, um die Weiterleitungsentscheidung
für das
Paket wiederzugewinnen.
-
Falls
im Schritt 504 bestimmt wird, dass das Bit in der Ausdehnungs-Bitmap,
die dem Abschnitt der Adresse entspricht, gesetzt ist, gibt dies
an, dass ein nachfolgender Block geholt werden muss, um die Adresse
weiter zu verarbeiten. Als solches geht das Verfahren zum Schritt 518 weiter.
Im Schritt 518 wird bestimmt, ob das dem Adressenabschnitt
entsprechende Bit außerdem
in der Typ-Bitmap gesetzt ist, wobei die Typ-Bitmap angibt, ob der
zu holende nachfolgende Block nicht dicht gepackt oder dicht gepackt
ist. Falls bei 518 das Bit gesetzt ist, ist ein dicht gepackter
Block zu verarbeiten, wobei das Verfahren zum Schritt 520 weitergeht.
-
Im
Schritt 520 wird die Bitmap mit dicht gepackten Eintragen
durch die bitweise UND-Verknüpfung
der Typ- und Ausdehnungs-Bitmaps erzeugt. Die unerwünschten
Bits in der Bitmap mit dicht gepackten Einträgen werden im Schritt 523 maskiert, wobei
jene Bits rechts von jenem, das durch den Adressenabschnitt ausgewählt wird,
maskiert werden. Im Schritt 524 wird eine Populationszählung an den
verbleibenden nicht maskierten Bits ausgeführt, um einen dicht gepackten
Offset zu bestimmen.
-
Im
Schritt 526 wird der dicht gepackte Offset mit einem dicht
gepackten Basiszeiger kombiniert, um den dicht gepackten Index zu
erzeugen. Vorausgesetzt, dass alle nicht dicht gepackten Blöcke anhand
eines Zweigbasiszeigers zusammenhängend gespeichert sind und
alle dicht gepackten Blöcke
unmittelbar nach den nicht dicht gepackten Blöcken (ebenfalls zusammenhängend) gespeichert
sind, kann der dicht gepackte Basiszeiger bestimmt werden, indem
die Größe der Anzahl
der nicht dicht gepackten Blöcke,
die im nachfolgenden Block enthalten sind, zum Zweigbasiszeiger
hinzugefügt
wird. Folglich kann das Speichern der Anzahl der nicht dicht gepackten
Blöcke,
die in einem nachfolgenden Stride enthalten ist, wie früher beschrieben
worden ist, verwendet werden, um die Zeiger auf nachfolgende dicht
gepackte Stride-Blöcke
effizient zu erzeugen. Der im Schritt 526 erzeugte dicht
gepackte Index kann dann im Schritt 528 verwendet werden,
um den nachfolgenden dicht gepackten Stride-Block wiederzugewinnen.
Weil das Verarbeitungssystem bereits weiß, dass der nachfolgende Block
ein dicht gepackter Block ist, wird er in der Weise geholt und verarbeitet,
die für
dicht gepackte Blöcke
am effizientesten ist.
-
Falls
im Schritt 518 bestimmt wird, dass das dem Adressenabschnitt
entsprechende Bit in der Typ-Bitmap nicht gesetzt ist, ist der zu
holende nachfolgende Datenblock ein nicht dicht gepackter Block. Als
solche wird im Schritt 530 eine Bitmap mit nicht dicht
gepackten Einträgen
erzeugt. Dies wird durch die bitweise UND-Verknüpfung der Ausdehnungs-Bitmap
mit der bitweisen Inversen der Typ-Bitmap ausgeführt.
-
Im
Schritt 532 werden die unerwünschten Bits in der Bitmap
mit nicht dicht gepackten Einträgen maskiert.
Im Schritt 534 wird eine Populationszählung ausgeführt, um
einen nicht dicht gepackten Offset zu bestimmen. Der nicht dicht
gepackte Offset wird im Schritt 536 mit einem nicht dicht
gepackten Basiszeiger kombiniert, um einen nicht dicht gepackten
Index zu erzeugen. Es wird angegeben, dass, falls die nicht dicht
gepackten Datensätze
für den nachfolgenden
Stride alle vor den dicht gepackten Datensätzen zusammenhängend gespeichert
sind, der nicht dicht gepackte Basiszeiger einfach der Zweigbasiszeiger
für den
nachfolgenden Stride ist. Im Schritt 538 wird der nachfolgende
nicht dicht gepackte Stride-Datensatz unter Verwendung des im Schritt 536 erzeugten
nicht dicht gepackten Index wiedergewonnen.
-
Die
Methodologie für
die Verarbeitung eines nicht dicht gepackten Stride-Datensatzes
oder -Blocks ist zu jener für
die Verarbeitung eines dicht gepackten Datensatzes ähnlich.
Die Ausnahme ist, dass statt der Überprüfung der Ausdehnungs- und Typ-Bitmaps
an einer speziellen Bitstelle, die einem Abschnitt der Adresse entspricht,
zuerst ein Vergleich mit den im nicht dicht gepackten Datensatz enthaltenen
Werten ausgeführt
werden muss. Falls eine Übereinstimmung
bestimmt wird, wird die Bitstelle, die diesem Wert in den Ausdehnungs-
und Typ-Bitmaps entspricht, berücksichtigt,
um zu bestimmen, ob ein Blatt erreicht worden ist oder ob ein nachfolgender
nicht dicht gepackter oder dicht gepackter Datensatz geholt werden
muss. Falls keine Übereinstimmung
bestimmt wird, wird der nächsthöhere Wert
ausgewählt,
wobei auf die Bitstelle, die diesem Wert entspricht, in den Bitmaps
Bezug genommen wird. Wie früher
dargelegt worden ist, ist dies zum Ausführen einer Abtastoperation
nach links in einer dicht gepackten Bitmap analog.
-
18 veranschaulicht
eine graphische Darstellung der Bestimmung eines Blatttabellenzeigers 750 unter
Verwendung einer Adresse 702, die als ein Beispiel bereitgestellt
wird, um die obige Diskussion zu ergänzen. Ein erster Abschnitt
der Adresse 704 wird an einen Block angelegt, der dem ersten Stride
in der Trie-Struktur entspricht, die die potentiellen Präfixübereinstimmungen
für die
Adresse speichert. Der erste Abschnitt der Adresse 704 indexiert durch
diesen dicht gepackten Block, um den dicht gepackten Datensatz 706 auszuwählen. Obwohl
gezeigt ist, dass der erste Stride 8 Bits der Adresse 702 verarbeitet,
kann in anderen Ausführungsformen
der erste Stride 16 Bits der Adresse verarbeiten. Die Verarbeitung
der ersten 16 Bits der Adresse in einem einzigen Stride kann erlauben,
dass die durchschnittliche Anzahl der Speicherzugriffe, die erforderlich
ist, um eine Adresse zu verarbeiten, auf Kosten zusätzlichen
Speichers verringert werden kann. Folglich kann die in jedem Stride
eines Systems verarbeitete Anzahl von Bits anhand sowohl von Geschwindigkeit-
als auch von Speicherüberlegungen
ausgewählt werden.
-
In
einer Ausführungsform
wird angenommen, dass der erste Block der Trie-Struktur immer als ein
dicht gepackter Block codiert ist. Wie für einen Durchschnittsfachmann
auf dem Gebiet offensichtlich ist, kann unter einigen Umständen dieser
Block außerdem
als ein nicht dicht gepackter Block codiert sein, aber in Ausführungsformen,
die die nicht dicht gepackte oder die dicht gepackte Codierung des
ersten Blockes unterstützen,
muss eine externe Variable, die den Typ der verwendeten Codierung
angibt, verfügbar
sein, so dass die Verarbeitung des ersten Blocks richtig ausgeführt wird.
-
Die
Bitmaps 708 für
den dicht gepackten Datensatz 706 werden über eine
Funktion 707 verarbeitet, die die Bitmaps unter Verwendung
eines zweiten Abschnitts der Adresse 705 verarbeitet, um
einen Offset 709 zu erzeugen. Es wird angegeben, dass dies
voraussetzt, dass die Adresse 702 mehrere Datensätze erfordert,
um die Weiterleitungsentscheidung zu bestimmen. Falls die Weiterleitungsentscheidung
anhand des dicht gepackten Datensatzes 706 allein bestimmt
worden wäre,
wäre ein Blatt
im Trie während
des ersten Stride erreicht worden, wobei keine weitere Verarbeitung
notwendig sein würde.
-
Der
Offset 709 wird mit dem Zweigtabellen-Basiszeiger 710 für den dicht
gepackten Datensatz 706 kombiniert, um einen Zeiger 711 auf
nicht dicht gepackten Block zu erzeugen. Der Offset 709 ist
vorzugsweise in einer Weise bestimmt worden, die eine Differenzierung
zwischen nachfolgenden Blöcken
enthält,
die nicht dicht gepackt oder dicht gepackt sind. Folglich weil der
Prozessor, dass der zu holende nächste
Block nicht dicht gepackt ist, wobei er entsprechend geholt und
verarbeitet werden kann.
-
Der
Zeiger 711 auf einen nicht dicht gepackten Block wird verwendet,
um den nicht dicht gepackten Block 720 wiederzugewinnen.
Weil der nicht dicht gepackte Block 720 nicht dicht gepackt
ist, werden die nachfolgenden acht Bits der Adresse, die den Adressenabschnitt 712 bilden,
in Vergleichsoperationen mit jedem der Werte verwendet, die in der
Anordnung der Werte des nicht dicht gepackten Blockes 720 enthalten
sind. Dieser Vergleich der Werte erzeugt einen Offset 724,
der mit dem Zweigtabellen-Basiszeiger 722 für den nicht
dicht gepackten Block kombiniert wird, um einen Basiszeiger 726 auf einen
nachfolgenden dicht gepackten Block zu erzeugen.
-
Der
Basiszeiger 726 auf einen dicht gepackten Block zeigt auf
den Anfang eines dicht gepackten Blocks, der durch einen nachfolgenden
Abschnitt der Adresse 731 indexiert wird. Diese Indexierung
wählt einen
speziellen dicht gepackten Datensatz 730 im dicht gepackten
Block aus. Die Bitmaps 732 für den dicht gepackten Datensatz 730 werden
zusammen mit den Adressenbits 737 der Funktion 707 bereitgestellt,
um den Offset 733 zu erzeugen. Dann wird der Offset 733 mit
einem Zweigtabellen-Basiszeiger 734 für den dicht gepackten Datensatz 730 kombiniert, um
einen Zeiger 735 auf einen nicht dicht gepackten Block
zu erzeugen, der den nicht dicht gepackten Block 740 auswählt.
-
Die
letzten acht Bits der Adresse 741 werden dann verwendet,
um sie mit den in dem nicht dicht gepackten Block gespeicherten
Werten zu vergleichen, um den Offset 744 zu erzeugen. Der
Offset 744 wird mit dem Blatttabellen-Basiszeiger 742 des
nicht dicht gepackten Blocks 740 kombiniert, um den Blatttabellen-Index 750 zu
erzeugen. Der Blatttabellen-Index 750 kann dann verwendet
werden, um auf die Blatttabelle zuzugreifen und die Weiterleitungsentscheidung
für das
Paket wiederzugewinnen. Es sollte angegeben werden, dass dicht gepackte
und nicht dicht gepackte Blöcke
in irgendeiner Reihenfolge kombiniert werden können, wenn eine Adresse verarbeitet
wird. 18 veranschaulicht ein Beispiel
einer derartigen Kombination.
-
Die
vorliegende Erfindung schafft ein Mittel zum Komprimieren der den
Strides in einer Trie-Struktur zugeordneten Daten einer Weise, die die
Speicherverwendung verbessert und die durchschnittliche Anzahl von
Speicherzugriffen verringert, die erforderlich ist, um eine Weiterleitungsentscheidung
für ein
Paket zu bestimmen. Als solche können Netze
mit höheren
Geschwindigkeiten ohne die Notwendigkeit für unpraktisch große Speicherstrukturen, um
die Trie-Strukturen zu speichern, unterstützt werden. Die Verwendung
der komprimierten Datenstrukturen erfordert nur lineare Operationen,
wobei folglich die Gesamtkosten und die Komplexität des Paketweiterleitungssystems
verringert werden.
-
In
der vorhergehenden Beschreibung ist die Erfindung unter Bezugnahme
auf spezifische Ausführungsformen
beschrieben worden. Ein Durchschnittsfachmann auf dem Gebiet erkennt
jedoch, dass verschiedene Modifikationen und Änderungen vorgenommen werden
können,
ohne vom Umfang der vorliegenden Erfindung abzuweichen, wie er in den
folgenden Ansprüchen
dargelegt ist. Demzufolge sind die Beschreibung und die Figuren
statt in einem einschränkenden
Sinn in einem veranschaulichenden Sinn zu betrachten, wobei vorgesehen
ist, dass alle derartige Modifikationen im Umfang der vorliegenden
Erfindung enthalten sind.
-
Vorteile,
andere Vorzüge
und Lösungen
für Probleme
sind oben hinsichtlich spezifischer Ausführungsformen beschrieben worden.
Die Vorteile, Vorzüge,
Lösungen
für Probleme
und jedes Element (alle Elemente), die verursachen können, dass
irgendein Vorteil, irgendein Vorzug oder irgendeine Lösung auftritt
oder deutlicher wird, sind nicht als entscheidendes, erforderliches
oder wesentliches Merkmal oder Element irgendeines oder aller Ansprüche auszulegen.
Die Begriffe "umfasst", "umfassend" oder irgendeine
Variation von ihnen sind so, wie sie hierin verwendet werden, vorgesehen,
dass sie eine nicht ausschließliche
Angabe abdecken, so dass ein Prozess, ein Verfahren, ein Gegenstand
oder eine Vorrichtung, der bzw. die eine Liste von Elementen umfasst,
nicht nur diese Elemente enthält,
sondern andere Elemente enthalten kann, die nicht ausdrücklich aufgelistet
sind oder für
einen derartigen Prozess, ein derartiges Verfahren, einen derartigen
Gegenstand oder eine derartige Vorrichtung inhärent sind.
-
Wo
technischen Merkmalen, die in irgendeinem Anspruch erwähnt sind,
Bezugszeichen folgen, sind diese Bezugszeichen nur für den Zweck
der Vergrößerung der
Verständlichkeit
der Ansprüche
einbezogen worden, wobei demzufolge derartige Bezugszeichen keine
einschränkende Wirkung
auf den Umfang jedes Elements besitzen, das durch derartige Bezugszeichen
beispielhaft identifiziert wird.