orm@doc-tcpip.org

Erstellt: November 2000 - Letzte Modifikation: September 2003

[ Main | Local ]


Trace des NFS Umount

Wie RPC funktioniert

Einführung

Dieser IP-Trace ist das Ende der Verbindung, die auf der Mount-Seite geöffnet wurde. Der User auf der Clientseite setzt das umount-Kommando gegen das gemountete Verzeichnis ab. Darauf werden folgende Pakete bzw. RPCs ausgetauscht.

Der Trace

 
Packet Number 1
TCP: 	th_off=6, flags< SYN >
Packet Number 2
TCP: 	th_off=6, flags< SYN | ACK >
Packet Number 3
TCP: 	th_off=5, flags< ACK >

Das TCP Handshake habe ich gekürzt.

 
Packet Number 4
ETH: ====( 194 bytes received on interface en0 )==== 10:05:42.358729384
ETH:    [ 08:00:5a:93:bc:ea -> 08:00:5a:ba:da:a6 ]  type 800  (IP)
IP:  	< SRC =      172.16.1.3 >  (nfsclient)
IP:  	< DST =      172.16.1.2 >  (nfsserver)
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=180, ip_id=40665, ip_off=0
IP:  	ip_ttl=60, ip_sum=8545, ip_p = 6 (TCP)
TCP: 	< source port=32782, destination port=2049(shilp) >
TCP: 	th_seq=2627c0ec, th_ack=78875282
TCP: 	th_off=5, flags
TCP: 	th_win=60000, th_sum=e49d, th_urp=0
RPC: Record Marker: Size = 136, Last Fragment     (0x80000088)
RPC: **CALL**	XID=993839065
RPC: Program=100003 (NFS_PROGRAM) Version=3 Procedure=4 (NFSPROC3_ACCESS)
RPC: AUTH_UNIX 
RPC: Cred:
RPC: 	Time=0x3f5649b7 (Wed Sep  3 22:06:15 2003)
RPC: 	Machine=nfsclient Uid=0 Gid=0 Group List Length=7 
RPC: 	Groups= ( 0 2 3 7 8 10 11 )
NFS: Fhandle:
NFS:           000a0004 00000003 000a0000 04661f82
NFS:           1d020000 000a0000 04661f82 1d020000
NFS: Access: (0002) LOOKUP 

Auf dem Client hat der Root-User einen Umount gegen das per NFS gemountete Filesystem abgesetzt. Das clientseitige NFS prüft jetzt ersteinmal, ob noch Zugang und Berechtigung besteht. Dazu dient die Prozedur NFSPROC3_ACCESS. Mit einer Bit-Maske wird die zu prüfende Berechtigung dem Server mit dem Filehandle übermittelt (LOOKUP). Folgende Zugriffsarten sind möglich; die damit an den Server gestellte Frage lautet immmer Darf ich:

 
Packet Number 5
ETH: ====( 178 bytes transmitted on interface en0 )==== 10:05:42.360152194
ETH:    [ 08:00:5a:ba:da:a6 -> 08:00:5a:93:bc:ea ]  type 800  (IP)
IP:  	< SRC =      172.16.1.2 >  (nfsserver)
IP:  	< DST =      172.16.1.3 >  (nfsclient)
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=164, ip_id=24496, ip_off=0
IP:  	ip_ttl=60, ip_sum=c47e, ip_p = 6 (TCP)
TCP: 	< source port=2049(shilp), destination port=32782 >
TCP: 	th_seq=78875282, th_ack=2627c178
TCP: 	th_off=5, flags
TCP: 	th_win=61180, th_sum=8ec0, th_urp=0
RPC: Record Marker: Size = 120, Last Fragment     (0x80000078)
RPC: **REPLY**	XID=993839065
RPC: 100003(NFS_PROGRAM) 4(NFSPROC3_ACCESS)
RPC: Reply Stat: MSG_ACCEPTED
RPC: Accepted Reply Stat:  SUCCESS 
NFS: Stat: (0) NFS3_OK 
NFS: File Attributes:
NFS: 	Type=2(NFDIR) Mode=240755 Nlink=2 Uid=0 Gid=0 Rdev=(0,1535)
NFS: 	Size=512 Used=4096
NFS: 	Fsid=655364 Fileid=1126
NFS: 	Access Time: Sec=1061817176 Nsec=284071923
NFS: 	Modify Time: Sec=1046945738 Nsec=252802649
NFS: 	Create Time: Sec=1046945738 Nsec=252802650
NFS: Access: (0002) LOOKUP 

