# Trivial File Transfer Protocol

Trivial File Transfer Protocol, afgekort TFTP, is een eenvoudig bestandsoverdrachtprotocol dat veel gebruikt wordt om computers vanaf een netwerk te starten. Als de TCP/IP-stack reeds draait, kan TFTP ook gebruikt worden om andere apparatuur zoals routers, switches, ADSL- en kabelmodems van firmware en configuraties te voorzien. TFTP werd voor het eerst gedefinieerd in 1980.
Door de eenvoud van dit protocol zijn clients en servers relatief eenvoudig te implementeren in kleine hoeveelheden geheugen. Het protocol vereist ook weinig bandbreedte, een noodzaak in omgevingen waar deze bronnen schaars zijn, zoals microcontrollers.

## Ontstaan

TFTP is gedeeltelijk gebaseerd op het eerder ontworpen protocol EFTP (Easy File Transfer Protocol) dat op zijn beurt deel uitmaakt van de PUP-protocolsuite. Tijdens het begin van de ontwikkeling van de TCP/IP-protocolsuite was TFTP meestal het eerste protocol dat werd geïmplementeerd vanwege zijn eenvoud. De originele versies van TFTP, vóór RFC1350, hadden een bijzonder zware protocolfout die Sorcerer's Apprentice Syndrome werd genoemd.
Recent is TFTP veel misbruikt door computerwormen zoals Blaster om zich te verspreiden en nieuwe hosts te infecteren.

## Technische informatie
### Eigenschappen

* Op een IP-netwerk maakt TFTP gebruik van UDP, een verbindingsloos protocol. Hiervoor wordt meestal poort 69 gebruikt als request-poort, voor de verdere afhandeling wordt een andere poort toegewezen. TFTP is echter volkomen onafhankelijk van het onderliggende protocol en kan ook zonder IP worden gebruikt, bijvoorbeeld over een RS-422-verbinding.
* TFTP wordt gebruikt om bestanden te schrijven naar en te lezen van een server.
* Drie verschillende overdrachtsmodi kunnen gebruikt worden: netascii (ASCII-modus), octet (binaire modus) en mail. De laatste hiervan wordt vrijwel niet meer gebruikt.
* Het originele protocol had een limiet van 32MB, dit werd echter uitgebreid met RFC2347 en RFC2348 in 1998, zodat een maximum van 4GB en zelfs meer bereikt kon worden.
* Het transport van elk afzonderlijk bestand gebeurt onafhankelijk. De overdracht is vastgelegd in een lock-stap, zodat er telkens maar één pakket onderweg is in het netwerk. Door dit gebrek aan windowing ontstaat er dan ook een lage doorvoersnelheid bij een hoge latency.
* Directory-structuren kunnen niet weergegeven worden.
* Er is geen authenticatie noch encryptie aanwezig, waardoor het onveilig is om via het internet te gebruiken. Daarom wordt TFTP alleen op private, lokale netwerken gebruikt.

### Werking

Het transporteren van data via TFTP gebeurt als volgt:
* De client verstuurt een RRQ- (read request) of een WRQ-pakket (write request) naar de server. Deze bevat de gewenste bestandsnaam en de overdrachtsmodus (netascii, octet of mail).
* De server antwoordt met behulp van een ACK-pakket (van ACKnowledge). Dit pakket informeert eveneens welke poort voor de overdracht is toegewezen, zodat de request-poort (meestal poort 69) vrij blijft. Als de overdracht niet mogelijk is, verstuurt de server een NACK-pakket (Negative ACKnowledge).
** Lezen (na RRQ): de server zendt genummerde datapakketten naar de client. Elk pakket (uitgezonderd het laatste) bevat een vol datablok. De client antwoordt met genummerde ACK-pakketten voor elk data pakket, een NACK-pakket als het UDP-pakket of het datablok beschadigd is. Als binnen de time-outperiode geen ACK-pakket wordt ontvangen of een NACK-pakket is verstuurd, verzendt de server het datablok nogmaals met dezelfde nummering. Dit wordt herhaald totdat ofwel de client reageert met een ACK-pakket ofwel een maximum aantal pogingen is ondernomen.
** Schrijven (na WRQ): in principe hetzelfde als lezen, maar hierbij zijn de rollen van client en server omgekeerd.
* Het laatste datapakket bevat geen vol datablok, om aan te duiden dat dit het laatste pakket is. Indien dit toch een vol datablok is, wordt er nog een leeg pakket verzonden om het einde van de data aan te geven.

## De belangrijkste RFC's

* RFC783, introductie
* RFC906, bootstrapping
* RFC1350, optie extensie.
* RFC1782 en RFC1783, extra opties.
* ↑ Dit hoeft geen bestandsnaam in de traditionele zin te zijn, in principe volstaat een eenduidige identifier.