Summary

  • PPP Multilink wrapped fragments from several member links in one bundle-scoped sequence. Begin and End bits marked packet boundaries; sequence numbers advanced per fragment and did not restart when a packet or added link began.
  • The common contract did not dictate equal fragments or one scheduler. A sender could leave a small packet whole, divide another unevenly, and choose links according to local rates, while MRRU bounded what the receiver promised to reassemble.
  • Link FCS protected each fragment, not the reconstructed packet. Endpoint Discriminator helped assign members but was not a credential; BAP/BACP and multi-class fragmentation later handled bandwidth control and latency as separate problems.

The new line did not start a new conversation

Consider a router with one active bearer channel and a second one that has just completed PPP negotiation. If each channel becomes an independent network-layer link, adding capacity also creates another address, another protocol negotiation and another operational object. If the two channels are merely sprayed with pieces of the same packet, however, the far end needs to know which pieces belong together even when one line is slower.

PPP Multilink made a different object: the bundle. Member links still had their own framing, Link Control Protocol and authentication, but network-layer protocols could operate once over their aggregate. A member could arrive or depart without forcing the bundle to forget all of that state.

RFC 1717 introduced the mechanism in 1994, with multiple ISDN bearer channels as a prominent motivation. RFC 1990 replaced it in 1996 and tightened the contract. The history is often summarized as bandwidth aggregation. That phrase hides the more important design decision. Multilink standardized packet reconstruction while refusing to standardize the sender’s entire scheduling policy.

A packet was wrapped before it was divided

The sender began with a network-protocol packet and added its ordinary PPP Protocol field. It did not add a member link’s Address, Control, flags or FCS and then cut that complete physical frame apart. Those fields belonged to each member transmission, not to the logical packet being reconstructed.

The resulting PPP-encapsulated packet could then be split. Each piece travelled as PPP protocol 0x003d followed by a Multilink header and fragment data. The first fragment therefore began with the original packet’s Protocol field. A Begin bit marked the first fragment; an End bit marked the last. Both bits could be one when a complete packet travelled as a single Multilink fragment.

That last case matters. Multilink did not order every packet to be fragmented. Small packets could remain whole. Split pieces did not need equal sizes. A sender could choose fragment sizes proportional to member speeds, or use another local strategy, without changing what a conforming receiver needed to understand.

This is a small specification with a wide implementation surface. The wire contract names the fragment, its place in bundle order and its relationship to a packet boundary. It does not appoint a universal scheduler.

The counter belonged to the bundle

The default Multilink header carried a 24-bit sequence number. Peers could negotiate a short format with 12 bits, but the bundle had to use one format consistently. Each transmitted fragment consumed the next value.

The sequence did not restart at the beginning of every original packet. It did not restart when a secondary link joined an existing bundle. A genuinely new bundle began at zero; a changing membership set did not create a new sequence epoch by itself. This prevented a fast new member from arriving with numbers that looked like old fragments from another member.

At the receiver, reassembly was likewise a bundle-wide task. Fragments could arrive out of order because member links had different rates and delays. The receiver tracked sequence progress on each active member and derived a minimum value: the lowest point all links had passed. If a sequence below that point was still absent, it could no longer be explained merely as a fragment waiting on a slower member. Incomplete material could be discarded and reassembly could advance.

Even that rule could not abolish uncertainty. A sufficiently delayed member required more buffer. The required buffer depended on link rates, delays and fragment sizes. RFC 1990 warned that no amount of buffering could guarantee detection against a peer that simply withheld a packet. Sequence state bounded reconstruction; it did not make an unreliable collection of links reliable.

Every fragment had a check, but the packet did not gain a new one

Each member link framed its Multilink fragment as ordinary PPP and applied the member’s Frame Check Sequence. A valid FCS therefore supported the integrity of that received fragment under that link’s framing rules. Multilink added no separate FCS over the fully reconstituted packet.

