Summary

  • XMODEM's common surface was deliberately narrow: a 128-byte numbered block, a simple integrity check, receiver-led acknowledgement and an explicit end. It did not try to own the call, the file system or the user experience.
  • That restraint made independent implementations cheap to build and easy to test against one another. It also preserved visible limits—weak error detection, stop-and-wait latency and no filename metadata—that successors could address without pretending the original wire agreement was a complete service.

A whole protocol in one short line

The most revealing document in Ward Christensen's legacy is not a corporate architecture diagram. It is a frame that can be written in a single line:

SOH | block number | one's complement | 128 data bytes | checksum

That line describes the unit the sender places on an asynchronous connection. The block number begins at one and advances. Its complement gives the receiver a cheap way to notice damage in the header. The payload is always 128 bytes, the size that fit the CP/M disk context in which Christensen was working. A one-byte sum checks the data, with overflow discarded.

Around the frame sits an equally small conversation. The receiving program asks for the transfer with NAK. After a block arrives, it calculates its own checksum and replies ACK if the result is acceptable or NAK if the sender should try again. When no data remain, the sender transmits EOT and waits for an acknowledgement.

There is no filename in the original block. No directory, account, login screen, tariff, modem-dialling procedure, storage policy or central registry appears in the shared agreement. Those absences are not footnotes. They locate power. The protocol determines what two implementations must agree about on the wire; it does not determine what either endpoint must be.

Recovery without a coordinator

One detail shows how much practical reasoning could fit inside a small state machine. The receiver may see the block it expected, or it may see the preceding block again. The second case need not be fatal. It can mean that the earlier data arrived correctly but the receiver's ACK was damaged, so the sender transmitted the same block again. The receiver accepts the duplicate as a recovery event and acknowledges it without appending the payload twice.

The decision is local and deterministic. Neither endpoint asks a service operator which copy is authoritative. A numbered block, a remembered previous state and a response byte are enough to restore agreement. The mechanism does not solve every failure; a surprising block number can indicate lost synchronisation and force an abort. It solves the bounded ambiguity created by a missing acknowledgement.

Christensen later called the 1977 work an unplanned solution to a personal need. He also said that completing it early and putting it immediately in the public domain helped it become a standard. That is retrospective testimony, not an experiment isolating the cause of adoption. Yet the implementation economics are legible. A small program could be copied, inspected, ported and tested. A second author did not need permission from a network owner to make another machine speak the same line language.

A standard without a standards organisation

XMODEM should not be rewritten as an IETF standard. RFC 916, published in 1984, discussed MODEM/XMODEM because it was already in common microcomputer use while proposing a different reliable asynchronous protocol. Its appendix records the 128-byte blocks, checksum and ACK/NAK exchange, then names limitations: the stream is one-way, the packet size is fixed, and some intermediate systems could struggle even with shorter bursts.

That contemporary criticism matters. Minimality did not make XMODEM optimal for every line. Stop-and-wait wastes capacity when round-trip delay is large. The elementary checksum cannot detect every corruption pattern. Padding a final short file block complicates exact length recovery. The original exchange also carries no filename, timestamp or batch manifest.

But a limit that remains visible can be worked around or replaced. A hidden dependency inside a large service is harder to negotiate. XMODEM's deficits were observable at the boundary: an implementer could measure retries, throughput and failed checks; a user could see that a filename had to be supplied separately.

Extensions had to earn compatibility

Later conventions added stronger CRC-16 checking, optional 1K blocks and a block zero that could carry filename and size information. Programs distributed by Chuck Forsberg helped those practices travel under names such as YMODEM. They were useful precisely because the original common floor remained recognisable.

Christensen resisted proposals to turn XMODEM itself into a full-duplex, multiple-outstanding-block or multiple-destination system. His argument was not that richer transfers were illegitimate. It was that extreme simplicity explained why the protocol survived across so many machines and programs. Improvements should be incremental enough that an existing endpoint was not casually declared defective.

That discipline did not eliminate disorder. Historical protocol references warn that the same product name could conceal incompatible behaviour. A label was not proof. Compatibility still had to be established with real implementations, test files, fault cases and clear documentation of which extensions were present.

This is a more useful account of openness than the romantic claim that public code automatically coordinates a market. The loop is proposal, implementation, interoperation, observation and description. A feature becomes part of a durable convention when independent endpoints can adopt it without one vendor gaining the right to reinterpret the old floor.

The things XMODEM did not centralise

Christensen also wrote the software side of CBBS with Randy Suess after the Chicago blizzard of 1978. The bulletin board belongs in the social history around the protocol, not inside its packet definition. A BBS answered a call, managed messages and created a place people returned to. XMODEM moved a file. Keeping those layers separate allowed many bulletin boards and terminal programs to add transfer capability without becoming one centrally administered XMODEM service.

The separation offers a durable test for modern infrastructure. Ask which facts every participant must share for the system to work, and which decisions have been pulled into a provider merely because centralisation is convenient. A common wire invariant may deserve strictness. A proprietary interface, account graph or file policy may not.

The 128-byte block is therefore less interesting as nostalgia than as a boundary marker. It shows a public line agreement doing enough to restore sequence and signal success while refusing to absorb the surrounding product. The endpoints were not free of constraints. They were free to differ everywhere the common transfer did not require sameness.

Sources