Forwarding Tabelle

Neue Frage »

Auf diesen Beitrag antworten »
Caro Forwarding Tabelle

Meine Frage:
Euch einen guten Abend!

Ich sitze jetzt seit einigen Stunden über einem Problem der Telematik und kann es einfach nicht lösen. Es geht um eine Forwarding Tabelle, in der folgendes steht:

Netzwerk Link Interface
166.98.128.0/18 1
166.98.128.0/22 2
166.98.128.0/21 3

Nun soll ich bestimmen, auf welchem Interface der Router die folgenden Pakete mit den Zieladressen 166.98.128.5, 166.98.131.6,
166.98.135.5, 166.98.136.5 weiterleiten wird.

Meine Ideen:
Ich habe überlegt, ob er das Paket 166.98.128.5 auf das Netzwerk 166.98.128.0/18 weiterleiten wird, weil diese 5 zwischen 0 und 18 liegt, aber das ist wirklich einfach nur geraten. Ich weiß einfach nicht, wie das geht und habe auch bis jetzt keine vernünftige Erklärung gefunden. Gibt es dafür einen Algorithmus, wie ich das rechnen kann? Wo kann ich den finden oder könnte mir vielleicht jemand ein Beispiel geben? Ich wäre euch wirklich sehr dankbar.

herzliche Grüße

Caro
 
Auf diesen Beitrag antworten »
as_string

Hallo Caro!

Eins vorne weg... ich bin mir nicht ganz sicher..., aber:

Die Angabe in der ersten Spalte gibt in der Tat die IP-Adressen an, die jeweils über dieses Interface erreicht werden können. Normalerweise wird dann noch eine "Metric" oder "Cost" angegeben, sprich je niedriger der Wert, um so eher wäre er zu bevorzugen. Bei Deiner Tabelle verstehe ich das allerdings nicht so... würde keinen Sinn ergeben, weil dann alle den ersten Link nehmen würden. Der deckt alle Adressen ab, die auch die anderen Bereiche abdecken und hat die niedrigsten Kosten.

Aber ich kann Dir erklären, wie das mit den abgedeckten Adressen funktioniert:

Dazu muss man die Basis-Adresse sich erst in Bit-Schreibweise denken (eigentlich):
code:
1:
2:
3:
    166   .     98    .    128    .      0
1010 0110 . 0110 0010 . 1000 0000 . 0000 0000

Das musst Du jetzt auch für die Zieladressen tun:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
    166   .     98    .    128    .      5
1010 0110 . 0110 0010 . 1000 0000 . 0000 0101
    166   .     98    .    131    .      6
1010 0110 . 0110 0010 . 1000 0011 . 0000 0110
    166   .     98    .    135    .      5
1010 0110 . 0110 0010 . 1000 0111 . 0000 0101
    166   .     98    .    136    .      5
1010 0110 . 0110 0010 . 1000 1000 . 0000 0101


Die Zahlen hinter dem Querstrich (also die 18, 22 und 21) bedeuten: Wenn die ersten (höchst-wertigen) 18, 22 bzw. 21 Bit der Netzwerk-Adresse und der Zieladresse übereinstimmen, dann liegt die Zieladresse im angegebenen Netzwerk.

Jetzt also zählen: Bei der ersten ist eine 18 angegeben. Die ersten 18 Bit sind:
code:
1:
2:
166.98.128.0/18: 1010 0110 . 0110 0010 . 10

Alle Zieladressen decken sich mit diesen 18 Bit, die sind also alle in diesem Netzwerk drin.
Wie sieht es mit der zweiten aus? Da fehlen die letzten 10 Bit (insgesamt sind es immer 32 Bit bei IPv4 Adressen). Wenn Du vergleichst, siehst Du, dass die ersten beiden noch dazu passen, aber die beiden anderen im 22. und 21. Bit Unterschiede haben. Das bedeutet: Die ersten beiden liegen noch in dem Netzwerk, die anderen beiden nicht.

Bei der letzten Maske mit 21 Bit Übereinstimmung sind alle bis auf die letzte drin.

Das bedeutet: Das erste Interface könnte für alle Zieladressen verwendet werden. Das zweite Interface für die ersten beiden, aber nicht für die anderen beiden. Das letzte Interface könnte für alle Zieladressen bis auf die letzte verwendet werden.
Welche tatsächlich verwendet wird, weiß ich leider nicht...

Übrigens kann man die Rechnung oben sehr effizient mit logischen-Bitoperationen in Software oder auch in Hardware erledigen, indem man Netzwerk-Basis-Adresse und Zieladresse miteinander bitweise Exklusiv-Oder und das Ergebnbis dann bitweise Und verknüpft. Wenn das Ergebnis 0 ist, dann liegen die Zieladresse im Netzwerk. Hier wäre ein C-Fragment:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
#include "stdio.h"

int main() {
        unsigned int mask_18 = 0b11111111111111111100000000000000;
        unsigned int mask_22 = 0b11111111111111111111110000000000;
        unsigned int mask_21 = 0b11111111111111111111100000000000;

        unsigned int base_address = (166 << 24) | (98 << 16) | (128 << 8) | 0;

        unsigned int dest_address[] = {
                (166 << 24) | (98 << 16) | (128 << 8) | 5,
                (166 << 24) | (98 << 16) | (131 << 8) | 6,
                (166 << 24) | (98 << 16) | (135 << 8) | 5,
                (166 << 24) | (98 << 16) | (136 << 8) | 5
        };

        int i;

        for(i = 0; i < (sizeof(dest_address) / sizeof(dest_address[0])); i++) {
//              printf("%x %x %x\n", base_address, dest_address[i], base_address ^ dest_address[i]);
                if( ( base_address ^ dest_address[i] ) & mask_18 )
                        printf("%d: Adresse ist nicht im 166.98.128.0/18-er Netz\n", i);
                else
                        printf("%d: Adresse ist im 166.98.128.0/18-er Netz\n", i);
                if( ( base_address ^ dest_address[i] ) & mask_22 )
                        printf("%d: Adresse ist nicht im 166.98.128.0/22-er Netz\n", i);
                else
                        printf("%d: Adresse ist im 166.98.128.0/22-er Netz\n", i);
                if( ( base_address ^ dest_address[i] ) & mask_21 )
                        printf("%d: Adresse ist nicht im 166.98.128.0/21-er Netz\n", i);
                else
                        printf("%d: Adresse ist im 166.98.128.0/21-er Netz\n", i);

        }
}


Die Ausgabe ist dann:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
0: Adresse ist im 166.98.128.0/18-er Netz
0: Adresse ist im 166.98.128.0/22-er Netz
0: Adresse ist im 166.98.128.0/21-er Netz
1: Adresse ist im 166.98.128.0/18-er Netz
1: Adresse ist im 166.98.128.0/22-er Netz
1: Adresse ist im 166.98.128.0/21-er Netz
2: Adresse ist im 166.98.128.0/18-er Netz
2: Adresse ist nicht im 166.98.128.0/22-er Netz
2: Adresse ist im 166.98.128.0/21-er Netz
3: Adresse ist im 166.98.128.0/18-er Netz
3: Adresse ist nicht im 166.98.128.0/22-er Netz
3: Adresse ist nicht im 166.98.128.0/21-er Netz


Gruß
Marco
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »