Andrew S.Tanenbaum 在《计算机网络》一书中介绍了一个与网络协议有关的著名问题--两军问题,可以用来说明协议设计的微妙性和复杂性。
两军问题可以这样描述:一支白军被围困在一个山谷中,山谷的两侧是蓝军。困在山谷中的白军人数多余山谷两侧的任意一支蓝军,而少于两支蓝军的中和。若一支蓝军对白军单独发起进攻,则必败无疑;但若两支蓝军同时发起进攻,则可取胜。两只蓝军希望同时发起进攻,这样他们就要传递消息,以便确定发起进攻的具体时间。假设他们只能派遣士兵穿越白军所在的山谷(唯一的通信信道)来传递消息,那么在穿越山谷是,士兵有可能被俘虏,从而造成消息的丢失。现在的问题是:如何通信,以便蓝军必胜。下面我们进行设计。
假设一支蓝军指挥官发出消息:“我建议在明天佛晓发起进攻,请确认。”如果消息到达了另一支蓝军,其指挥官同意这一建议,并且他的回信也安全的送到,那么能否进攻呢?不能。这是一个两步握手协议,因为该指挥官无法知道他的回信是否安全送到了,所以,他不能发起进攻,改进协议,将两步握手协议改为三步握手协议,这样,最初提出建议的指挥官必须确认对该建议的应答信息。假如信息没有丢失,并收到确认消息,则他必须将收到的确认信息告诉对方,从而完成三步握手协议。然而,这样他就无法知道消息是否被对方收到,因此,他不能发起进攻。那么现在采用四步握手协议会如何呢?结果仍是于事无补。
结论是:不存在使蓝军必胜的通信约定(协议)。
该结论可以用反证法证明,证明如下:假如存在某种协议,那么协议中最后一条信息要么是必要的,要么不是。如果不是,可以删除它,知道剩下的每条信息都是至关重要的。若最后一条消息没有安全到达目的地,则会怎样呢?刚才说过每条信息都是必要的,因此,若它丢了,则进攻不会如期进行。由于最后发出信息的指挥官永远无法确定该信息是否安全到达,所以他不会冒险发动攻击。同样,另一只蓝军也明白这个道理,所以也不会发动进攻。
Andrew使用上述问题来阐述网络传输成中“释放连接”问题的要点。而在实际中,当两台通过网络互联的计算机释放连接(对应两军问题的发起进攻),通常乙方收到对方确认的应答消息后不在回复就连接释放(用的是一个三步握手协议)。这样处理,协议并非完全没有错,但通常情况下以及足够了。)
就像andrew给出的结论那样,现在你应该很清楚,释放一个可能有数据丢失的网络连接并不像人们看起来那样简单。
原文地址:http://blog.tianya.cn/post-6391272-95389043-1.shtml