什么是拜占庭问题
拜占庭将军问题(Byzantine failures),是由计算机科学史上的传奇人物莱斯利·兰伯特提出的。主要针对点对点通信中的基本问题——分布式系统一致性问题。
兰伯特说:故事让问题变得受欢迎。所以,拜占庭将军问题,是兰伯特在研究分布式系统容错性时,编的一个故事:
拜占庭帝国想要进攻一个无比强大的敌人,派出了10支军队去包围这个敌人。由于各种的原因,这10支军队不能集合在一起进攻,必须分开驻扎,然后同时发起攻击。而这个敌人十分的强大,可以同时抵抗5支拜占庭军队的袭击。拜占庭军队里的任何一支,想要单独进攻的话,都毫无胜算。除非至少超过一半(即6支及以上的军队)同时进攻,才能打败敌人。军队分散在敌人的四周,依靠通信兵来相互传递消息:商量“要不要进攻”和“什么时候进攻”。(因为存在消息丢失的不可靠信道上,试图通过消息传递来达到一致性,是不可能的。所以,在研究拜占庭将军问题的时候,我们已经假定了信道是没有问题的。即所有的通信兵是靠谱的,没有叛徒。)
那么问题来了,如果将军里有叛徒,那么这个叛徒将军可能发送错误消息。比如:告诉其中4只军队要进攻,然后告诉另外5只军队不进攻,然后只有4只军队同时进攻,吃了败仗。剩下5只军队,也无法战胜这个强大的敌人。最后拜占庭军队战败。叛徒真的面黑心黑。
在这种状态下,拜占庭将军们,能不能找到一种分布式的协议,让他们能够远程协商,保证多于6支军队在同时发起进攻?从而打赢这场仗? 计算机科学中,有类似的问题,比如安全漏洞。 系统中的不同节点,会对观察者提供不同的信号。在不知道这些信息是否损坏的情况下,如何交换信息?