魔术新手症候群(英语:Sorcerer's Apprentice Syndrome,简称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”的确认。

可以看出现在情形稳定下来了,并不断重复:之后的每一个包都加倍了(就是说,有两个一样的副本都通过互联网的传输)。

更糟的是,包数量的增加很有可能导致堵塞,可能又会导致新的包的延迟,而这又会导致新一轮的包数量的加倍。不用说,如今,情况就像滚雪球一样,新的副本会不断地产生——这就是“魔术新手症候群”这一名称的由来。

对一个小的文件来说,传输会完成,而那些同样的包最终会在互联网上消失。而如果文件较大,充血性崩溃就会发生;只有当传输最终失败后,大量的包才从互联网上消失。

修正SAS

修正SAS十分地简单:在第二版的TFTP(RFC 1350)说明里指出只有第一个ACK会被承认并引发下一个资料区块的传送,同一份资料的ACK将被直接忽略。

另见

延伸阅读

www.zhiyonw.net
问题反馈联系QQ:暂无联系方式,也可发qq邮箱。