存档

文章标签 ‘TFTP’

TFTP协议里的魔术师学徒症(Sorcerer’s Apprentice Syndrome)

2009年6月9日 1 条评论

最近正在学习互联网程序设计课程,老师要求写一个TFTP服务器,看了一下TFTP的相关知识,发现其中有一个Sorcerer’s Apprentice Syndrome专有名词,不是很懂,然后到wiki上面看了一下,然后明白了大概是怎么回事,下面讲一下。

在TFTP早期版本(RFC783)中,规定了数据发送方在一次数据发送之后,必须等待数据接收方acknowledgement包的送回,当接收到acknowledgement包的时候,就把接下来的数据继续发送,但是如果从发送开始到接收到acknowledgement包之间的时间大于一个值timeout,那么,数据发送方认为本次发送的数据包丢失,它将再次发送本次数据包。

可是,在有一种情况下,会产生很严重的问题:
1. 数据发送方S(source)发送数据X给数据接收方D(Destination)
2. 数据接收方D收到了数据X,并且将数据X的确认包acknowledgement发送给S
3. 此时该确认包acknowledgement在网络中严重堵塞,但是没有丢失
4. 当timeout值超时后,S将数据报X再次发送给D
5. S收到了X的第一次数据确认包,发送数据包X+1给D
6. D第二次收到了S发送的数据包X,将数据X的确认包再次发送给S
7. D收到了数据包X+1,并将数据包X+1的确认包返回给S
8. S第二次收到了数据包X的确认包,再次将数据包X+1发送给D
9. S收到了X+1的确认包,把数据包X+2发送给D
10. D第二次收到了数据包X+1,再次发送数据包X+1的确认包给S
11. D收到了X+2的数据包,将数据包X+2的确认包返回给S
如此往复

这样,这个过程已经趋于稳定,现在网络中S向D发送数据每次都需要发送同一数据的两份拷贝,这样极大地占用了网络资源,而在最坏的情况下,有可能接下来所有发出的数据包都会超时,那么这种情况下会造成数据包传输的指数级爆炸,就像魔术师学徒变扫帚一样,一个变两,两个变四,四个变八(具体那部电影没看过,这里只能YY下^_^),这种情况在现实中是不允许存在的,这会给TFTP服务器以及网络带来太大的负担,那么如何解决这个问题呢,很简单,只有当收到某个数据的第一个确认包时才将该数据包的下一个数据包给对端,这样就很方便地解决了魔术师学徒综合症问题(SAS)