# Xmodem

Xmodem est un protocole de transfert de fichier développé par Ward Christensen et fut le plus populaire pour le réseau téléphonique commuté, c'est-à-dire entre modems.
Xmodem utilise des paquets de 128 octets avec détection d’erreur, permettant au receveur de demander la retransmission du paquet corrompu. Xmodem est assez lent mais fiable.
Xmodem, comme la plupart des protocoles de transfert de fichier, découpe les données à envoyer en une série de paquets qui sont envoyés au destinataire, enrichie d'informations additionnelles permettant au destinataire de déterminer si le paquet a été correctement reçu.

## Structure d'un paquet

Le protocole XMODEM original utilise un paquet de données de 128 octets, la taille d'un bloc de fichier pour le système CP/M. Le paquet est précédé par un en-tête de 3 octets : le caractère ASCII SOH (valeur décimal 1), un "numéro de bloc" de 0 à 255 et le complémentaire du numéro de bloc (255 - numéro de bloc). Les numéros de bloc commencent à 1 pour le premier bloc envoyé et non 0. Le paquet est également suivi par un octet de checksum des octets de données. Cet octet est égal à la somme des données du paquet sur 8 bits. Le paquet complet a ainsi une longueur de 132 octets, comprenant 128 octets de charge utile.
Le transfert du fichier est marqué comme terminé avec l'envoi du caractère ASCII EOT après le dernier bloc. Ce caractère ne fait partie d'aucun paquet, mais envoyé seul. Puisque la longueur du fichier n'était pas indiqué dans le protocole, le dernier paquet envoyé était complété par un « caractère connu » qui était supprimé. Dans la spécification originale, ce caractère était l'ASCII SUB, également utilisé par CP/M comme marqueur de fin de fichier dans son format de fichier. Le standard indiquait que n'importe quel caractère pouvait être utilisé, mais l'émetteur et le destinataire devait se mettre d'accord.

## Détail du transfert

Les fichiers sont transférés paquet par paquet. Quand le paquet est reçu, le destinataire calcule la somme de contrôle des données et la compare à l'octet de contrôle. Si les deux correspondent, le destinataire envoie l'ASCII ACK à l'émetteur, qui peut alors émettre le prochain paquet. S'il y a un problème, le destinataire envoie dans ce cas l'ASCII NAK. Sur réception de ce caractère, l'émetteur va alors renvoyer le paquet mal transmis, et peut essayer plusieurs fois, normalement 10 fois, avant d'interrompre le transfert.
Un NAK était également envoyé si le destinataire ne recevait pas un paquet valide pendant dix secondes, alors qu'il attend toujours des données en l'absence du caractère de fin de fichier. Un time-out de 7 secondes est également observé pendant la transmission d'un paquet afin de détecter une coupure de la connexion.
Les numéros de blocs sont aussi vérifiés comme un moyen simple de vérifier les erreurs. Après la réception correcte d'un paquet, le paquet suivant devait avoir le numéro de bloc suivant (+1). Si un paquet avec le même numéro de bloc était reçu, il était considéré que l'émetteur n'avait pas reçu de confirmation et qu'il renvoie donc le même paquet.
Les transferts sont à l'initiative du destinataire, l'émetteur n'envoyant aucune donnée tant qu'il n'a pas reçu un NAK. Cela s'explique par la façon avec laquelle l'utilisateur interagissait avec la machine envoyant le fichier : l'utilisateur cherche le fichier sur la machine puis demande le transfert. Ensuite l'utilisateur doit exécuter une commande locale pour recevoir les données envoyées. Puisque ce délai entre la demande et l'exécution de la commande locale est inconnu, Xmodem attend jusqu'à 90 secondes que le destinataire demande l'envoi des paquets de données.