魔術新手症候群

魔術新手症候群(英語: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