Der Server antwortet mit den allgemeinen Angaben zu diesem File (hier ein Verzeichnis) und wiederholt die Anfrage zur Berechtigung, wenn es in Ordnung ist. Die letzte Zeile bedeutet also: Du darfst im referenzierten Verzeichnis Einträge nachsehen (LOOKUP).

 
Packet Number 6
TCP: 	th_off=5, flags< ACK >

Ein ACK dafür.

 
Packet Number 7
ETH: ====( 194 bytes received on interface en0 )==== 10:05:46.719276412
ETH:    [ 08:00:5a:93:bc:ea -> 08:00:5a:ba:da:a6 ]  type 800  (IP)
IP:  	< SRC =      172.16.1.3 >  (nfsclient)
IP:  	< DST =      172.16.1.2 >  (nfsserver)
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=180, ip_id=40671, ip_off=0
IP:  	ip_ttl=60, ip_sum=853f, ip_p = 6 (TCP)
TCP: 	< source port=32782, destination port=2049(shilp) >
TCP: 	th_seq=2627c178, th_ack=788752fe
TCP: 	th_off=5, flags
TCP: 	th_win=60000, th_sum=e391, th_urp=0
RPC: Record Marker: Size = 136, Last Fragment     (0x80000088)
RPC: **CALL**	XID=993839066
RPC: Program=100003 (NFS_PROGRAM) Version=3 Procedure=4 (NFSPROC3_ACCESS)
RPC: AUTH_UNIX 
RPC: Cred:
RPC: 	Time=0x3f5649bb (Wed Sep  3 22:06:19 2003)
RPC: 	Machine=nfsclient Uid=0 Gid=0 Group List Length=7 
RPC: 	Groups= ( 0 2 3 7 8 10 11 )
NFS: Fhandle:
NFS:           000a0004 00000003 000a0000 04661f82
NFS:           1d020000 000a0000 04661f82 1d020000
NFS: Access: (0001) READ 

Wenig später möchte der Client dann noch wissen, ob er auch Daten lesen darf in diesem Verzeichnis. Warum er dafür fast 4 Sekunden braucht, ist mir unklar.

 
Packet Number 8
ETH: ====( 178 bytes transmitted on interface en0 )==== 10:05:46.719851465
ETH:    [ 08:00:5a:ba:da:a6 -> 08:00:5a:93:bc:ea ]  type 800  (IP)
IP:  	< SRC =      172.16.1.2 >  (nfsserver)
IP:  	< DST =      172.16.1.3 >  (nfsclient)
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=164, ip_id=24497, ip_off=0
IP:  	ip_ttl=60, ip_sum=c47d, ip_p = 6 (TCP)
TCP: 	< source port=2049(shilp), destination port=32782 >
TCP: 	th_seq=788752fe, th_ack=2627c204
TCP: 	th_off=5, flags
TCP: 	th_win=61040, th_sum=8e44, th_urp=0
RPC: Record Marker: Size = 120, Last Fragment     (0x80000078)
RPC: **REPLY**	XID=993839066
RPC: 100003(NFS_PROGRAM) 4(NFSPROC3_ACCESS)
RPC: Reply Stat: MSG_ACCEPTED
RPC: Accepted Reply Stat:  SUCCESS 
NFS: Stat: (0) NFS3_OK 
NFS: File Attributes:
NFS: 	Type=2(NFDIR) Mode=240755 Nlink=2 Uid=0 Gid=0 Rdev=(0,1535)
NFS: 	Size=512 Used=4096
NFS: 	Fsid=655364 Fileid=1126
NFS: 	Access Time: Sec=1061817176 Nsec=284071923
NFS: 	Modify Time: Sec=1046945738 Nsec=252802649
NFS: 	Create Time: Sec=1046945738 Nsec=252802650
NFS: Access: (0001) READ 

