Xmodem
# Xmodem

XMODEM es el protocolo de transferencia de archivos más antiguo, desarrollado en 1977 por Ward Christensen a modo de apaño rápido para utilizarse con su programa de terminal MODEM.ASM, y posteriormente cedido para su uso público, por lo cual este protocolo también es conocido como “protocolo Christensen”. Se trata de un protocolo de transferencia muy sencillo de implementar que gracias a ello alcanzó gran popularidad. Actualmente, la mayoría de los módems soportan aun este protocolo.

Chuck Forsberg recopiló una serie de modificaciones comunes para su propio protocolo YMODEM, pero una deficiente implementación provocó una mayor fractura antes de la reunificación de los dos en el nuevo protocolo ZMODEM. Este último protocolo se volvió muy popular, pero nunca consiguió reemplazar por completo al protocolo XMODEM en el mercado BBS.

## Funcionamiento

XMODEM, como la mayoría de los protocolos de transferencia, comienza partiendo los datos originales en una serie de paquetes que son enviados al receptor, cada paquete contiene una información adicional que le permite al receptor determinar la correcta recepción de los mismos.

### Formato de los paquetes

Cada bloque de datos tiene un tamaño de 128 bytes, a los cuales hay que sumarle los siguientes campos anteriores a los datos:

* Un primer byte que es el carácter SOH (comienzo de cabecera), correspondiente al valor ASCII 1.
* Otro byte con la posición del paquete dentro del mensaje original y otro byte más con la misma posición pero en complemento a uno para comprobar su exactitud.

Y los siguientes campos posteriores a los datos:

* Un byte de checksum (en módulo 256) para el control de errores de los datos del paquete.

## Transferencia

Los paquetes son enviados de uno en uno. Cuando son recibidos, lo primero que hace el protocolo es comprobar la integridad de los datos mediante el byte checksum, y a continuación el número de bloque dentro del mensaje. Si esto es correcto, el receptor envía una señal “ACK” al emisor para que proceda con el envío del siguiente paquete de la secuencia. Si el paquete estuviera corrupto, el receptor enviaría una señal “NAK” para que se procediera al reenvío de ese paquete.

