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。沒有中文版。