This produces an easy operational mistake. Ten fragments may each have a good link FCS while an eleventh never arrives. The receiver still lacks the packet. “All links have clean FCS counters” and “the bundle delivered complete packets” are different claims.

RFC 1990 also did not prescribe one failed-link detector. Link Quality Monitoring or LCP Echo could supply evidence, but neither was embedded in the fragment header. If a deployment required reliable delivery on a member, PPP Reliable Transmission had to be negotiated separately. MP supplied ordering and reassembly, not retransmission or end-to-end acknowledgement.

An incident record must therefore keep several layers apart: member up/down state, FCS and framing errors, last sequence observed on each member, bundle minimum, sequence gaps, incomplete reassembly discards, complete packets passed upward and application outcome. Collapsing them into one “bundle healthy” flag destroys the distinction the protocol preserves.

MRRU bounded the promise to put the packet back together

The Maximum Reconstructed Receive Unit was not just a larger name for a link’s MRU. MRRU described the largest reassembled information field the receiver would accept for the bundle. Its LCP option, type 17, was also the explicit signal that the peer could receive Multilink packets or attach the link to a bundle. RFC 1990 required support for at least 1500 octets and removed the loose default inherited from the earlier specification.

The distinction is practical. A member may carry only a fragment that fits its own frame limit, while the bundle reconstructs a larger logical packet within the negotiated MRRU. Treating MRRU as a physical-link MTU can send troubleshooting toward the wrong interface.

Short Sequence Header Format, option type 18, traded sequence space for overhead. Endpoint Discriminator, type 19, helped decide whether links reached the same peer and which bundle they should join. But the discriminator did not itself announce Multilink capability, and it was not proof of identity.

Some discriminator classes were only locally assigned. The Magic-Number Block class was at best likely to be unique and was later deprecated for database or authentication use where real authentication was available. A peer could falsify a discriminator. RFC 1990’s security boundary was plain: securely joining a member to a bundle required PPP authentication. An identifier narrowed matching; it did not create authority.

Adding bandwidth was a different protocol decision

Base Multilink allowed membership to change, but it did not decide when another call should be placed or which peer controlled that choice. RFC 2125 put those questions into the Bandwidth Allocation Control Protocol and Bandwidth Allocation Protocol. BACP selected the controlling peer for allocation decisions; BAP carried requests to add or drop links and reported call status.

Separation prevented an implementation policy from becoming a reconstruction rule. A BAP response that says a call attempt succeeded is evidence about that operation. It is not evidence that the new member received the intended configuration, forwarded fragments, improved throughput or delivered an application transaction.

The same separation appeared again when latency became the problem. One sequence class can suffer head-of-line delay: RFC 2686 noted that transmitting 1500 bytes at 28.8 kbit/s could occupy a link for roughly 400 milliseconds and push conversational round-trip delay toward a second. Its multi-class extension let high-priority fragments interleave with lower-priority work.

That later extension is evidence of a healthy boundary. The original MP contract did not pretend that reconstruction order also solved traffic priority. A separate interoperable mechanism could be added where operators valued that behavior.

The bundle was a minimum agreement, not a maximum design

PPP Multilink succeeded by making a narrow shared state durable through changing physical membership. The peers agreed on Multilink capability, MRRU, one header format, packet boundaries and one sequence space. They did not have to agree on the same scheduling algorithm or expose the same reasoning for choosing a member.

That gives the article its historical significance. The bundle was neither a central controller nor a fiction that erased member behavior. It was a minimum agreement beneath local choices. The sender could schedule; the receiver could bound buffering; separate protocols could manage calls or priority; authentication could decide who was allowed to join.

The evidence remains layered. Protocol 0x003d proves a Multilink representation at the observation point. B/E and sequence values prove fragment claims. MRRU proves a negotiated receive bound. A discriminator supplies a matching value. None alone proves complete delivery, identity, bandwidth gain or present-day deployment. Only the running bundle—its captures, counters, reassembly completions and upper-layer results—can close that chain.

Sources