接下来,我们来看拜占庭将军问题,它相较于两将军问题要复杂得多。莱斯利·兰伯特在他的论文里是这么描述这个问题的:
9 位拜占庭将军分别率领一支军队要共同围困一座城市,因为这座城市很强大,如果不协调统一将军们的行动策略,部分军队进攻、部分军队撤退会造成围困失败,因此各位将军必须通过投票来达成一致策略,要么一起进攻,要么一起撤退。
因为各位将军分别占据城市的一角,他们只能通过信使互相联系。在协调过程中每位将军都将自己投票“进攻”还是“撤退”的消息通过信使分别通知其他所有将军,这样一来每位将军根据自己的投票和其他将军送过来的投票,就可以知道投票结果,从而决定是进攻还是撤退。
而问题的复杂性就在于:将军中可能出现叛徒,他们不仅可以投票给错误的决策,还可能会选择性地发送投票。假设 9 位将军中有 1 名叛徒,8 位忠诚的将军中出现了 4 人投“进攻”,4 人投“撤退”,这时候叛徒可能故意给 4 名投“进攻”的将军投“进攻”,而给另外 4 名投“撤退”的将军投“撤退”。这样在 4 名投“进攻”的将军看来,投票是 5 人投“进攻”,从而发动进攻;而另外 4 名将军看来是 5 人投“撤退”,从而撤退。这样,一致性就遭到了破坏。
展开剩余61%还有一种情况,因为将军之间需要通过信使交流,即便所有的将军都是忠诚的,派出去的信使也可能被敌军截杀,甚至被间谍替换,也就是说将军之间进行交流的信息通道是不能保证可靠性的。所以在没有收到对应将军消息的时候,将军们会默认投一个票,例如“进攻”。
以上就是拜占庭将军问题的简单描述,如果将军们在有叛徒存在的情况下仍然达成了一致,我们就称达到了“拜占庭容错”。那这跟我们在多台计算机中达成共识有什么关系呢?
其实,我们可以这么看这个问题,把将军看做是计算机;信使就是网络;信使被截杀,代表着计算机间的网络不可达;而将军叛变则代表着程序出错。这么一解释,有没有豁然开朗的感觉?
拜占庭将军问题有解吗?答案是有的,但有个前提,那就是叛徒的数量不能大于等于 1/3。
这个值怎么得出来的呢?这里我们可以用最小化模型来探讨,因为共识的基础是要少数服从多数,那么最小化模型的将军数是 3。假设有 3 个将军 A、B、C,假设三人中有一个是叛徒。
当 A 发出“进攻”命令时,B 如果是叛徒,他可能告诉 C,他收到的是“撤退”的命令。这时 C 收到一个“进攻”,一个“撤退“,于是 C 无法判断真实命令。
如果 A 是叛徒,他告诉 B“进攻”,告诉 C“撤退”。当 C 告诉 B,他收到“撤退”命令时,B 由于收到了 A“进攻”的命令,而无法与 C 保持一致。
正由于上述原因,只要有一个是叛徒,即叛徒数等于 1/3,拜占庭问题便不可解。
既然有解,我们就来看看有哪些解法。
发布于:湖南省