Der Server antwortet, die Anfrage ist in Ordnung, der Client darf im referenzierten Verzeichnis Daten aus Files oder Einträgen lesen.

 
Packet Number 9
ETH: ====( 214 bytes received on interface en0 )==== 10:05:46.721434752
ETH:    [ 08:00:5a:93:bc:ea -> 08:00:5a:ba:da:a6 ]  type 800  (IP)
IP:  	< SRC =      172.16.1.3 >  (nfsclient)
IP:  	< DST =      172.16.1.2 >  (nfsserver)
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=200, ip_id=40672, ip_off=0
IP:  	ip_ttl=60, ip_sum=852a, ip_p = 6 (TCP)
TCP: 	< source port=32782, destination port=2049(shilp) >
TCP: 	th_seq=2627c204, th_ack=7887537a
TCP: 	th_off=5, flags
TCP: 	th_win=60000, th_sum=b254, th_urp=0
RPC: Record Marker: Size = 156, Last Fragment     (0x8000009c)
RPC: **CALL**	XID=993839067
RPC: Program=100003 (NFS_PROGRAM) Version=3 Procedure=17 (NFSPROC3_READDIRPLUS)
RPC: AUTH_UNIX 
RPC: Cred:
RPC: 	Time=0x3f5649bb (Wed Sep  3 22:06:19 2003)
RPC: 	Machine=nfsclient Uid=0 Gid=0 Group List Length=7 
RPC: 	Groups= ( 0 2 3 7 8 10 11 )
NFS: Fhandle:
NFS:           000a0004 00000003 000a0000 04661f82
NFS:           1d020000 000a0000 04661f82 1d020000
NFS: Cookie: 0 DirCount: 4096 MaxCount: 8192
NFS: Cookie Verifier:
NFS: 00000000     00000000 00000000                       |........        |

