orm@doc-tcpip.org

Erstellt: November 2000 - Letzte Modifikation: Juli 2001

[ Main | Local ]


Ein IP-Paket in seinen Einzelteilen


Im Paket sieht man nur Sachen, die in den entsprechenden Protokollen festgelegt sind. Man kann also im Prinzip den entsprechenden RFC nehmen, ihn neben den Trace legen und einfach übersetzen.

Hier also ein Beispielpaket aus einem Trace. Der Trace ist unter AIX mit dem iptrace-Kommando aufgenommen und dann mit dem ipreport- Kommando formatiert worden.
Natürlich ändert die Plattform und das benutzte Tool nichts am Inhalt des Paketes - sehr wohl aber an der Ausgabe der Ergebnisse:


Packet Number 2
Das ist die Nummer des Paketes im IP-Trace. Es ist eine Nummer, die der IP-Trace vergibt, also nichts mit den Paketen auf dem Netz zu tun hat und die auch in dem Paket nicht drin steht.

ETH: ====( 74 bytes received on interface en0 )==== 12:00:28.036830597

Das Packet wurde empfangen, und zwar auf dem Ethernet Interface en0 zum angebenen Zeitpunkt. Das ganze Paket war 74 Byte lang. 14 Byte entfallen davon auf den Header vor dem IP-Header. Das wird von der IP-Ebene nachgehalten und in einem Zähler aufgerechnet. Es steht aber nicht im Packet drin.


ETH: 00000000 08005af8 b5b600a0 0c121ba1 08004500 |..Z...........E.|
ETH: 00000010 003c0115 40004006 a04ec0a8 8c05c0a8 |.<..@.@..N......|
ETH: 00000020 8c020017 e445bf6b 51530c41 c0b5a012 |.....E.kQS.A....|
ETH: 00000030 7d78fd32 00000204 05b40101 080a000d |}x.2............|
ETH: 00000040 77fe39fb c2da0103 0300 |w.9....... |

Das ist die Ausgabe in Hex des Paketes. Das erhält man, wenn man im ipreport den Schalter -x mitangibt. Das "ETH" und die Nummer danach sind Sachen, die der ipreport generiert. Ganz links das Protokoll, also Ethernet. Die Nummer ist die Anzahl der Byte - der Bytecount, in Hex, klar. Das am linken Rand ist das Byte mit dieser Nummer. Das erste Byte - in unserem Fall 08 mit der Nummer 0. In der nächsten Zeile folgt dann links das Byte 00, mit der Nummer 0x10, also 16. Fängt man mit 0 an und zählt jeweils 2 Zeichen, dann kommt man genau auf diese 16:

.                                       1 1  1 1 1 1
.                 0 1 2 3  4 5 6 7  8 9 0 1  2 3 4 5
.   ETH: 00000000 08005af8 b5b600a0 0c121ba1 08004500 |..Z...........E.|
.                 1
.                 6
.   ETH: 00000010 003c0115 40004006 a04ec0a8 8c05c0a8 |.<..@.@..N......|
.        Das erste Byte ist also die Nummer 16 dieser Übertragung - das
.        ist 10 in Hex.

Was steht jetzt im Ethernet Header drin?


ETH: 00000000 08005af8 b5b600a0 0c121ba1 0800....
Die ersten 6 Byte 08005af8 b5b6 geben die MAC-Adresse des Empfängers: 08:00:5a:f8:b5:b6. Die folgenden 6 Byte sind die MAC des Senders. Dann folgt 0800, dass ist der Code für das IP-Protokoll. Hier endet also der Ethernet-Header mit 14 Byte, und es beginnt der IP-Header:

