要約

  • PPP Multilinkでは複数member linkのfragmentがbundle共通のsequenceを使い、BとEがpacketの先頭と末尾を示した。番号はfragmentごとに進み、packetや追加回線の開始ではresetされない。
  • 共通仕様は等分割も万能schedulerも要求しない。小さなpacketは分けずに運べ、fragment長や回線選択は局所的に決められる一方、MRRUが受信側の再構成上限を定めた。
  • 各linkのFCSが守るのは各fragmentであり、復元済みpacket全体に新しいFCSはない。Endpoint Discriminatorはbundle判定の補助であってcredentialではなく、動的帯域と優先度は別拡張になった。

二本目は別のIP linkにならなかった

最初のbearer channelが動作中に、二本目のPPP回線がOpenになる。二本を独立したlinkとして扱えば、capacityだけでなくaddressやNetwork Control Protocolの状態まで二組になる。逆に、同じpacketの断片を根拠なく両方へ流せば、速度差による並べ替えを受信側が解けない。

Multilinkが導入したのはbundleという中間の単位だった。memberはそれぞれLCP、authentication、framingを持つ。しかしnetwork protocolは通常bundleに対して一度だけ構成できる。一本を追加または除去しても、bundleの上にあるconversationを最初から作り直す必要はなかった。

1994年のRFC 1717は複数ISDN bearerを代表例として仕組みを提示した。1996年のRFC 1990はそれを置き換え、曖昧だった交渉やsequenceの規則を明確にした。「帯域を束ねる規格」という説明だけでは核心が抜ける。歴史的な工夫は、物理memberが変わる状況でpacket復元に必要な状態だけを共有物にした点にある。

切ったのはlink frameではなく論理packetだった

送信側はnetwork protocol packetに通常のPPP Protocol fieldを付ける。まだ特定memberのAddress、Control、Flag、FCSを付けた物理frameにはしない。このPPP encapsulated packetが分割対象である。

各fragmentはPPP Protocol 0x003dとして運ばれ、MP headerが前に置かれる。最初のfragment dataは元packetのProtocol fieldから始まる。B bitは最初、E bitは最後を示し、一つのfragmentでpacket全体を運ぶときはBとEの両方を1にできる。

したがってMultilinkは全packetの分割を義務づけていない。短いpacketはそのまま一片でよい。分割するときも同じ長さである必要はない。速いmemberへ大きめのfragmentを割り当てる実装も、別の局所的方針も、受信側の共通文法を変えずに選べた。

標準が決めたのはfragmentの順序とpacket境界である。なぜその瞬間にそのmemberを選んだかはwireから必ずしも分からない。この非対称性は欠陥ではなく、schedulerの改善を相互運用契約から切り離すための余白だった。

sequenceはpacketにもmemberにも属さない

通常のMP headerには24 bit sequence numberがある。12 bitのshort headerも交渉できるが、一つのbundle内でformatを混在させてはならない。番号はfragmentを送るたびに一つ進む。

元packetが変わってもsequenceはゼロに戻らない。既存bundleへ二本目が加わっても戻らない。新しいbundleはゼロから始まるが、member集合の変更だけでは新しいsequence epochにならない。この規則がなければ、新memberの小さな番号と旧member上で遅れていた古いfragmentを区別しにくい。

受信側もbundle全体で一つのreassemblyを行う。memberごとの速度とdelayが違えば、到着順は当然変わる。受信側は各memberで観測したsequenceの進みを保持し、その全てが通過した最小値を求める。欠けた番号がその値より古ければ、単に遅いmember上に残っているとは説明できなくなり、不完全なpacketを捨てて先へ進める。

ただしbufferは真実を作れない。大きなdelay差、低速member、大きいfragmentは必要量を増やす。RFC 1990は、peerがpacketを留め続ける場合、どれだけbufferしてもloss検出を保証できないと述べる。sequenceは不確実性を整理する道具であり、信頼性そのものではない。

良好なFCSが十一番目のfragmentを補わない

