Rechnernetze
Home Nach oben

TFTP Trivial File Transfer Protocol

Trivial File Transfer Protocol (TFTP) ist eine einfaches Protokoll um Dateien zu übertragen. Es setzt auf UDP auf schließt aber die Verwendung anderer Transportprotokolle nicht aus. Es wird in RFC 1350 Standardisiert, wobei es weitere Standards zu speziellen Problemen wie Blockgröße, Timeouts oder Multicast-Optionen gibt. (RFC1782, RFC1783, RFC1784, RFC1785, RFC2347, RFC2348, RFC2349).

TFTP wurde bewusst einfach entworfen, um es klein zu halten und einfach zu implementieren zu können. Es kann im Prinzip nur Dateien (oder E-Mails) lesen und schreiben, kann jedoch keine Directorys auflisten und besitzt gegenwärtig keine Benutzerauthentifizierung. 

TFTP unterscheidet drei Übertragungsmodi, wobei der Mail-Mode jedoch nicht mehr implementiert werden sollte:

netascii: 8 Bit ASCII-Mode,
octet:8 Bit Daten,
mail: Empfänger ist Benutzer, nicht eine Datei.

Weitere Modi können von kooperierenden Hosts vereinbart werden.

Übersicht über das Protokoll

Jede Übertragung beginnt mit einer Aufforderung, eine Datei zu lesen oder zu schreiben, welches zugleich eine Verbindungsaufnahme erfordert. Wenn der Server die Anforderung zulässt, wird die Verbindung aufgebaut und die Datei in Blöcken von 512 Bytes übertragen. Wird ein Datenblock kleinerer Größe übertragen, so wird damit dem Empfänger mitgeteilt, dass die Übertragung beendet ist. Jedes Paket muss quittiert werden, ehe das nächste gesendet werden kann, so dass ein Send-and-Wait-ARQ-Verfahren verwendet wird. Ein Timer sorgt dafür, dass nicht rechtzeitig quittierte Pakete noch einmal gesendet werden können. Dabei sendet der Empfänger nur Quittungen, der Sender nur Datenpakete. 

Bei Fehlern wird die Verbindung zumeist abgebrochen. Ein Fehler wird durch ein Fehlerpaket signalisiert. Dieses Paket wird weder quittiert noch erneut gesendet. Fehler werden durch drei Ereignisse ausgelöst:

Anfrage kann nicht erfüllt werden (z.B. Datei existiert nicht, Recht nicht vorhanden, oder Benutzer existiert nicht).
Eingang eines Pakets, welches weder als verzögertes Paket noch als dupliziertes Paket interpretiert werden kann,
Verlust des Zugriffs auf eine notwendige Ressource, z.B. Platte voll oder Zugriff während der Übertragung unterbunden.

Ein weiterer Fehlertyp wird von TFTP mit Senden eines Fehlerpakets und nicht mit Abbruch der Verbindung beantwortet:

Empfangenes Datagramm enthält falschen Quellport.

Das Protokoll ist zur Vereinfachung der Implementierung sehr restriktiv gehalten. So machen die festen Blocklängen die Speicherallokation sehr einfach und das Sende-und-Warte-ARQ vermeidet Flusskontrolle und die Umordnung eintreffender Pakete.

Paketformat und Protokoll

TFTP wird als Datenteil in UDP übertragen. TFTP besteht aus einem 2-Byte-Header und einem entsprechenden Datenteil.

Aufbau eines TFTP-Pakets

Es gibt fünf Pakettypen, die durch ein zwei Byte langes Feld gekennzeichnet werden:

Lese- und Schreibanforderungen benötigen als zusätzliche Angabe den Dateinamen sowie die Angabe des Modes (d.h. netascii, octett oder mail). 

Datenblöcke werden durchnummeriert, beginnend bei 1. 

Die Quittungen tragen als Bestätigung die Nummer des jeweiligen Datenblocks, welchen sie bestätigen. Die erste Quittung auf eine Schreibanforderung trägt die Nummer null.

Fehler zeigen einen Fehlerzustand an. Es gibt die Fehlercodes:

Wert 

Bedeutung

0 Nicht definiert. Siehe Fehlermeldung, falls vorhanden.
1 Datei nicht gefunden.
2 Zugriffsschutzverletzung.
3 Platte voll oder Plattenquote ausgeschöpft.
4 Illegale TFTP-Operation.
5 Unbekannte Übertragungs-ID
6 Datei existiert bereits.
7 User nicht bekannt.

Verbindungsaufbau

Ein TFTP-Server "lauscht" auf dem Port 69. Ein TFTP-Client wählt zufällig eine Übertragungs-ID (TID=Transfer ID) TIDC und sendet diese als Quellport im UDP-Datagramm an den Zielport 69 des Server-Hosts. Der TFTP-Prozess beantwortet diese Anfrage mit einer zufällig gewählten TIDS, und sendet dieses UDP-Datagramm an den Client-Host mit der Ziel-Portnummer TIDC und der Quell-Portnummer TIDS. Im folgenden werde diese Ports von Client und Server für die Kommunikation verwendet, so dass der Port 69 wieder frei ist.

Zum Aufbau einer Verbindung sendet der Client eine Lese- oder Schreibanforderung an den Server, welche diese mit einer Quittung bei WRQ (write request) oder dem ersten Datenpaket bei RRQ (read request) beantwortet. Eine Fehlermeldung lehnt den Verbindungswunsch ab. Der Server verwendet jetzt nur noch Datagramme mit der Quell-/Zielportnummer TIDS,TIDC, der Client mit der Quell-/Zielportnummer: IDC,TIDS. Trifft ein TFTP-Datagramm auf einem Ziel-Port ein und stimmt der Quellport nicht überein, so wird das Paket verworfen und an den fehlerhaften Quellport eine Fehlermeldung geschickt. Die Verbindung bleibt bestehen. Ansonsten wird nach dem Absenden einer Fehlermeldung die Verbindung abgebrochen.

Datenübertragung

Jedes Datenpaket wird mit einer Quittung mit der gleichen Blocknummer beantwortet; jede Quittung wird mit einem Datenpaket mit der nächsten Blocknummer beantwortet, da erst nach dem Eintreffen der Quittung für Datenpaket n das Datenpaket n+1 gesendet werden darf. Diese gilt nur für Datenpakete mit der nächsten Blocknummer bzw. Quittungspakete mit der nächsten Blocknummer; duplizierte Pakete werden als noch beantwortet. Außerdem kann jedes Paket mit einem Fehlerpaket beantwortet werden, z.B. wenn der Speicherplatz nicht mehr ausreicht. 

Wird ein Datenpaket mit weniger als 512 Bytes Nutzdaten empfangen, so wird dieses quittiert. Der Empfänger sollte jetzt warten, falls der Absender ein weiteres Mal das letzte Paket sendet, weil er evtl. die Quittung nicht erhalten hat. In diesem Fall wird die Quittung ein weiteres Mal gesendet. Nach einer gewissen Zeit kann der Empfänger dann die Verbindung beenden.

Tritt ein Fehler auf, so wird eine Fehlermeldung gesendet und die Verbindung sofort beendet.