orm@doc-tcpip.org

Erstellt: Januar 2001 - Letzte Modifikation: Juli 2001

[ Main | Local ]


DHCP aufs Paket geschaut


Dieser Trace ist mit IPTRACE version 2.0 formatiert. Diese Version "grokt" das Paket nicht richtig, weil der Programierer das nicht gemacht hat. Ab AIX 4.3.3 sollte Iptrace es richtig machen, bis dahin muss man selber ran. Das ist im ersten Paket gemacht, dann nur boch bei wichtigen Dingen.

Hier das erste Packet. Es ist ein Broadcast ins Netz, auf der Suche nach einem DHCP-Server, ein DHCPDISCOVER.


Packet Number 1
ETH: ====( 590 bytes received on interface en0 )==== 17:12:40.226196975
ETH: 00000000     ffffffff ffff0800 5a92e6ec 08004500     |........Z.....E.|

.                 MAC Empfänger (das ist Broadcast: 255.255.255.255)
.                              MAC Sender: 08:00:5a:92:e6:ec
.                                            Das Protokoll, was folgt: 0x0800
.                                            also IP. Bis hier 14 Byte.
.                                                IP Version 4.
.                                                 Länge des IP Headers in 32bit
.                                                 Wörtern (5*32/8= 20 byte).
.                                                  Type of Service (0)

ETH: 00000010     0240dbe9 00001e11 bec40000 0000ffff     |.@..............|

.                 Länge des Paketes: 0x0240 => 576 Byte
.                     Identifikation: 0xdbe9
.                          Keine Flags, Fragment Offset ist 0
.                              Time to Live: 30 (0x1E)
.                                Protokoll Nummer: 17, UDP (0x11)
.                                   Checksumme (0xbec4)
.                                        Source IP (ist 0, ist ja DHCP!)
.                                                Destination IP


ETH: 00000020     ffff0044 0043022c d4c10101 06007906     |...D.C.,......y.|

.                 ....
.                     Source Port 68 (0x44)
.                          Destination Port 67 (0xr43)
.                              Länge in Byte: 556 (0x22C)
.                                   Checksumme (0xd4c1)
.                                       Opcode 1 (Ein Request) (0x01)
.                                         HW Type 1 (Ethernet) (0x01)
.                                            Länge: 6 Byte (0x06)
.                                              Hops (0, also auf dem Segment)
.                                                Transaction ID (0x7906a91d)

ETH: 00000030     a91d0006 00000000 00000000 00000000     |................|

.                 ....
.                     Sekunden seit Beginn der Transaction (0x6)
.                          Client IP. Setzt der Client, wenn er die mal hatte.
.                                   Your IP. Setzt der Server.
.                                            Server IP. Setzt der Server.


ETH: 00000040     00000000 00000800 5a92e6ec 00000000     |........Z.......|

.                 Relay IP. Wenn das Paket über einen Relay lief.
.                          Client HW Adresse. Es sind 16 Byte, daher die
.                          2 genullten Byte.
.                                            Optionaler Server Hostname
.                                            64 Byte. (Wenn gesetzt)

ETH: 00000050     00000000 00000000 00000000 00000000     |................|
ETH: ********

.                 Boot File Name. 128 Byte. (Wenn gesetzt, sonst null)
.                 Die ***** bedeuten, das IPtrace hier ein paar Nullen kürzt.


ETH: 00000110     00000000 00006382 53633501 013d0d00     |......c.Sc5..=..|

.                              Magic Cookie 0x63825363
.                                       DHCP Message Type, Option 53 (0x35)
.                                         Länge 1 Byte (0x01)
.                                            Code 1 = DHCPDISCOVER (0x01)
.                                              Client Identifier, Opt. 61 (0x3d)
.                                                Länge, 13 Byte
.                                                  Type: 0x0 wenn es kein HW
.                                                  ist. Sonst wie bei ARP.

ETH: 00000120     6e696d6d 61737465 725f656e 0c0c6e69     |nimmaster_en..ni|

.                 Hier ist der Identifier der Name:
.                 n i m m  a s t e  r _ e n      n i

ETH: 00000130     6d6d6173 7465725f 656e1301 00140100     |mmaster_en......|

