简介
拜占庭将军问题是一个协议问题,拜占庭帝国军队的将军们必须全体一致的决定是否攻击某一支敌军。问题是这些将军在地理上是分隔开来的,并且将军中存在叛徒。叛徒可以任意行动以达到以下目标:欺骗某些将军采取进攻行动;促成一个不是所有将军都同意的决定,如当将军们不希望进攻时促成进攻行动;或者迷惑某些将军,使他们无法做出决定。如果叛徒达到了这些目的之一,则任何攻击行动的结果都是注定要失败的,只有完全达成一致的努力才能获得胜利(来自于百度)
总结来说解决拜占庭问题就是为了解决一致性(共识)的问题
两将军问题
拜占庭问题出现之前就存在两将军问题,大体描述就是两位将军要通过信使来沟通最后达成进攻或撤退的约定,但是存在信使迷路或者被敌军捕获(消息丢失,消息伪造),如何达成一致?根据FLP不可能理论,该问题无通用解。
问题解决
前提条件
根据两将军问题的描述可知,当将军数量为2时无法达成一致性,所以要判断将军中哪一个为叛将对于将军的数量以及叛将的数量有严格要求吗,设将军总量为N,叛将总量为F,那么仅当只有N >= 3F + 1时问题可得解,共识才能达成。
角色行为描述
1.提案人
提案人理解为leader,向其他将军发送指令。提案人发送的指令作为最终验证结果。
2.将军(包括忠将叛将)
理解为replica即副本,接收提案人发送的指令,并反馈leader该指令
3.叛将
理解为恶意节点,主要是为了扰乱决策,在leader发送指令后,紧接着叛将会向除leader外的所有节点发送扰乱指令
4.忠将
理解为善意节点。忠将会有以下行为,此处应分类讨论:
leader为忠将:首先每个replica会向leader反馈leader发送指令,然后每个follower会向叛将follower反馈叛将发送的指令,最后向其他replica发送leader指令。此处应注意消息发送的顺序:提案人->叛将->忠将。
leader为叛将:每个replica会向leader反馈leader发送的指令,并向其他replica发送leader指令。此处的发送顺序为:提案人->忠将
另外每个角色不会向自己发送消息。
理解分析
为什么要符合N >= 3F + 1
此处简化模型,取N = 3F,设F =1,则N=3。三个角色分别为A,B,C。A为提案者。
分类讨论:
1.设提案者(A)为忠将(前置条件,并非结论)分别向B和C发送进攻指令,B为叛将,C为忠将,0为进攻指令,1位撤退指令。则信息发送的顺序为:A->B->C。根绝上述角色的行为下面以画图示意(发送消息横向看,接收消息纵向看):
由此图可得:B接收到的指令为(0,1),C接收到的指令为(0,1)。根据假设条件和B、C接收到的指令分析:
0 1
&
0 1
————
0 1
(0,1) != (0,0)。此结论只能证明B和C其中有一个叛将,但是具体哪一位是叛将无法得到。
无法得到结论B或者C为叛将。
2.设提案者(A)为叛将(前置条件,并非结论)分别向B发送了进攻指令向C发送了撤退指令,0为进攻指令,1为撤退指令。如图示意:
由此图可得:B接收到的指令为(0,1),C接收到的指令为(1,0)。同理
0 1
&
1 0
————
0 0
得到的结果(0,0) != (0,1) 得到A为叛将。得解。
结合1,2的结论可得无论A提案人是否为叛将,最后的结论总是指向A为叛将。可得:当N < 3F + 1时无法得到叛将节点。
符合N >= 3F + 1条件的分析理解
同样的,简化模型。设F = 1,则N = 4。意思就是叛将数目为1,将军总数为4。假设有四个将军分别是A、B、C、D,A为提案者。
同样的分类讨论为:
1.A(提案者)为忠将(前置条件,并非结论),B,C,D其中有一个是叛将,假设C为叛将,根据角色行为可得下图:
由上图可知:B的接收到的指令为(0,1,0),C的接收到的指令为(0,1,1),D接收到的指令为(0,0,1)
计算分析:
B & C
0 1 0
&
0 1 1
————
0 1 0
(0,1,0) != (0,0,0)可得B和C其中一个为叛将
C & D
0 1 1
&
0 0 1
————
0 0 1
(0,0,1) != (0,0,0)可得C和D其中有一个叛将
此时已经得到C为叛将。
那么试着B & D
0 1 0
&
0 0 1
————
0 0 0
(0,0,0) == (0,0,0) 可得B和D为忠将,进一步判断出C为叛将
综上所述:当A(提案者为忠将时),C为叛将
2.设A(提案者)为叛将(前置条件,并非结论),B,C,D为忠将,A分别向B发送了撤退指令(1),向C发送了进攻指令(0),向D发送了撤退指令(1)。根据角色的行为可得下图:
由上图可得B接收到的指令为(1,0,1),C接收到的指令为(0,1,1),D接收到的指令为(1,1,0)
计算可知:
B & C
1 0 1
&
0 1 1
————
0 0 1
(0,0,1) != (1,0,1) 可得B和C其中有一个叛将
C & D
0 1 1
&
1 1 0
————
0 1 0
(0,1,0) != (1,0,1)可得C和D其中有一个叛将
B & D
1 0 1
&
1 1 0
————
1 0 0
(1,0,0) != (1,0,1)可得B和D其中有一个叛将
综上所述B、C、D都是叛将,明显不符合叛将数目为1这个条件,可知B、C、D为忠将,A为叛将。
由1,2可知当符合N >= 3F + 1时才能得到叛将。
综上所述:当叛徒不超过1/3时,总会有有效的算法让忠诚的将军之间达成共识,当叛徒超过1/3时,则无法保证忠将一定能达成一致性。
问题延伸
针对拜占庭问题,有拜占庭问题的容错算法(PBFT)来解决这一问题,大致要通过下面三个阶段来达成共识:Pre-Prepare,Prepare,Commit。该算法主要是为了解决网络通信可靠,如果有一个节点宕机了,其它节点能够达成一致。
在分布式系统中有普通容错和拜占庭容错,普通容错容忍不超过一半的故障节点,拜占庭容错容忍不超过1/3的故障节点。