各memberはMP fragmentを普通のPPP frameに入れ、そのlinkのFCSを付ける。FCSが正しければ、観測されたfragmentがそのlinkの検査を通ったとは言える。しかしMultilinkは、全fragmentをつないだpacketに新しいFCSを付けない。

十一片のうち十片が全て良好でも、一片が失われればpacketは完成しない。member dashboardのFCS欄が緑であることと、bundleがcomplete packetを上位へ渡したことは異なる証拠である。

failed linkの検出方法もMP headerには組み込まれていない。LQMやLCP Echoを使うことはできるが、それらは隣接する別機構だ。memberでreliable deliveryが必要ならPPP Reliable Transmissionを別途交渉する。MPには再送要求もapplication acknowledgementもない。

運用ではmember state、framing/FCS counter、member別最終sequence、bundleのgap、incomplete reassembly discard、上位へ渡したpacket数、application outcomeを分離して保存する必要がある。一個の「bundle正常」indicatorにまとめると、どの境界で失われたかを再現できない。

MRRUは再構成能力の約束だった

Maximum Reconstructed Receive Unitはbundleが受け取れる最大のreassembled information fieldを示す。物理memberのMRUとは別物である。member frameは自分のfragmentを収めればよく、論理packetは交渉済みMRRU内で復元される。

MRRUはLCP option type 17であり、Multilink packetを受信できる、またはlinkをbundleへ加えられるという明示的な交渉でもある。RFC 1990は少なくとも1500 octetのsupportを要求し、旧仕様の曖昧なdefaultをなくした。Short Sequence Header Formatはtype 18である。

type 19のEndpoint Discriminatorは、複数linkが同じpeerへ通じ、同じbundleへ属すかを判断する材料になる。しかしそれだけでMultilink能力を示すわけではなく、identity proofにもならない。

class 1はlocal assignmentでありglobal uniquenessを保証しない。Magic-Number Blockも一意である可能性に依存するだけで、authenticationやdatabase keyとしての利用は非推奨になった。値は偽装できる。secureにmemberを参加させるならPPP authenticationが必要である。名前を合わせる機構と参加権限は別に保たれた。

回線を増やす判断はBAPの仕事になった

Base MPはmemberの追加・削除を許したが、いつcallするか、どちらのpeerが帯域判断を支配するかは決めなかった。RFC 2125のBACPはbundleごとにcontrol側を選び、BAPはlink追加・削除requestとcall statusを運んだ。

callが成功したというstatusは、その操作の結果にすぎない。新memberが期待した構成を持つこと、MP fragmentを実際に運ぶこと、throughputが上がること、application transactionが届くことまでは証明しない。制御面の成功とdata面の結果を分離できる設計だった。

latencyにも別の拡張が必要になった。RFC 2686は28.8 kbit/s回線で1500 byteを送ると約400 msを占有し、会話のround tripが一秒近くなり得る例を示した。Multi-Class extensionは低優先度fragmentの間へ高優先度を入れられるようにした。base MPの一つのsequenceは復元を解くが、priority policyまでは解かない。その限界を隠さず、後から独立に拡張した。

bundleは最大設計ではなく最小合意だった

Multilinkで共有されたのは、MP capability、MRRU、一つのheader format、B/E境界、一つのsequence spaceだった。fragment size、member選択、pacing、failure detector、priorityは局所または別protocolに残った。

この分割が、変化する物理capacityの上に安定したnetwork-layer conversationを置いた。bundleはmemberの現実を消す中央権威ではなく、互いの実装が最低限同じpacketを復元するための合意だった。

観測も同じ節度を守る必要がある。0x003dはMP表現、B/Eとsequenceはfragmentの主張、MRRUはreceive bound、Endpoint Discriminatorはmatching hintを示す。それらを組み合わせてもidentity、完全配送、帯域向上、現在の採用率までは出てこない。running bundleのcapture、counter、reassembly completionと上位結果だけが証拠の鎖を閉じる。

出典