orm@doc-tcpip.org | Erstellt: Dezember 2000 - Letzte Modifikation: Mai 2001 |
Hier ein Ping zwischen den Maschinen 192.168.140.2 und 192.168.140.5.
Die Maschine 192.168.140.2 möchte gerne wissen, ob die .5 läuft.
Ping ist ein Dienst im Rahmen des ICMP
(Internet Control Message Protocol)
und ist etwas schwer unterzubringen: es ist ein Teil des IP-Protokolls,
obwohl es IP ähnlich benutzt wie die Transportprotokolle (UDP, TCP) auch.
Der Trace stammt wieder einmal von einer AIX-Maschine und ist mit -x formatiert, und ich gehe wieder zuerst das
Paket in Hex durch.
Die MAC des Empfängers und des Senders, dann 0x0800 für das Ethernetprotokoll. Danach 0x4 für IPv4 und 0x5 für die Länge des IP-Headers (5 32bit Worte).Packet Number 1 ETH: ====( 98 bytes transmitted on interface en0 )==== 09:52:22.267441248 ETH: 00000000 00a00c12 1ba10800 5af8b5b6 08004500 |........Z.....E.|
Das letzte Byte der vorherigen Zeile und das erste Byte dieser Zeile ist der Type of Service - es ist nichts gesetzt. 0x54 ist die Länge des IP-Paketes in Byte: 84 in Dezimal. (Plus 14 Byte für den Ethernet-Header macht das 98 Byte) Dann kommen 2 Byte 0xc379, das ist die IP-ID des Paketes. Fragment Offset ist 0x0000, also gibt es keine Fragmente. 0xff ist 255 und die Anzahl der Hops, die das Paket durchlaufen darf. Jetzt wird es interessant: 0x01 ist die Protokoll Nummer des Paketes, was nach dem IP-Header kommt. Typ 1 ist ICMP. Danach kommt die Checksumme des IP-Headers: 0x5ed6. Dann die IP-Adressen: c0a88c02 und c0a88c0 (Die Quelle zuerst).ETH: 00000010 0054c379 0000ff01 5ed6c0a8 8c02c0a8 |.T.y....^.......| ETH: 00000020 8c05.... ........ ........ ........
Hier fängt die ICMP-Message als solche an.ETH: 00000020 ....0800 e1581f1e 0000.... ........ |.....X....9..6..|
Diese Daten dienen zum Auffüllen des Paketes...ETH: 00000020 ........ ........ ....39e6 bf360004 |.....X....9..6..| ETH: 00000030 13650809 0a0b0c0d 0e0f1011 12131415 |.e..............| ETH: 00000040 16171819 1a1b1c1d 1e1f2021 22232425 |.......... !"#$%| ETH: 00000050 26272829 2a2b2c2d 2e2f3031 32333435 |&'()*+,-./012345| ETH: 00000060 3637 |67 |
Hier nun die Antwort auf den ECHO_REQUEST. Ich gehe nur auf die Änderungen ein.ETH: [ 08:00:5a:f8:b5:b6 -> 00:a0:0c:12:1b:a1 ] type 800 (IP) IP: < SRC = 192.168.140.2 > IP: < DST = 192.168.140.5 > IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=50041, ip_off=0 IP: ip_ttl=255, ip_sum=5ed6, ip_p = 1 (ICMP) ICMP: icmp_type=8 (ECHO_REQUEST) icmp_id=7966 icmp_seq=0
Die MAC Adressen sind natürlich andersherum...Packet Number 2 ETH: ====( 98 bytes received on interface en0 )==== 09:52:22.268081006 ETH: 00000000 08005af8 b5b600a0 0c121ba1 08004500 |..Z...........E.|
Der Typ ist immer noch ICMP: == Die IPs sind vertauscht, klar.ETH: 00000010 00540074 0000ff01 21dcc0a8 8c05c0a8 |.T.t....!.......|
Hier hat sich jetzt was geändert: Der Typ und der Code sind beide 0. Das ist für den ECHO_REPLY so üblich. Der Identifier (0x1f1e) ist gleich - so kann man verschiedene Instanzen des Ping-Kommandos unterscheiden. Die Sequenznummer ist 0 - es ist das erste Paket. Dann kommt wieder unsinniges Zeug (um das Paket voll zu kriegen).ETH: 00000020 8c020000 e9581f1e 000039e6 bf360004 |.....X....9..6..| ====
Dasselbe in Easy-Read:ETH: 00000030 13650809 0a0b0c0d 0e0f1011 12131415 |.e..............| ETH: 00000040 16171819 1a1b1c1d 1e1f2021 22232425 |.......... !"#$%| ETH: 00000050 26272829 2a2b2c2d 2e2f3031 32333435 |&'()*+,-./012345| ETH: 00000060 3637 |67 |
Jetzt wird die Sequenz-Nummer erhöht.ETH: [ 00:a0:0c:12:1b:a1 -> 08:00:5a:f8:b5:b6 ] type 800 (IP) IP: < SRC = 192.168.140.5 > IP: < DST = 192.168.140.2 > IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=116, ip_off=0 IP: ip_ttl=255, ip_sum=21dc, ip_p = 1 (ICMP) ICMP: icmp_type=0 (ECHO_REPLY) icmp_id=7966 icmp_seq=0 Packet Number 3 ETH: ====( 98 bytes transmitted on interface en0 )==== 09:52:23.269029601 ETH: 00000000 00a00c12 1ba10800 5af8b5b6 08004500 |........Z.....E.| ETH: 00000010 0054c37a 0000ff01 5ed5c0a8 8c02c0a8 |.T.z....^.......| ETH: 00000020 8c050800 dac11f1e 000139e6 bf370004 |..........9..7..| ==
Was man hier auch sieht: Die ID bleibt aber gleich!!ETH: 00000030 19fa0809 0a0b0c0d 0e0f1011 12131415 |................| ETH: 00000040 16171819 1a1b1c1d 1e1f2021 22232425 |.......... !"#$%| ETH: 00000050 26272829 2a2b2c2d 2e2f3031 32333435 |&'()*+,-./012345| ETH: 00000060 3637 |67 | ETH: [ 08:00:5a:f8:b5:b6 -> 00:a0:0c:12:1b:a1 ] type 800 (IP) IP: < SRC = 192.168.140.2 > IP: < DST = 192.168.140.5 > IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=50042, ip_off=0 IP: ip_ttl=255, ip_sum=5ed5, ip_p = 1 (ICMP) ICMP: icmp_type=8 (ECHO_REQUEST) icmp_id=7966 icmp_seq=1 ============ ===========
Die Antwort dazu.Packet Number 4 IP: < SRC = 192.168.140.5 > IP: < DST = 192.168.140.2 > IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=117, ip_off=0 IP: ip_ttl=255, ip_sum=21db, ip_p = 1 (ICMP) ICMP: icmp_type=0 (ECHO_REPLY) icmp_id=7966 icmp_seq=1
Und so geht es jetzt weiter...Packet Number 5 IP: < SRC = 192.168.140.2 > IP: < DST = 192.168.140.5 > IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=50043, ip_off=0 IP: ip_ttl=255, ip_sum=5ed4, ip_p = 1 (ICMP) ICMP: icmp_type=8 (ECHO_REQUEST) icmp_id=7966 icmp_seq=2 Packet Number 6 IP: < SRC = 192.168.140.5 > IP: < DST = 192.168.140.2 > IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=118, ip_off=0 IP: ip_ttl=255, ip_sum=21da, ip_p = 1 (ICMP) ICMP: icmp_type=0 (ECHO_REPLY) icmp_id=7966 icmp_seq=2
Ping ist jetzt nur ein kleiner Teil des ICMP. Der RFC792 gibt alle benutzten ICMP-Typen und ihre Codes. Je nach Typ ist der Header dabei unterschiedlich - will man das Paket "groken" so muss man sich zB. den Stevens hernehmen (Seite 69). Wichtig ist auch: Je nach Implementation sind andere Messages mit den ICMP-Messages verbunden. Teilweise defaulten verschiedene Codes zur selben User-Message (in 4.4BSD ist zB. "Port unreachable" und "protocol unreachable" diesselbe User-Message: "Connection refused").
Hier eine Überraschung: die Länge des Headers wird mit 0xf, also 15 32-bit Worten angegeben! Der Type of Service (die nächsten 2 Byte) ist 0. 0x7c ist die Länge des IP- Teiles, also 124 Byte. 0xc424 ist die Paket ID, die nächsten 2 Byte geben den Fragment Offset an: 0. 0xff sind die möglichen Hops: 255. Als letztes Byte kommt der Protokolltyp nach dem IP-Header: Typ 1, also ICMP.IPTRACE version: 2.0 Packet Number 1 TOK: ====( 146 bytes transmitted on interface tr0 )==== 14:03:19.820844718 TOK: 00000000 00401000 5ab1a6ef 000629b9 503faaaa |.@..Z.....).P?..| TOK: 00000010 03000000 0800.... ........ ........ |......O..|.$....| TOK: 00000010 ........ ....4f00 007cc424 0000ff01 |......O..|.$....| =
Dann die IP-Adressen in Hex: 0927004a und 09351c64. Wie wir oben gesehen haben, hat der IP-Header in diesem Paket die maximale Länge (15 32-Bit Wörter, also 60 Byte.).TOK: 00000020 b32b0927 004a0935 1c64.... ........ |.+.'.J.5.d.'....| Checksumme: ====
Es kommt jetzt die IP-Option: 0x07, also 7 Dezimal, und das ist Route Record. Jeder Router auf dem Weg muss seine IP hier Eintragen, am Ziel werden die Adressen in den Datenteil umkopiert und die Router des Rückweges tragen sich wieder in den IP Header ein. Das nächste Byte (0x27) gibt die gesamte Länge der RR Option an: 39 - hier wird standardmässig der maximal-Wert genommen. Was nun kommt, ist ein Pointer zum jeweils aktuellen, freien Eintrag. In diesem Fall ist es 0x04, also das 4. Byte ist das erste Byte der ersten Adresse, die auf dem Weg des Paketes liegt. Der Pointer wird dann erhöht, und der nächste Router schreibt an die angegebene Stelle - das wäre 8. In der Folge kommen die IP-Adressen der Router, und zwar immer das Interface, über dass das Paket den Router verlässt!TOK: 00000020 ........ ........ ....0727 04000000 |.+.'.J.5.d.'....|
Hier ist der IP-Header zuende, der normale ICMP-Header beginnt. Ping -R hat also eigentlich nichts mit ICMP zu tun.. ;-)TOK: 00000030 00000000 00000000 00000000 00000000 |................| TOK: ******** TOK: 00000050 00000800 d950863c 000039ea ee87000c |.....P.<..9.....| . ==
Ipreport kümmert sich um den längeren Header nicht...TOK: 00000060 84f10809 0a0b0c0d 0e0f1011 12131415 |................| TOK: 00000070 16171819 1a1b1c1d 1e1f2021 22232425 |.......... !"#$%| TOK: 00000080 26272829 2a2b2c2d 2e2f3031 32333435 |&'()*+,-./012345| TOK: 00000090 3637 |67 | TOK: 802.5 packet TOK: 802.5 MAC header: TOK: access control field = 0, frame control field = 40 TOK: [ src = 00:06:29:b9:50:3f, dst = 10:00:5a:b1:a6:ef] TOK: 802.2 LLC header: TOK: dsap aa, ssap aa, ctrl 3, proto 0:0:0, type 800 (IP) IP: < SRC = 9.39.0.74 > (cristina.ncs.mainz.ibm.com) IP: < DST = 9.53.28.100 > (tcaustin.austin.ibm.com) IP: ip_v=4, ip_hl=60, ip_tos=0, ip_len=124, ip_id=50212, ip_off=0
Hier jetzt das Paket nach der Ankunft, also nach einen Round Trip (Rundlauf).IP: ip_ttl=255, ip_sum=b32b, ip_p = 1 (ICMP) ICMP: icmp_type=8 (ECHO_REQUEST) icmp_id=34364 icmp_seq=0
Hier fängt der RR an: == Es sind immer noch 60 Byte, klar. == Der Pointer ist aber jetzt anders! == (40 Dezimal) Das heisst, das wir wahrscheinlich schon Pech gehabt haben. Es sind 9 IP- Adressen im Header. Mehr passen nicht rein, und werden auch nicht mitgeschnitten.Packet Number 2 TOK: ====( 146 bytes received on interface tr0 )==== 14:03:20.026738653 TOK: 00000000 10400006 29b9503f 4282100c 0602aaaa |.@..).P?B.......| TOK: 00000010 03000000 08004f00 007c864b 0000f501 |......O..|.K....| TOK: 00000020 2c730935 1c640927 004a0727 28092700 |,s.5.d.'.J.'(.'.|
Das heisst, das die Router, über die das Packet gelaufen ist, folgende IP haben: 092700bf, 098b7804, 091fe54e, 098b6682, 09204a36, 0920012d, 09206939, 090385b9 und 09033ffd.TOK: 00000030 bf098b78 04091fe5 4e098b66 8209204a |...x....N..f.. J| TOK: 00000040 36092001 2d092069 39090385 b909033f |6. .-. i9......?| TOK: 00000050 fd...... ........ ........ ........ |.....P.<..9.....|
Hier findet sich wieder der Start des ICMP-Paketes. Der Identifier stimmt auch: 0x863c. Und die zweite 0000 ist die Sequenznummer 0. Dann kommen wieder sinnlose Daten.TOK: 00000050 ..000000 e150863c 000039ea ee87000c |.....P.<..9.....| . ====
Auch hier kümmert sich ipreport nicht um die Header-Erweiterungen.TOK: 00000060 84f10809 0a0b0c0d 0e0f1011 12131415 |................| TOK: 00000070 16171819 1a1b1c1d 1e1f2021 22232425 |.......... !"#$%| TOK: 00000080 26272829 2a2b2c2d 2e2f3031 32333435 |&'()*+,-./012345| TOK: 00000090 3637 |67 | TOK: 802.5 packet TOK: 802.5 MAC header: TOK: access control field = 10, frame control field = 40 TOK: [ src = 42:82:10:0c:06:02, dst = 00:06:29:b9:50:3f] TOK: 802.2 LLC header: TOK: dsap aa, ssap aa, ctrl 3, proto 0:0:0, type 800 (IP) IP: < SRC = 9.53.28.100 > (tcaustin.austin.ibm.com) IP: < DST = 9.39.0.74 > (cristina.ncs.mainz.ibm.com) IP: ip_v=4, ip_hl=60, ip_tos=0, ip_len=124, ip_id=34379, ip_off=0 IP: ip_ttl=245, ip_sum=2c73, ip_p = 1 (ICMP)
ICMP: icmp_type=0 (ECHO_REPLY) icmp_id=34364 icmp_seq=0
Pingt man sein eigenes Interface, dann erkennt die IP-Schicht aufgrund
der Routing Table, das es sich um das eigene Interface handelt und der
Verkehr geht dann über das Loopback.
So ist das Interface gesetzt:
Hier die Routing Table:en0: flags=e080863< UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT> inet 192.168.140.3 netmask 0xffffff00 broadcast 192.168.140.255
Und hier der Trace:Routing tables Destination Gateway Flags Refs Use If PMTU Exp Groups Route Tree for Protocol Family 2 (Internet): default 9.39.0.191 UG 7 98072 tr0 - - 9.39/20 9.39.0.74 U 113 691329 tr0 - - 127/8 127.0.0.1 U 3 11846 lo0 - - 192.168.140/24 192.168.140.3 U 1 2457493 en0 - - Route Tree for Protocol Family 24 (Internet v6): ::1 ::1 UH 0 0 lo0 16896 -
Packet Number 1 ====( 84 bytes transmitted on interface lo0 )==== 11:29:27.262417944 00000000 45000054 6d710000 ff01b4e3 c0a88c01 |E..Tmq..........| 00000010 c0a88c01 08002bf5 5eea0000 39f94af7 |......+.^...9.J.| 00000020 0003fd29 08090a0b 0c0d0e0f 10111213 |...)............| 00000030 14151617 18191a1b 1c1d1e1f 20212223 |............ !"#| 00000040 24252627 28292a2b 2c2d2e2f 30313233 |$%&'()*+,-./0123| 00000050 34353637 |4567 | OTHER packet (IP) IP: < SRC = 192.168.140.1 > IP: < DST = 192.168.140.1 > IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=28017, ip_off=0 IP: ip_ttl=255, ip_sum=b4e3, ip_p = 1 (ICMP) ICMP: icmp_type=8 (ECHO_REQUEST) icmp_id=24298 icmp_seq=0 Packet Number 2 ====( 84 bytes transmitted on interface lo0 )==== 11:29:27.262469172 00000000 45000054 6d720000 ff01b4e2 c0a88c01 |E..Tmr..........| 00000010 c0a88c01 000033f5 5eea0000 39f94af7 |......3.^...9.J.| 00000020 0003fd29 08090a0b 0c0d0e0f 10111213 |...)............| 00000030 14151617 18191a1b 1c1d1e1f 20212223 |............ !"#| 00000040 24252627 28292a2b 2c2d2e2f 30313233 |$%&'()*+,-./0123| 00000050 34353637 |4567 | OTHER packet (IP) IP: < SRC = 192.168.140.1 > IP: < DST = 192.168.140.1 > IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=28018, ip_off=0 IP: ip_ttl=255, ip_sum=b4e2, ip_p = 1 (ICMP) ICMP: icmp_type=0 (ECHO_REPLY) icmp_id=24298 icmp_seq=0 Packet Number 3 ====( 84 bytes transmitted on interface lo0 )==== 11:29:28.265362305 00000000 45000054 6d730000 ff01b4e1 c0a88c01 |E..Tms..........| 00000010 c0a88c01 08001f7c 5eea0001 39f94af8 |.......|^...9.J.| 00000020 000409a0 08090a0b 0c0d0e0f 10111213 |................| 00000030 14151617 18191a1b 1c1d1e1f 20212223 |............ !"#| 00000040 24252627 28292a2b 2c2d2e2f 30313233 |$%&'()*+,-./0123| 00000050 34353637 |4567 | OTHER packet (IP) IP: < SRC = 192.168.140.1 > IP: < DST = 192.168.140.1 > IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=28019, ip_off=0 IP: ip_ttl=255, ip_sum=b4e1, ip_p = 1 (ICMP) ICMP: icmp_type=8 (ECHO_REQUEST) icmp_id=24298 icmp_seq=1 Packet Number 4 ====( 84 bytes transmitted on interface lo0 )==== 11:29:28.265416441 00000000 45000054 6d740000 ff01b4e0 c0a88c01 |E..Tmt..........| 00000010 c0a88c01 0000277c 5eea0001 39f94af8 |......'|^...9.J.| 00000020 000409a0 08090a0b 0c0d0e0f 10111213 |................| 00000030 14151617 18191a1b 1c1d1e1f 20212223 |............ !"#| 00000040 24252627 28292a2b 2c2d2e2f 30313233 |$%&'()*+,-./0123| 00000050 34353637 |4567 | OTHER packet (IP) IP: < SRC = 192.168.140.1 > IP: < DST = 192.168.140.1 > IP: ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=28020, ip_off=0 IP: ip_ttl=255, ip_sum=b4e0, ip_p = 1 (ICMP) ICMP: icmp_type=0 (ECHO_REPLY) icmp_id=24298 icmp_seq=1
[ Allgemein | UNIX | AIX | TCP-IP | TCP | ROUTING | DNS | NTP | NFS | FreeBSD | Linux | RPi | SMTP | Tracing | GPS | LW ]
Copyright 2001-2021 by Orm Hager - Es gilt die GPL