# TFTP

TFTP son las siglas de Trivial file transfer Protocol (Protocolo de transferencia de archivos trivial).
Es un protocolo de transferencia muy simple semejante a una versión básica de FTP. TFTP a menudo se utiliza para transferir pequeños archivos entre computadoras en una red, como cuando un terminal X Window o cualquier otro cliente ligero arranca desde un servidor de red. Surgió a principios de la década de los 80, por lo que no es precisamente un protocolo reciente, sirve para regular la transferencia de archivos entre un cliente y un servidor; destaca especialmente por ser sencillo y simple, por lo que a diferencia de otros protocolos no cuenta con funciones complejas de transferencia.
Algunos detalles del TFTP:
* Utiliza UDP (en el puerto 69) como protocolo de transporte (a diferencia de FTP que utiliza los puertos 20 y 21 TCP).
* No puede listar el contenido de los directorios.
* No existen mecanismos de autenticación o cifrado.
* Se utiliza para leer o escribir archivos de un servidor remoto.
* Soporta tres modos diferentes de transferencia, "netascii", "octet" y "mail", de los que los dos primeros corresponden a los modos "ascii" e "imagen" (binario) del protocolo FTP.

## Funcionamiento

Utiliza generalmente el puerto UDP 69 para realizar la transferencia de archivos, aunque esto lo pueden cambiar el emisor y receptor. Esta es una diferencia importante respecto a FTP, que utiliza TCP para la transferencia de archivos y en este caso sí es seguro. La transferencia se realiza bloque a bloque, el servidor no envía un nuevo bloque hasta que reciba el paquete de confirmación del bloque anterior. El paquete de datos final se identifica por ser más pequeño del tamaño establecido. Si un paquete se pierde se generará un timeout, tras el que se efectuará la retransmisión del último paquete. De esta manera, el emisor del paquete perdido sabrá que tiene que retransmitir dicho paquete. Cualquier error que ocurra al transferir archivos mediante TFTP da lugar a paquetes de error que en la mayoría de los casos causan la finalización de la transferencia.

## Posibles causas de error

* No es posible aceptar una solicitud de transferencia: por ejemplo, porque el archivo no se ha podido encontrar, el usuario no existe o se ha producido una violación de permisos (archivo protegido, etc.).
* Los clientes o servidores reciben un paquete que no se puede explicar por un retraso o duplicación en la red: por ejemplo, de paquetes con formato incorrecto.
* Se pierde el acceso a un recurso necesario: por ejemplo, si no hay espacio en el disco duro.

## Detalles de una sesión TFTP

Ya que TFTP utiliza UDP, no hay una definición formal de sesión, cliente y servidor, aunque se considera servidor a aquel que abre el puerto 69 en modo UDP, y cliente a quien se conecta.
Sin embargo, cada archivo transferido vía TFTP constituye un intercambio independiente de paquetes, y existe una relación cliente-servidor informal entre la máquina que inicia la comunicación y la que responde.
* La máquina A, que inicia la comunicación, envía un paquete RRQ (read request/petición de lectura) o WRQ (write request/petición de escritura) a la máquina B, conteniendo el nombre del archivo y el modo de transferencia.
* B responde con un paquete ACK (acknowledgement/confirmación), que también sirve para informar a A del puerto de la máquina B al que tendrá que enviar los paquetes restantes.
* La máquina origen envía paquetes de datos numerados a la máquina destino, todos excepto el último conteniendo 512 bytes de datos. La máquina destino responde con paquetes ACK numerados para todos los paquetes de datos.
* El paquete de datos final debe contener menos de 512 bytes de datos para indicar que es el último. Si el tamaño del archivo transferido es un múltiplo exacto de 512 bytes, el origen envía un paquete final que contiene 0 bytes de datos.

## Estándares IETF

| RFC Number | Title | Published | Author | Obsolete and Update Information |
| RFC 783 | The TFTP Protocol (Revision 1) | June 1981 | K. Sollins | Obsoleted by - RFC 1350 |
| RFC 906 | Bootstrap Loading using TFTP | June 1984 | Ross Finlayson | - |
| RFC 951 | Bootstrap Protocol | Sep.1985 | Bill Croft | Updated by RFC 1395, RFC 1497, RFC 1532, RFC 1542, RFC 5494 |
| RFC 1350 | The TFTP Protocol (Revision 2) | July 1992 | K. Sollins | Updated by RFC 1782, RFC 1783, RFC 1784, RFC 1785, RFC 2347, RFC 2348, RFC 2349 |
| RFC 1782 | TFTP Option Extension | March 1995 | G. Malkin | Obsoleted by - RFC 2347 |
| RFC 2131 | Dynamic Host Configuration Protocol | March 1997 | R. Droms | Updated by RFC 3396, RFC 4361, RFC 5494, RFC 6842 |
| RFC 2347 | TFTP Option Extension | May 1998 | G. Malkin | - |
| RFC 2348 | TFTP Blocksize Option | May 1998 | G. Malkin | - |
| RFC 2349 | TFTP Timeout Interval and Transfer Size Options | May 1998 | G. Malkin | - |
| RFC 5505 | Principles of Internet Host Configuration | May 2009 | B. Aboba | - |
| RFC 7440 | TFTP Windowsize Option | Jan 2015 | P. Masotta | - |