Jetzt setzt der Client eine in NFSv3 neue Prozedur ab, NFSPROC3_READDIRPLUS. In diesem Fall erhält der Client pro Eintrag im Verzeichnis den Namen, die FileID, Attribute und den Filehandle. Es wird auch ein Cookie angefordert, maximal 4096 Bytes an Verzeichnis-Information soll gesandt werden (da zählen Attribute und Filehandles nicht dazu). Die Antwort darf höchsten 8192 Byte groß sein, inklusive des Overhead durch RPC und XDR. Der Cookie ist in der ersten Anfrage auf Null gesetzt, da er ja vom Server erzeugt wird.

 
Packet Number 10
ETH: ====( 502 bytes transmitted on interface en0 )==== 10:05:46.756850829
ETH:    [ 08:00:5a:ba:da:a6 -> 08:00:5a:93:bc:ea ]  type 800  (IP)
IP:  	< SRC =      172.16.1.2 >  (nfsserver)
IP:  	< DST =      172.16.1.3 >  (nfsclient)
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=488, ip_id=24498, ip_off=0
IP:  	ip_ttl=60, ip_sum=c338, ip_p = 6 (TCP)
TCP: 	< source port=2049(shilp), destination port=32782 >
TCP: 	th_seq=7887537a, th_ack=2627c2a4
TCP: 	th_off=5, flags
TCP: 	th_win=60880, th_sum=715c, th_urp=0
RPC: Record Marker: Size = 444, Last Fragment     (0x800001bc)
RPC: **REPLY**	XID=993839067
RPC: 100003(NFS_PROGRAM) 17(NFSPROC3_READDIRPLUS)
RPC: Reply Stat: MSG_ACCEPTED
RPC: Accepted Reply Stat:  SUCCESS 
NFS: Stat: (0) NFS3_OK 
NFS: Directory Attributes:
NFS: ------------------------------------------------
NFS: 	Type=2(NFDIR) Mode=240755 Nlink=2 Uid=0 Gid=0 Rdev=(0,1535)
NFS: 	Size=512 Used=4096
NFS: 	Fsid=655364 Fileid=1126
NFS: 	Access Time: Sec=1062662746 Nsec=753823787
NFS: 	Modify Time: Sec=1046945738 Nsec=252802649
NFS: 	Create Time: Sec=1046945738 Nsec=252802650
NFS: Cookie Verifier:
NFS: 00000000     00000000 00000000                       |........        |
NFS: ------------------------------------------------
NFS: EOF: (1) TRUE
NFS: Directory list:
NFS: ------------------------------------------------
NFS: File Name: .
NFS: FileId: 1126 Cookie: c
NFS: NFS: File Attributes:
NFS: 	Type=2(NFDIR) Mode=240755 Nlink=2 Uid=0 Gid=0 Rdev=(0,1535)
NFS: 	Size=512 Used=4096
NFS: 	Fsid=655364 Fileid=1126
NFS: 	Access Time: Sec=1062662746 Nsec=753823787
NFS: 	Modify Time: Sec=1046945738 Nsec=252802649
NFS: 	Create Time: Sec=1046945738 Nsec=252802650
NFS: Fhandle:
NFS:           000a0004 00000003 000a0000 04661f82
NFS:           1d020000 000a0000 04661f82 1d020000
NFS: ------------------------------------------------
NFS: File Name: ..
NFS: FileId: 2 Cookie: 200
NFS: NFS: File Attributes:
NFS: 	Type=2(NFDIR) Mode=240755 Nlink=21 Uid=0 Gid=0 Rdev=(0,11)
NFS: 	Size=1024 Used=4096
NFS: 	Fsid=655364 Fileid=2
NFS: 	Access Time: Sec=1062660142 Nsec=793821806
NFS: 	Modify Time: Sec=1062659310 Nsec=603811543
NFS: 	Create Time: Sec=1062659310 Nsec=603811543
NFS: Fhandle:
NFS:           000a0004 00000003 000a0000 00023e67
NFS:           083e0000 000a0000 04661f82 1d020000
NFS: ------------------------------------------------

Die Rückgabe des Servers listet alle Einträge im Verzeichnis mit Attributen und Filehandle auf. Jeder Eintrag hat einen Cookie. Dieses Verzeichnis ist leer, es sind nur die beiden Verzeichnisreferenzen . und .. vorhanden.

 
Packet Number 11
TCP: 	th_off=5, flags< ACK >

Der ACK des Client wg. langer Denkzeit.

 
Packet Number 12
ETH: ====( 98 bytes received on interface en0 )==== 10:06:29.056971696
ETH:    [ 08:00:5a:93:bc:ea -> 08:00:5a:ba:da:a6 ]  type 800  (IP)
IP:  	< SRC =      172.16.1.3 >  (nfsclient)
IP:  	< DST =      172.16.1.2 >  (nfsserver)
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=84, ip_id=40729, ip_off=0
IP:  	ip_ttl=30, ip_sum=a35a, ip_p = 17 (UDP)
UDP: 	< source port=736, destination port=111(sunrpc) >
UDP: 	[ udp length = 64 | udp checksum = e592 ]
RPC: **CALL**	XID=1062367155
RPC: Program=100000 (PMAPPROG) Version=2 Procedure=3 (PMAPPROC_GETPORT)
RPC: AUTH_NULL Opaque Authorization Base 0 Opaque Authorization Length 0
PMP: Prog=100005 Vers=1 Prot=17 Port=0