.                 m m a s  t e r _  e n
.                                       IP Forw. Enable/Disable, Opt. 19 (0x13)
.                                         Länge 1 Byte
.                                            Disabled
.                                              Non-Local Source Routing, Opt. 20
.                                                Länge 1 Byte
.                                                  Disabled

ETH: 00000140     1b01001d 01001e01 001f0100 22010024     |............"..$|

.                 All Subnets are local, Opt. 27 (0x1B)
.                   Länge 1 Byte
.                     Disabled
.                       Perform Mask Discovery, Opt. 29 (0x1D)
.                         Länge 1 Byte
.                           Disabled
.                             Mask Supplier Option, Opt. 30 (0x1E)
.                               Länge 1 Byte, Disabled
Hier werden weiter Optionen vom Client angefragt(das ganze jetzt verkürzt):
Perform Router Discovery, Opt. 31, 0x1F
Trailer Encapsulation Option, Opt. 34, 0x22
Ethernet Encapsulaton Option, Opt. 36. 0x24

ETH: 00000150     01002701 00ff0000 00000000 00000000     |..'.............|

.		      TCP Keepalive Garbage Option, Opt. 39, 0x27
.                            0xFF ist 255, das Ende der Option List.
.                            Der Rest ist Padding.

ETH: 00000160     00000000 00000000 00000000 00000000     |................|
ETH: ********
ETH: 00000240     00000000 00000000 00000000 0000         |..............  |
ETH:    [ 08:00:5a:92:e6:ec -> ff:ff:ff:ff:ff:ff ]  type 800  (IP)
IP:  	< SRC =         0.0.0.0 >
IP:  	< DST = 255.255.255.255 >
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=576, ip_id=56297, ip_off=0
IP:  	ip_ttl=30, ip_sum=bec4, ip_p = 17 (UDP)
UDP: 	< source port=68(bootpc), < destination port=67(bootps) >
UDP: 	[ udp length = 556 | udp checksum = d4c1 ]
UDP: 00000000     01010600 7906a91d 00060000 00000000     |....y...........|
UDP: 00000010     00000000 00000000 00000000 08005a92     |..............Z.|
UDP: 00000020     e6ec0000 00000000 00000000 00000000     |................|
UDP: 00000030     00000000 00000000 00000000 00000000     |................|
UDP: ********
UDP: 000000e0     00000000 00000000 00000000 63825363     |............c.Sc|
UDP: 000000f0     3501013d 0d006e69 6d6d6173 7465725f     |5..=..nimmaster_|
UDP: 00000100     656e0c0c 6e696d6d 61737465 725f656e     |en..nimmaster_en|
UDP: 00000110     13010014 01001b01 001d0100 1e01001f     |................|
UDP: 00000120     01002201 00240100 270100ff 00000000     |.."..$..'.......|
UDP: 00000130     00000000 00000000 00000000 00000000     |................|
UDP: ********
UDP: 00000220     00000000                                |....            |

Der gute IP-Trace printet hier nochmal den Hex Dump der UDP Payload, das ist wahrscheinlich ein Bug. Das ist in den anderen Paketen gekürzt.
Der Server hat seine Datenbank gecheckt und möchte dem Client diese Adresse bieten. Er macht zuerst einen ARP auf die Adresse, um festzustellen, ob sie wirklich frei ist (Sie könnte ja an seiner Datenbank vorbei belegt worden sein).


Packet Number 2
ETH: ====( 60 bytes transmitted on interface en0 )==== 17:12:40.236641384
ETH: 00000000     ffffffff ffff0800 5af8b5b6 08060001     |........Z.......|
ETH: 00000010     08000604 00010800 5af8b5b6 c0a88c03     |........Z.......|
ETH: 00000020     00000000 0000c0a8 8c010000 00000000     |................|
ETH: 00000030     00000000 00000000 00000000              |............    |
ETH:    [ 08:00:5a:f8:b5:b6 -> ff:ff:ff:ff:ff:ff ]  type 806  (ARP)
ARP: hardware address format = 1 (ethernet)
ARP: protocol address format = 800 (IP)
ARP: address lengths ; hardware = 6, protocol = 4
ARP: arp operation = 1 (request)
ARP: source addresses: hw [08:00:5a:f8:b5:b6]
ARP: 		 protocol [192.168.140.3]
ARP: target addresses: hw [00:00:00:00:00:00]
ARP: 		 protocol [192.168.140.1]

