2015年初時產生了一個疑問:基於不可靠的通訊鏈路,爲何在兩將軍問題中永遠沒法達到共識,而在TCP三路握手中能夠?算法
今天抽出了一些時間進行研究發現,實際上TCP三路握手也不是徹底可靠的,只是一個近似的解決協議而已,能夠看作是兩將軍問題的一個實際場景下的近似解決方案。.net
此外,兩將軍問題常常被與拜占庭將軍問題搞混。必定要區分兩個是徹底不一樣的討論對象。簡而言之,兩將軍問題探討的是不可靠信道下兩方的通訊準確性問題,而拜占庭將軍問題探討的是多方通訊結果一致性和決策正確性的問題。對象
若是還很差理解,能夠扣下字眼:blog
1. 準確性是指發送的是什麼,接收的就是什麼;ip
2. 一致性是在節點更多的狀況下的準確性;同步
3. 正確性是不管收到的通訊結果是否有干擾(不徹底知足一致性),正常工做的節點可以作出正確的決策。cli
拜占庭將軍問題難以理解的緣由有不少,好比自己變體比較多(傳令官背叛仍是將軍背叛、錯誤指令範圍等),爲了更好地理解,須要形式化的定義。其自己也有多種特定前提下的解法使用在不一樣場景。im
推薦幾個進一步理解的文章:通信
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。沒有中文版。