ETH: 00000000 ........ ........ ........ ....4500
ETH: 00000010 003c0115 40004006 a04ec0a8 8c05c0a8
ETH: 00000020 8c02.... ........ ........ ........
04 ist die Version, IPv4. Die 5 gibt die Anzahl der 32-Bit Wörter an, aus denen der IP-Header besteht: 32 Bit sind 4 Byte, 5 * 4 ist 20 Byte. Und das ist der Standart IP-Header eines IP-Paketes. Jetzt kommen 2 Byte TOS (Type of Service) - es ist nichts gesetzt (0). Das ist unten weiter erläutert. 3c bezeichnet die Länge des gesamten IP-Teil des Paketes in Bytes (0x3c ist 60 Byte). Danach kommen 2 Byte ID des Paketes (0x0115). Das nächste Byte ist ein bisschen schwierig. Die ersten 3 Bit sind Flags. Dann kommt der Fragment-Offset. Hier ist das erste Byte 0x40, das ist binär 01000000. Das erste Bit muss 0 sein, das zweite ist das Dont Fragment (DF) Bit, und das dritte ist das More Fragments (MF) bit. Der Rest, also 5 Bit plus 8 Bit des nächsten Byte, geben den Fragment Offset, also die Anzahl der 64 Bit Stücke, die schon durch sind (bezogen auf das zersägte Paket). Hier ist das Paket nicht fragmentiert, also alles 0. Das nächste Byte ist 0x40, die "Time to Live", also die Anzahl der Hops, die das Paket passieren darf, bevor es "discarded" wird (0x40 ist 64 dec). Dann kommt 0x06, das ist die Protokoll-Nummer, die im Anschluss kommt. 0x06 ist 6, und das ist TCP - siehe /etc/protocols. 0xa04e ist die Checksumme des IP-Headers. Und dann kommen die beiden IP-Adressen - die Quelle zuerst: 0xc0 ist 192, 0xa8 ist 168, 0x8c ist 140. 0x05 und 0x02 ist klar.... Es sind keine Options gesetzt, also geht es mit dem TCP-Header weiter.

ETH: 00000020 ....0017 e445bf6b 51530c41 c0b5a012
ETH: 00000030 7d78fd32 0000.... ........ ........
0x0017 ist der Source Port (das ist 23, der Telnet-Port). 0xe445 ist der Destination Port (58437). Danach kommt die 32-bittige Sequenznummer: bf6b5153. Und danach die genausolange Acknoledgement-Nummer: 0c41c0b5. Danach finden wir 0xa, das ist die Länge des TCP-Headers, hier in diesem Fall sind das 10 Byte. Normal wären 5, es gibt also Extentions in diesem Header. Jetzt wird es schwierig, denn die nächsten 6 Bit sind reserviert. Danach kommen die 6 Bits, die die Flags angeben. Es ist also: 0x012 in Binär: 000000010010. Die ersten 6 fallen weg. Dann kommen die Flags in folgender Reihenfolge: Urgent, Acknowledge, Push, Reset, Synchronize, Fin. Es ist also ACK und SYN gesetzt. Die nächsten 16 Bit (2 Byte) sind die Grösse des TCP-Windows in Byte - hier 0x7d78 (32120). Dann 16 Bit TCP-Checksumme 0xfd32 und der Urgent-Pointer, also die Stelle im Datenstrom, wo die dringenden Daten losgehen. Hier gibt es sowas nicht, also 0x0000. Jetzt haben wir oben an der TCP-Header-Länge gesehen, das es noch Erweiterungen gibt, und zwar 5 32-bit Wörter:

ETH: 00000030 ........ ....0204 05b40101 080a000d
ETH: 00000040 77fe39fb c2da0103 0300
Die TCP-Optionen werden folgendermassen verkoded:
....0204 05b4.... 0x02 ist Typ 2, die Maximal Segment Size (mss), 0x04 gibt die Länge des Eintrages (4bytes), 0x05b4 ist der numerische Wert für mss (1460).
....0101 080a.... 0x01 ist die Instruktion für keine Operation (NOP). Das macht man, um die Optionen auf eine glatte Anzahl Bytes zu füllen. Es werden hier also 4 Byte mit NOPs gefüllt - so dass ein 32bit Wort entsteht. Danach kommt 0x08, das ist der Typ 8 (timestamp), mit einer Länge von 0x0a also 10 bytes:
....000d 77fe39fb c2da.... Das ist der Wert dieser Option. Der Typ wie auch die Angabe der Länge zählen zu den Bytes der Länge dazu... Dann nochmal ein NOP und dann 0x03 für den Faktor für das TCP/IP Window (Type 3, win scale) mit einer Länge von 0x03 und einem Wert von 0. Das heisst, das dass angegebene Window keinen Faktor hat, also genauso zu nehmen ist:
.... 0103 0300. Hier ist das Paket dann auch zuende..

