魔法使いの弟子症候群

魔法使いの弟子症候群（まほうつかいのでししょうこうぐん、 (SAS)）は、インターネットのプロトコルであるTFTPの仕様上の欠陥に起因する不具合である。この名前は、ゲーテの1797年の詩『魔法使いの弟子』（ポール・デュカスの交響詩『魔法使いの弟子』やディズニーの1940年の映画『ファンタジア』で有名になった）に由来する。転送中のパケットが複製され増加し続ける様子が、同作における魔法をかけられた箒が増えてゆく様子に似ているからである。

この問題は、プロトコルの設計時に考慮されていなかったインターネットの既知の障害モードが、TFTPのメカニズムと相互作用して発生したものである。

技術的な背景
TFTPは単純なで動作する。未処理のパケットは常に1つだけであり、どちらかの端末がパケットを受信すると、（ファイルの転送が完了していなければ）返信として1つのパケットを送信する。TFTPの仕様では、なんらかのパケットを受信した端末は、適切な返信パケットを送信する必要があると規定されている。すなわち、あるデータブロックの受信が契機となって「確認応答」が送信され、「確認応答」の受信が契機となって次のデータブロックが送信される。

TFTPは、信頼性の低いネットワーク上で動作するように設計された他のプロトコルと同様に、タイムアウトを規定している。端末がパケットを送信すると、応答を待つためのタイマが開始される。応答がないままタイムアウトすると、通常は送信したパケットを再送する。

SASの発生過程
SASは、パケットが転送中に失われたのではなく、転送が遅延して送信側でタイムアウトが発生し、その後受信側に正常にパケットが届いた場合に発生する。

タイムアウトが発生すると、送信側はパケットを再送する。しかし、最初のパケットは失われておらず、最初のパケットと再送されたパケットのいずれもが受信側に届く。受信側はTFTPの仕様に従って、それぞれに対して返信パケットを返す。送信側は2つの返信パケットに対して、それぞれデータブロックの送信を行う。SASの発生過程の典型的なシナリオは、以下の通りである（Sが送信側(source)、Dが受信側(destination)）。

SはデータブロックXをDに送信する。
DはXを受信し、Xの確認応答をSに返信する。
Xの確認応答がネットワーク内で遅延する。
Sでタイムアウトが発生し、SはXをDに再送する。
SはXの確認応答を受信し、データブロックX+1をDに送信する。
Dは2つ目のXを受信し、2つ目のXの確認応答をSに返信する。
DはX+1を受信し、X+1の確認応答をSに返信する。
Sは2つ目のXの確認応答を受信し、2つ目のデータブロックX+1をDに送信する。
SはX+1の確認応答を受信し、データブロックX+2をDに送信する。
Dは2つ目のX+1を受信し、2つ目のX+1の確認応答をSに返信する。
DはX+2を受信し、X+2の確認応答をSに返信する。

以降、同じデータブロックと確認応答が2つずつ送信され続けることになる。さらには、これによってネットワークを流れるパケット量が増えることで、遅延がさらに発生し、タイムアウトが起こりやすくなる。それによりパケットが増殖し、さらに遅延が発生し……というの悪循環が起こる。この様子を『魔法使いの弟子』で箒が増え続ける様子になぞらえて、この名称がつけられた。

転送するファイルが小さければ、ファイルの転送はすぐに完了し、重複して発生したパケットもすぐに消滅する。しかし、大きなパケットを転送する際にこの現象が発生した場合、大量のパケットが生成されることになり、ネットワーク障害の原因となる。

解決法
SASの発生を防ぐために、TFTPの仕様が変更された。同一のデータブロックに対する確認応答を複数回受信した場合、最初に受信した確認応答に対してのみ次のデータブロックの送信を行い、2回目以降に対しては何も行わないことで、パケットの増殖を防いだ。この変更により、受信側の実装（多くの場合、低レベル言語で書かれたブートストラッププログラム）では、再送タイマを省略することができるようになった。パケットが失われたとき、送信側が最後のパケットを再送するからである。

脚注

通信プロトコル
バグ