魔術新手症候群

魔術新手症候群(英語:Sorcerer's Apprentice Syndrome,簡稱SAS)是一個糟糕的網路協議瑕疵,在原先的TFTPRFC 783)版本裡發現。會被如此命名是因為SAS的細節很像《幻想曲》电影裡,魔法師的學徒中學徒所引發的災難:造成在傳送的過程封包不斷的被複製增長。這個問題的產生是因為一個在網路上已知的錯誤,由於協定的設計者在設計協定時沒有考慮到,與TFTP的機制細節互相影響而產生SAS。

技術背景

TFTP以一種很簡單的方式運作:在任一時刻外部網絡中只有一個數據包處于傳輸中,並且任一方每接收到一個包,就要又發送一個新的包來作為回復(一直到文件傳輸完畢)。TFTP的技術文檔上說,任何時間收到一個包,接收者必須發送相應的“應答包”。於是,一個數據塊的接受觸發了一個“確認”,而“確認”又觸發了下一個數據塊的發送。這聽起來可能相當正常,但實際上卻導致了災難的發生。

TFTP,同一切建立在不可信連接上的協議一樣,包含有超時機制。比方說,如果它做了某件事並期待接收者應答(一個很平常的例子是它發送了一個數據包),它就開啟一個計時器,如果預定時間已到卻仍沒有回復,它就要采取某些行動:通常,就是指把原來的數據包再發送一次。

SAS的細節

當一個數據包在網絡傳輸中只是延遲,而不是丟失時,魔術新手癥候群就發生了。此時超時已經發生,于是原來的數據包的一個副本被重新發送,為了去代替那個“丟失”的包。但是,第一個數據包并沒有丟失,于是,根據TFTP的文檔的“收到任何的數據包都強制性地回復一個應答包”的規定,產生了兩個回復(每個對應一個副本)。這又導致兩個新的回復,等等。一個典型的場景是這樣的:

電腦S(source)發送了“數據塊X”給電腦D(destination)。

電腦D收到“數據塊X”,發送收到“數據塊X”的確認給電腦S。

不幸的是包含有對“數據塊X”的確認的包在傳輸中延遲了。

電腦S的計時器超時,重新向電腦D發送“數據塊X”。

電腦S收到了延遲到達的對“數據塊X”的確認,然后發送下一個數據塊——“數據塊X+1”。

電腦D收到了“數據塊X”的第二份副本,又發了一個“確認”給電腦S。

電腦D收到了“數據塊X+1”,向電腦S發送了對“數據塊X+1”的確認。

電腦S收到對第二份對“數據塊X”的確認,又重新發送數據塊“數據塊X+1”。

電腦S收到對“數據塊X+1”的確認,發送“數據塊X+2”。

電腦D收到了“數據塊X+1”的第二個副本,又向電腦S發送了第二個對“數據塊X+1”的確認。

電腦D收到了“數據塊X+2”,向電腦S發送對“數據塊X+2”的確認。

可以看出現在情形穩定下來了,并不斷重復:之后的每一個包都加倍了(就是說,有兩個一樣的副本都通過互聯網的傳輸)。

更糟的是,包數量的增加很有可能導致堵塞,可能又會導致新的包的延遲,而這又會導致新一輪的包數量的加倍。不用說,如今,情況就像滾雪球一樣,新的副本會不斷地產生——這就是“魔術新手症候群”這一名稱的由來。

對一個小的文件來說,傳輸會完成,而那些同樣的包最終會在互聯網上消失。而如果文件較大,充血性崩潰就會發生;只有當傳輸最終失敗后,大量的包才從互聯網上消失。

修正SAS

修正SAS十分地簡單:在第二版的TFTP(RFC 1350)說明裡指出只有第一個ACK會被承認並引發下一個資料區塊的傳送,同一份資料的ACK將被直接忽略。

另見

延伸閱讀

  • Bob Braden(editor),Requirements for Internet Hosts -- Application and SupportRFC 1123, USC/Information Sciences Institute, October 1989)See section 4.2