Jetzt fragt der Client den Portmapper des Servers nach dem Port des Service 100005, also der mountd. Das Ganze erfolgt über UDP.

 
Packet Number 13
ETH: ====( 70 bytes transmitted on interface en0 )==== 10:06:29.059025433
ETH:    [ 08:00:5a:ba:da:a6 -> 08:00:5a:93:bc:ea ]  type 800  (IP)
IP:  	< SRC =      172.16.1.2 >  (nfsserver)
IP:  	< DST =      172.16.1.3 >  (nfsclient)
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=56, ip_id=24499, ip_off=0
IP:  	ip_ttl=30, ip_sum=e2dc, ip_p = 17 (UDP)
UDP: 	< source port=111(sunrpc), destination port=736 >
UDP: 	[ udp length = 36 | udp checksum = 72c4 ]
RPC: **REPLY**	XID=1062367155
RPC: 100000(PMAPPROG) 3(PMAPPROC_GETPORT)
RPC: Reply Stat: MSG_ACCEPTED
RPC: Accepted Reply Stat:  SUCCESS 
PMP: Returning 32870

Der NFS-Server gibt den Port 32870 zurück.

 
Packet Number 14
ETH: ====( 154 bytes received on interface en0 )==== 10:06:29.060853877
ETH:    [ 08:00:5a:93:bc:ea -> 08:00:5a:ba:da:a6 ]  type 800  (IP)
IP:  	< SRC =      172.16.1.3 >  (nfsclient)
IP:  	< DST =      172.16.1.2 >  (nfsserver)
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=140, ip_id=40730, ip_off=0
IP:  	ip_ttl=30, ip_sum=a321, ip_p = 17 (UDP)
UDP: 	< source port=736, destination port=32870 >
UDP: 	[ udp length = 120 | udp checksum = 70c5 ]
RPC: **CALL**	XID=1062367142
RPC: Program=100005 (MOUNTPROG) Version=1 Procedure=3 (MOUNTPROC_UMNT)
RPC: AUTH_UNIX 
RPC: Cred:
RPC: 	Time=0x3f5649e6 (Wed Sep  3 22:07:02 2003)
RPC: 	Machine=nfsclient Uid=0 Gid=0 Group List Length=7 
RPC: 	Groups= ( 0 2 3 7 8 10 11 )
MNT: Path: /download

Jetzt kennt der Client den richtigen Port und sendet auch sofort einen RPC. Angefragt wird die Prozedur 3 des mountd, das ist MOUNTPROC_UMNT, also ein NFS-umount. Es werden die Credentials übermittelt und dann das abzuhängende Verzeichnis.

 
Packet Number 15
ETH: ====( 66 bytes transmitted on interface en0 )==== 10:06:29.067724991
ETH:    [ 08:00:5a:ba:da:a6 -> 08:00:5a:93:bc:ea ]  type 800  (IP)
IP:  	< SRC =      172.16.1.2 >  (nfsserver)
IP:  	< DST =      172.16.1.3 >  (nfsclient)
IP:  	ip_v=4, ip_hl=20, ip_tos=0, ip_len=52, ip_id=24501, ip_off=0
IP:  	ip_ttl=30, ip_sum=e2de, ip_p = 17 (UDP)
UDP: 	< source port=32870, destination port=736 >
UDP: 	[ udp length = 32 | udp checksum = 7348 ]
RPC: **REPLY**	XID=1062367142
RPC: 100005(MOUNTPROG) 3(MOUNTPROC_UMNT)
RPC: Reply Stat: MSG_ACCEPTED
RPC: Accepted Reply Stat:  SUCCESS 

Der Server antwortet gleich den Erfolg der Aktion. Das Filesystem ist jetzt abgehängt, die /etc/rmtab wird modifiziert (Clienteintrag ist modifiziert):

 
# cat /etc/rmtab
#fsclient:/download

 
++++++ END OF REPORT ++++++

processed 15 packets
Summary of RPC CALL packets
reqid=1062367142 prog=100005 vers=1 proc=3 caller=172.16.1.3
reqid=1062367155 prog=100000 vers=2 proc=3 caller=172.16.1.3
reqid=993839067 prog=100003 vers=3 proc=17 caller=172.16.1.3
reqid=993839066 prog=100003 vers=3 proc=4 caller=172.16.1.3
reqid=993839065 prog=100003 vers=3 proc=4 caller=172.16.1.3

Und die Liste der RPCs zur Vollständigkeit.


[ 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 )