Hier kommt das DHCPOFFER. Der Server kann und darf dem Client eine Adresse anbieten.


Packet Number 3
ETH: ====( 342 bytes transmitted on interface en0 )==== 17:12:43.242104392
ETH: 00000000     08005a92 e6ec0800 5af8b5b6 08004500     |..Z.....Z.....E.|
ETH: 00000010     01480aa9 00001e11 f7a6c0a8 8c03c0a8     |.H..............|
ETH: 00000020     8c010043 00440134 ed340201 06007906     |...C.D.4.4....y.|
ETH: 00000030     a91d0000 00000000 0000c0a8 8c010000     |................|
ETH: 00000040     00000000 00000800 5a92e6ec 00000000     |........Z.......|
ETH: 00000050     00000000 00000000 00000000 00000000     |................|
ETH: ********
ETH: 00000110     00000000 00006382 53633501 023604c0     |......c.Sc5..6..|
ETH: 00000120     a88c0301 04ffffff 000c0c6e 696d6d61     |...........nimma|
ETH: 00000130     73746572 5f656e33 040003f4 80ff0000     |ster_en3........|
ETH: 00000140     00000000 00000000 00000000 00000000     |................|
ETH: 00000150     00000000 0000                           |......          |
ETH:    [ 08:00:5a:f8:b5:b6 -> 08:00:5a:92:e6:ec ]  type 800  (IP)
IP:  	< SRC =   192.168.140.3 >
IP:  	< DST =   192.168.140.1 >
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=328, ip_id=2729, ip_off=0
IP:  	ip_ttl=30, ip_sum=f7a6, ip_p = 17 (UDP)
UDP: 	< source port=67(bootps), < destination port=68(bootpc) >
UDP: 	[ udp length = 308 | udp checksum = ed34 ]

Der Client kann ein paar Angebote/Adressen abwarten, sich die Beste aussuchen, und dann diese "requesten". Das ist wieder ein Broadcast, damit eventuelle weitere Server, die beteiligt waren, ihre Bemühungen einstellen können.


Packet Number 4
ETH: ====( 590 bytes received on interface en0 )==== 17:12:44.397189937
ETH: 00000000     ffffffff ffff0800 5a92e6ec 08004500     |........Z.....E.|
ETH: 00000010     0240dbea 00001e11 bec30000 0000ffff     |.@..............|
ETH: 00000020     ffff0044 0043022c c3820101 06003699     |...D.C.,......6.|
ETH: 00000030     9bc80006 00000000 00000000 00000000     |................|
ETH: 00000040     00000000 00000800 5a92e6ec 00000000     |........Z.......|
ETH: 00000050     00000000 00000000 00000000 00000000     |................|
ETH: ********
ETH: 00000110     00000000 00006382 53633501 033204c0     |......c.Sc5..2..|
ETH: 00000120     a88c0136 04c0a88c 033d0d00 6e696d6d     |...6.....=..nimm|
ETH: 00000130     61737465 725f656e 0c0c6e69 6d6d6173     |aster_en..nimmas|
ETH: 00000140     7465725f 656e1301 00140100 1b01001d     |ter_en..........|
ETH: 00000150     01001e01 001f0100 22010024 01002701     |........"..$..'.|
ETH: 00000160     00ff0000 00000000 00000000 00000000     |................|
ETH: 00000170     00000000 00000000 00000000 00000000     |................|
ETH: ********
ETH: 00000240     00000000 00000000 00000000 0000         |..............  |
ETH:    [ 08:00:5a:92:e6:ec -> ff:ff:ff:ff:ff:ff ]  type 800  (IP)
IP:  	< SRC =         0.0.0.0 >
IP:  	< DST = 255.255.255.255 >
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=576, ip_id=56298, ip_off=0
IP:  	ip_ttl=30, ip_sum=bec3, ip_p = 17 (UDP)
UDP: 	< source port=68(bootpc), < destination port=67(bootps) >
UDP: 	[ udp length = 556 | udp checksum = c382 ]

Der Server hat den Request gesehen, hat sein eigenes Angebot erkannt, prüft nochmal, ob es noch gilt, und versendet dann ein Acknowledgement.


