魔術新手綜合症

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

魔術新手綜合症Sorcerer's Apprentice Syndrome(簡稱SAS)。SAS是一個糟糕的網路協定瑕疵,在原先的TFTP(RFC 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”的確認。
可以看出現在情形穩定下來了,並不斷重複:之後的每一個包都加倍了(就是說,有兩個一樣的副本都通過網際網路的傳輸)。
更糟的是,包數量的增加很有可能導致堵塞,可能又會導致新的包的延遲,而這又會導致新一輪的包數量的加倍。不用說,如今,情況就像滾雪球一樣,新的副本會不斷地產生——這就是“魔術新手綜合症”這一名稱的由來。
對一個小的檔案來說,傳輸會完成,而那些同樣的包最終會在網際網路上消失。而如果檔案較大,充血性崩潰就會發生;只有當傳輸最終失敗後,大量的包才從網際網路上消失。

相關詞條

熱門詞條

聯絡我們