XMODEM is a protocol for sending a file from one computer to another over a serial connection, typically a modem on a telephone line, while detecting and correcting the data corruption that noisy phone lines routinely introduce. Ward Christensen wrote it in August 1977 for his MODEM program, and in archived documentation that reproduces his original write-up he describes it candidly as a “quick hack” thrown together to solve his immediate need to move files reliably between machines. Because he released it into the public domain, it became the near-universal file-transfer method of the bulletin board era.
The protocol’s design is deliberately minimal. The sender breaks the file into blocks of 128 data bytes. Each block is transmitted as a small packet that begins with the control character SOH, value 01 hexadecimal, followed by the block number, the ones-complement of that block number as a check, the 128 data bytes, and finally a one-byte checksum. The archived specification states the block layout directly: a header byte, the block number and its complement, the 128 data bytes, and the checksum, which is simply the sum of the data bytes with any carry discarded. The receiver recomputes the checksum on the bytes it received and compares it to the value the sender appended.
The flow control is a stop-and-wait handshake. The receiver initiates the transfer by sending a NAK, the negative-acknowledge character, which signals the sender to begin. After each block arrives, the receiver checks the block number, its complement, and the checksum; if everything matches, it replies with ACK and the sender proceeds to the next block, and if anything is wrong, it replies with NAK and the sender retransmits the same block. This means only one block is ever in flight at a time, which is simple to implement but inefficient on connections with long round-trip delays. The transfer ends when the sender, having no more data, sends the EOT character and the receiver acknowledges it.
XMODEM had real limitations that its very simplicity made visible. The plain checksum could miss some corruption patterns that a stronger check would catch, so a later variant replaced it with a 16-bit CRC for far better error detection. The fixed 128-byte block meant files were padded out to a multiple of that size, so the protocol did not preserve exact file length, and it carried no filename or size information, leaving the receiver to supply those by hand. The stop-and-wait handshake wasted time on slow or high-latency links.
These shortcomings drove a family of descendants. XMODEM-1K enlarged the block to 1024 bytes to cut overhead. YMODEM added a header block carrying the filename, exact size, and timestamp, and supported sending several files in one batch. ZMODEM, the most capable of the line, streamed data continuously with sliding-window flow control, recovered from interrupted transfers by resuming where they left off, and became the preferred protocol on bulletin boards by the early 1990s. All of them trace directly back to the block-and-checksum structure Christensen sketched in 1977, and for that reason XMODEM is remembered less for its own elegance than as the simple, sharable foundation on which dependable dial-up file transfer was built.