Packet Number 5
ETH: ====( 342 bytes transmitted on interface en0 )==== 17:12:44.408482623
ETH: 00000000     08005a92 e6ec0800 5af8b5b6 08004500     |..Z.....Z.....E.|
ETH: 00000010     01480abd 00001e11 f792c0a8 8c03c0a8     |.H..............|
ETH: 00000020     8c010043 00440134 39f70201 06003699     |...C.D.49.....6.|
ETH: 00000030     9bc80000 00000000 0000c0a8 8c010000     |................|
ETH: 00000040     00000000 00000800 5a92e6ec 00000000     |........Z.......|
ETH: 00000050     00000000 00000000 00000000 00000000     |................|
ETH: ********
ETH: 00000110     00000000 00006382 53633501 053604c0     |......c.Sc5..6..|
ETH: 00000120     a88c0301 04ffffff 000c0c6e 696d6d61     |...........nimma|
ETH: 00000130     73746572 5f656e33 040003f4 80ff0000     |ster_en3........|
ETH: 00000140     00000000 00000000 00000000 00000000     |................|
ETH: 00000150     00000000 0000                           |......          |
ETH:    [ 08:00:5a:f8:b5:b6 -> 08:00:5a:92:e6:ec ]  type 800  (IP)
IP:  	< SRC =   192.168.140.3 >
IP:  	< DST =   192.168.140.1 >
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=328, ip_id=2749, ip_off=0
IP:  	ip_ttl=30, ip_sum=f792, ip_p = 17 (UDP)
UDP: 	< source port=67(bootps), < destination port=68(bootpc) >
UDP: 	[ udp length = 308 | udp checksum = 39f7 ]

Jetzt Konfiguriert der Client sein Interface mit der neuen Adresse. Es ist eine Maschine, auf der AIX 4.3.3 läuft. Daher macht sie ein "Gratuitous ARP", eine Anfrage nach der eigenen MAC. Damit können doppelte IP-Adressen erkannt werden und es wird die neue MAC im Netz bekannt.


Packet Number 6
ETH: ====( 60 bytes received on interface en0 )==== 17:12:44.648629709
ETH: 00000000     ffffffff ffff0800 5a92e6ec 08060001     |........Z.......|
ETH: 00000010     08000604 00010800 5a92e6ec c0a88c01     |........Z.......|
ETH: 00000020     00000000 0000c0a8 8c010000 00000000     |................|
ETH: 00000030     00000000 00000000 00000000              |............    |
ETH:    [ 08:00:5a:92:e6:ec -> ff:ff:ff:ff:ff:ff ]  type 806  (ARP)
ARP: hardware address format = 1 (ethernet)
ARP: protocol address format = 800 (IP)
ARP: address lengths ; hardware = 6, protocol = 4
ARP: arp operation = 1 (request)
ARP: source addresses: hw [08:00:5a:92:e6:ec]
ARP: 		 protocol [192.168.140.1]
ARP: target addresses: hw [00:00:00:00:00:00]
ARP: 		 protocol [192.168.140.1]

Und nochmal..


Packet Number 7
ETH: ====( 60 bytes received on interface en0 )==== 17:12:44.721682620
ETH: 00000000     ffffffff ffff0800 5a92e6ec 08060001     |........Z.......|
ETH: 00000010     08000604 00010800 5a92e6ec c0a88c01     |........Z.......|
ETH: 00000020     00000000 0000c0a8 8c010000 00000000     |................|
ETH: 00000030     00000000 00000000 00000000              |............    |
ETH:    [ 08:00:5a:92:e6:ec -> ff:ff:ff:ff:ff:ff ]  type 806  (ARP)
ARP: hardware address format = 1 (ethernet)
ARP: protocol address format = 800 (IP)
ARP: address lengths ; hardware = 6, protocol = 4
ARP: arp operation = 1 (request)
ARP: source addresses: hw [08:00:5a:92:e6:ec]
ARP: 		 protocol [192.168.140.1]
ARP: target addresses: hw [00:00:00:00:00:00]
ARP: 		 protocol [192.168.140.1]

Und das wars ....


[ Main | Local ]

[ 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
Feedback bitte an: Orm Hager (orm@doc-tcpip.org )