2015年初时产生了一个疑问:基于不可靠的通信链路,为什么在两将军问题中永远无法达到共识,而在TCP三路握手中可以?
今天抽出了一些时间进行研究发现,实际上TCP三路握手也不是完全可靠的,只是一个近似的解决协议而已,可以看做是两将军问题的一个实际场景下的近似解决方案。
此外,两将军问题经常被与拜占庭将军问题搞混。一定要区分两个是完全不同的讨论对象。简而言之,两将军问题探讨的是不可靠信道下两方的通信准确性问题,而拜占庭将军问题探讨的是多方通信结果一致性和决策正确性的问题。
如果还不好理解,可以扣下字眼:
1. 准确性是指发送的是什么,接收的就是什么;
2. 一致性是在节点更多的情况下的准确性;
3. 正确性是无论收到的通信结果是否有干扰(不完全满足一致性),正常工作的节点能够做出正确的决策。
拜占庭将军问题难以理解的原因有很多,比如本身变体比较多(传令官背叛还是将军背叛、错误指令范围等),为了更好地理解,需要形式化的定义。其本身也有多种特定前提下的解法使用在不同场景。
推荐几个进一步理解的文章:
https://blog.csdn.net/bjweimengshu/article/details/80222416 漫画拜占庭将军问题。后面介绍的Raft算法其实只解决对应场景拜占庭将军问题中一致性的一面,而在leader节点收到client提交后未同步就发生故障的场景下,正确性不能完全保证。或许给leader收到client、同步所有follower后再给client一个回执能够提升正确性。
https://www.8btc.com/article/70370,点名了两将军问题和拜占庭将军问题的区分,也有按照作者理解的形式化定义和拜占庭问题证明思路解析,证明思路我没有细看。
http://en.wikipedia.org/wiki/Two_Generals'_Problem 两将军问题英文wiki。没有中文版。