Ipreport ist so nett, das ganze "Human readable" umzusetzen:


ETH: [ 00:a0:0c:12:1b:a1 -> 08:00:5a:f8:b5:b6 ] type 800 (IP)
Source und Destination MAC-Adresse und das benutzte Protokoll.

IP:   < SRC = 192.168.140.5 > ()
IP:   < DST = 192.168.140.2 > ()
Die beiden IP-Adressen. Wenn man Namensauflösung macht, dann erscheinen in den Klammern die Hostnamen.

IP:   ip_v=4, ip_hl=20, ip_tos=0, ip_len=60, ip_id=277, ip_off=0DF
Die Version des IP-Protokolles: IPv4, gefolgt von der Länge des Headers (20 Byte), kein spezieller Type of Service, die gesamte Länge des IP Paketes ist 60 Byte. Die ID ist 277 und das Paket ist nicht fragmentiert.

IP:   ip_ttl=64, ip_sum=a04e, ip_p = 6 (TCP)
Das Paket darf über 64 Router weitergereicht werden, dann muss des verworfen werden. Die Checksumme des IP-Headers und dann die Nummer des Protokolls: 6 für TCP.

TCP:   < source port=23(telnet), destination port=58437 >
Die Ports von Quelle und Ziel.

TCP:   th_seq=bf6b5153, th_ack=c41c0b5
Zuerst die Sequenznummer, also die fortlaufenden Nummer des ersten Bytes Daten in diesem Paket. Danach die Acknowldge-Number. Das ist die Nummer des letzten von der anderen Seite erhaltenen Bytes Daten plus 1. Also die Nummer des nächsten erwarteten Bytes. Alle Header etc. Zählen nicht zu den Daten!

TCP:   th_off=10, flags
Hier der Offset des TCP-Headers. Normalerweise ist der Header 5*32-bit Wörter lang (20 Byte). Hier hat er noch Erweiterungen, ist also insgesamt 40 Byte lang.

TCP:   th_win=32120, th_sum=fd32, th_urp=0
Das TCP-Window. Es ist 32120 Byte gross und ist als eine Art Kredit zu verstehen, den diese Maschine der anderen gibt: Du darfst soviele Daten schicken, ohne auf eine Antwort (Acknowledgement) von mir warten zu müssen. Dann eine Checksumme und der Urgent-Pointer: wo fängt im Datenstrom die wichtige Information an? (Wird kaum benutzt...)


TCP: 00000000 020405b4 0101080a 000d77fe 39fbc2da |..........w.9...|
TCP: 00000010 01030300 |.... |
Tja, und hier die Extentions. IP-Trace auf dieser Maschine (AIX 4.3.2, ML02) ist nicht in der Lage, die Options richtig zu übersetzen....
Type of Service (RFC 1349 oder so):
Ein Byte, acht Bit, die die gewünschte Geschwindigkeit bzw. Art von Service für diese Paket angeben.
Das sieht so aus:

01234567
Die ersten 3 Bit, also 0 - 2, stehen für die Herkunft und Wichtigkeit des Paketes:
000 Routine
001 Priorität
010 Sofort
011 Flash
100 Flash Ende
101 Critical
110 Internet Control
111 Network Control

Die nächsten 4 Bit, also 3 - 6, stehen für die Art des Service:
1000 Minimaler Delay
0100 Maxilmaler Durchsatz
0010 Maximale Reliability
0001 Minimale Kosten
0000 Normaler Service

Das letzte Bit Must Be Zero (MBZ)

Die Protocol Nummern (Zu finden in den Assigned Numbers bei IANA):
0 Reserved
1 ICMP
2 IGMP
3 GGP (Gateway to Gateway Protokoll)
4 IP (IP Encapsulation)
5 Stream
6 TCP
8 EGP
9 Private Interior Routing Protokoll
17 UDP
89 Open Shortest Path First


[ Main | Local ]

[ Allgemein | UNIX | AIX | TCP-IP | TCP | ROUTING | DNS | NTP | NFS | FreeBSD | Linux | SMTP | Tracing | GPS ]

Copyright 2001-2014 by Orm Hager - Es gilt die GPL
Feedback bitte an: Orm Hager (orm@doc-tcpip.org )