Summary

  • RFC 1144 reduced a typical forty-octet TCP/IP header to a few link bytes by keeping the previous header at both ends and sending only a connection identifier and changes.
  • Compression preserved the ordinary end-to-end packet: the decompressor reconstructed the full header before it left the constrained hop.
  • A lost update could split the two memories, so checksum failure, toss state and an uncompressed refresh were part of the mechanism rather than incidental error handling.

A keystroke carried forty bytes of memory

In February 1990, RFC 1144 described an awkward arithmetic problem on serial links running from 300 to 19,200 bit/s. A minimum IPv4 and TCP header occupied forty octets. An interactive terminal might add one typed octet, producing a 41-octet packet; the echo returned another. The memo calculated that carrying those 82 octets inside 200 milliseconds already required about 4,000 bit/s.

Bulk transfer could hide the fixed cost inside a large packet. Conversation could not. A large FTP packet might also hold the line long enough to delay a tiny echo. The problem was therefore not merely a poor compression ratio. Header serialization and queue occupancy shaped whether a remote system felt responsive.

Meaning moved; it did not disappear

Jacobson's design began from a restraint: every field had a purpose, so a compressor could not simply erase inconvenient bytes. It instead observed that TCP creates conversations. Addresses and ports remain stable for a connection; several other fields change predictably; only a few values change irregularly on each packet.

The compressor and decompressor each kept a copy of the preceding header for active flows. A small connection identifier selected the right copy. An UNCOMPRESSED_TCP frame installed or refreshed that context. Later COMPRESSED_TCP frames carried a change mask, compact deltas and values that could not safely be inferred. The receiver rebuilt the ordinary IP/TCP header before forwarding the datagram.

This preserved the Internet layer's scope. End hosts did not need to know that two gateways had compressed one serial hop. Outside that hop, the packet again had its normal header. The saving came from relocating repeated evidence into link-local memory, not weakening the end-to-end format.

Regular change was the real codec

The most productive fields were neither constant nor random. Sequence numbers, acknowledgements and the IP Identification field often advanced by small, comprehensible amounts. A mask said which values changed; variable-length encodings made small differences cheap. Special cases represented common interactive echoes and unidirectional bulk flow even more compactly.

The method also knew when not to predict. IP fragments, SYN, FIN and RST segments, packets without ACK, changed header lengths, unexpected options and irregular transitions took a safer uncompressed path. Compression was not a universal rewrite of TCP/IP. It was a claim about a bounded subset whose next state could be reconstructed from the last one.

For the traces in the memo, the average compressed header was about three octets. That number belongs to the cited traffic and equipment, not to every link. Its historical force lies in the mechanism: predictable evolution, rather than unused protocol fields, supplied the budget.

One missing frame split the shared past

A delta has meaning only relative to its base. If a compressed frame vanished, the compressor might advance its saved header while the decompressor did not. Applying the next delta to two different bases produced two different packets.

RFC 1144 used TCP's existing signals to contain that disagreement. A reconstructed packet with the wrong sequence or acknowledgement state would ordinarily fail the TCP checksum. The decompressor then entered a toss state and rejected further compressed frames until an uncompressed one reseeded the context. TCP retransmission and duplicate-ack behaviour helped provoke that refresh without adding a separate repair conversation to the compression protocol.

The checksum was not authentication, and recovery was not costless. It was a bounded way to notice that omitted evidence could no longer be inferred. Compression made memory a protocol input; context invalidation therefore became part of correctness.

Later designs named the hidden machinery

RFC 2507 generalised the model in 1999: send a full header occasionally, let later packets refer to its context, and carry incremental changes. It added generations for non-TCP contexts, periodic refreshes, requests, explicit no-delta repair and rules for reordering. It also named a capacity problem. When many streams compete for finite context identifiers, CID thrashing can force frequent full headers and consume the saving.

RFC 4413 later classified fields by actual behaviour—static, inferable, predictable or irregular—rather than treating the header diagram as a compression plan. The ROHC framework and its TCP profile made context states, refresh, feedback and integrity checks more explicit for lossy and reordered links with richer headers.

These later protocols are not wire-compatible footnotes to RFC 1144. They show the same constitutional issue under harder conditions: once bytes are omitted, every receiver needs a bounded answer to which remembered state authorises reconstruction.

Sources and limits

The closed evidence set is RFC 1144, RFC 2507, RFC 4413, RFC 4995 and RFC 6846. It establishes designs and reported examples, not current adoption, vendor defaults, universal gains or a claim that every compressed header occupies three octets.