分佈式協議之拜占庭將軍問題

什麼是拜占庭將軍問題?

拜占庭帝國軍隊的將軍們必須通過投票達成一致來決定是否對某一 個國家發起進攻。但是這些將軍在地裏位置上是分開的,並且在將軍中存在叛徒。叛徒可以通過任意行動來達到自己的目標:

  • 欺騙某些將軍採取進攻行動。

  • 促使一個不是所有將軍都統一的決定,比如將軍們本意是不希望進攻,但是叛徒可以促成進攻行動。

  • 迷惑將軍使得他們無法做出決定。

假設有 9 位將軍投票,其中 1 名叛徒。8 名忠誠的將軍中出現了 4 人投進攻,4 人投撤離的情況。

這時候叛徒可能故意給 4 名投進攻的將領送信表示投票進攻,而給 4 名投撤離的將領送信表示投撤離。這樣一來在 4 名投進攻的將領看來,投票結果是 5 人投進攻,從而發起進攻;而在4名投撤離的將軍看來則是 5 人投撤離。這樣各支軍隊的一致協同就遭到了破壞。

由於將軍之間需要通過信使通訊,叛變將軍可能通過僞造信件來以其他將軍的身份發送假投票。而即使在保證所有將軍忠誠的情況下,也不能排除信使被敵人截殺,甚至被敵人間諜替換等情況。因此很難通過保證人員可靠性及通訊可靠性來解決問題。

如何解決拜占庭將軍問題?

第一種解決方案:

如果叛將人數爲 m,將軍人數不能少於 3m + 1 ,那麼拜占庭將軍問題就能解決了。

在二忠一叛的情況下,在存在 1 位叛將的情況下,必須增加 1 位將軍,將 3 位將軍協商共識,轉換爲 4 位將軍協商共識,這樣才能實現忠誠將軍的一致性作戰計劃。

第二種解決方案:

第一種解決方案存在一個比較嚴重的問題,需要增加將軍數,我平白無故哪來的將軍給你增加?

在不增加將軍數的前提下,到底能不能解決二忠一叛的問題?答案是可以的。

前提:

  • 將軍都有一個屬於自己的簽名;

  • 將軍的簽名無法僞造,而且對他簽名消息的內容進行任何更改都會被發現;

  • 任何人都能驗證將軍簽名的真僞。

如果叛變將軍通過僞造信件來以其他將軍的身份發送假投票,其他將軍通過簽名能識別這個投票的真僞。

如果叛變將軍分別給不同將軍發送不同的作戰計劃,這時候其他將軍會發現叛變將軍的簽名信息發生了更改,就知道哪個將軍叛變了。這時候可以先處理完叛變將軍,再重新發起作戰計劃。

拜占庭將軍問題的本質是什麼?

上述的故事映射到計算機系統裏,將軍便成了計算機。拜占庭問題的本質是,由於網絡通信存在不可靠的問題,也就是可能存在消息丟失,或者網絡延遲。如何在這樣的背景下對某一個請求達成一致。

在實際工程實踐中,可以假設不存在拜占庭問題,也即假設所有消息都是完整的,沒有被篡改的,在這種情況下,則需要算法來保證一致性的問題。

擴展閱讀

拜占庭將軍問題論文

參考資料

拜占庭將軍問題 Wiki

極客時間專欄:分佈式技術原理與算法解析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章