虽然在之前的博客中,我也有写过类似的,拜占庭将军问题。但是,个人认为这是我看过介绍的最好的。推荐给你们!


拜占庭将军问题(The Byzantine Generals Problem)提供了对分布式共识问题的一种情景化描述,由Leslie Lamport等人在1982年首次发表。论文《The Byzantine Generals Problem 》同时提供了两种解决拜占庭将军问题的算法:

  • 口信消息型解决方案(A solution with oral message);

  • 签名消息型解决方案(A solution with signed message).

论文:

https://www-inst.eecs.berkeley.edu/~cs162/sp16/static/readings/Original_Byzantine.pdf

本文之后将详细讲述这两种算法。事实上,拜占庭将军问题是分布式系统领域最复杂的容错模型, 它描述了如何在存在恶意行为(如消息篡改或伪造)的情况下使分布式系统达成一致。是我们理解分布式一致性协议和算法的重要基础。

拜占庭将军问题描述

拜占庭将军问题描述了这样一个场景:

图1. 拜占庭将军问题

拜占庭帝国(Byzantine Empire)军队的几个师驻扎在敌城外,每个师都由各自的将军指挥。将军们只能通过信使相互沟通。在观察敌情之后,他们必须制定一个共同的行动计划,如进攻(Attack)或者撤退(Retreat),且只有当半数以上的将军共同发起进攻时才能取得胜利。然而, 其中一些将军可能是叛徒,试图阻止忠诚的将军达成一致的行动计划。 更糟糕的是,负责消息传递的信使也可能是叛徒,他们可能篡改或伪造消息,也可能使得消息丢失。

为了更加深入的理解拜占庭将军问题,我们以三将军问题为例进行说明。当三个将军都忠诚时,可以通过投票确定一致的行动方案,图2展示了一种场景, 即General A,B通过观察敌军军情并结合自身情况判断可以发起攻击,而General C通过观察敌军军情并结合自身情况判断应当撤退。 最终三个将军经过投票表决得到结果为进攻:撤退=2:1, 所以将一同发起进攻取得胜利。对于三个将军,每个将军都能执行两种决策(进攻或撤退)的情况下, 共存在6中不同的场景,图2是其中一种,对于其他5中场景可简单地推得,通过投票三个将军都将达成一致的行动计划。

图2. 三个将军均为忠诚的场景

当三个将军中存在一个叛徒时,将可能扰乱正常的作战计划。图3展示了General C为叛徒的一种场景,他给General A和General B发送了不同的消息,在这种场景下General A通过投票得到进攻:撤退=1:2,最终将作出撤退的行动计划;General B通过投票得到进攻:撤退=2:1,最终将作出进攻的行动计划。结果只有General B发起了进攻并战败。

图3. 二忠一叛的场景

事实上,对于三个将军中存在一个叛徒的场景,想要总能达到一致的行动方案是不可能的。详细的证明可参看Leslie Lamport的论文。此外,论文中给出了一个更加普适的结论:如果存在m个叛将,那么至少需要3m+1个将军,才能最终达到一致的行动方案。

解决方案

Leslie Lamport在论文中给出了两种拜占庭将军问题的解决方案,即口信消息型解决方案(A solution with oral message)和签名消息型解决方案(A solution with signed message)。

1、口信消息型解决方案

首先, 对于口信消息(Oral message)的定义如下:

  • A1. 任何已经发送的消息都将被正确传达;

  • A2. 消息的接收者知道是谁发送了消息;

  • A3. 消息的缺席可以被检测。

基于口信消息的定义,我们可以知, 口信消息不能被篡改但是可以被伪造。基于对图3场景的推导,我们知道存在一个叛将时,必须再增加3个忠将才能达到最终的行动一致。为加深理解,我们将利用3个忠将1个叛将的场景对口信消息型解决方案进行推导。在口信消息型解决方案中,首先发送消息的将军称为指挥官,其余将军称为副官。对于3忠1叛的场景需要进行两轮作战信息协商,如果没有收到作战信息那么默认撤退。图4是指挥官为忠将的场景,在第一轮作战信息协商中,指挥官向3位副官发送了进攻的消息;在第二轮中,三位副官再次进行作战信息协商,由于General A、B为忠将,因此他们根据指挥官的消息向另外两位副官发送了进攻的消息,而General C为叛将,为了扰乱作战计划,他向另外两位副官发送了撤退的消息。最终Commanding General, General A和B达成了一致的进攻计划,可以取得胜利。

图4. 指挥官为忠将的场景

图5是指挥官为叛将的场景,在第一轮作战信息协商中,指挥官向General A、B发送了撤退的消息,但是为了扰乱General C的决定向其发送了进攻的消息。在第二轮中,由于所有副官均为忠将,因此都将来自指挥官的消息正确地发送给其余两位副官。最终所有忠将都能达成一致撤退的计划。

图5. 指挥官为叛将的场景

如上所述,对于口信消息型拜占庭将军问题,如果叛将人数为m,将军人数不少于3m+1,那么最终能达成一致的行动计划。值的注意的是,在这个算法中,叛将人数m是已知的,且叛将人数m决定了递归的次数,即叛将数m决定了进行作战信息协商的轮数,如果存在m个叛将,则需要进行m+1轮作战信息协商。这也是上述存在1个叛将时需要进行两轮作战信息协商的原因。

2、签名消息型解决方案

同样,对签名消息的定义是在口信消息定义的基础上增加了如下两条:

  • A4. 忠诚将军的签名无法伪造,而且对他签名消息的内容进行任何更改都会被发现;

  • A5. 任何人都能验证将军签名的真伪。

基于签名消息的定义,我们可以知道,签名消息无法被伪造或者篡改。为了深入理解签名消息型解决方案,我们同样以3三将军问题为例进行推导。 图6是忠将率先发起作战协商的场景,General A率先向General B、C发送了进攻消息,一旦叛将General C篡改了来自General A的消息,那么General B将将发现作战信息被General C篡改,General B将执行General A发送的消息。

图6. 忠将率先发起作战协商

图7是叛将率先发起作战协商的场景,叛将General C率先发送了误导的作战信息,那么General A、B将发现General C发送的作战信息不一致,因此判定其为叛将。可对其进行处理后再进行作战信息协商。

图7. 叛将率先发起作战协商

签名消息型解决方案可以处理任何数量叛将的场景。

总 结

在分布式系统领域, 拜占庭将军问题中的角色与计算机世界的对应关系如下:

  • 将军, 对应计算机节点;

  • 忠诚的将军, 对应运行良好的计算机节点;

  • 叛变的将军, 被非法控制的计算机节点;

  • 信使被杀, 通信故障使得消息丢失;

  • 信使被间谍替换, 通信被攻击, 攻击者篡改或伪造信息。

如上文所述,拜占庭将军问题提供了对分布式共识问题的一种情景化描述,是分布式系统领域最复杂的模型。此外, 它也为我们理解和分类现有的众多分布式一致性协议和算法提供了框架。现有的分布式一致性协议和算法主要可分为两类:

一类是故障容错算法(Crash Fault Tolerance, CFT), 即非拜占庭容错算法,解决的是分布式系统中存在故障,但不存在恶意攻击的场景下的共识问题。也就是说,在该场景下可能存在消息丢失,消息重复,但不存在消息被篡改或伪造的场景。一般用于局域网场景下的分布式系统,如分布式数据库。属于此类的常见算法有Paxos算法、Raft算法,、ZAB协议等。

一类是拜占庭容错算法,可以解决分布式系统中既存在故障,又存在恶意攻击场景下的共识问题。一般用于互联网场景下的分布式系统,如在数字货币的区块链技术中。属于此类的常见算法有PBFT算法、PoW算法。

看完本文,你对这两种解决方案有什么看法?欢迎在评论区跟我们讨论!

这怕是我看过的最好的关于 “ 拜占庭将军问题 ” 的文章相关推荐

  1. 看这篇就够了!一文读懂拜占庭将军问题

    作者 | Yu Liebing 责编 | Carol 出品 | 区块链大本营(ID:blockchain_camp) 拜占庭将军问题(The Byzantine Generals Problem)提供 ...

  2. 看了一篇关于游戏外挂类型总结的文章,感觉很有用,离我还很远。。

    看了一篇关于游戏外挂类型总结的文章,感觉很有用,离我还很远.. 网络游戏安全小议(端游/页游/手游) 一.网络游戏安全很有趣 一直很想知道魔兽的游戏安全工程师是如何做游戏安全的,毫无疑问,魔兽是目前最 ...

  3. vue拦截器的使用(萌新怕不懂的看过来)

    由于我是第一次使用这个东西,我看到拦截器这个高大上的名字就感觉到害怕,所以做了这么多项目也怕接触这个东西,现在想到接口要进行处理,并且集中放置,所以利用了最近刚学的番茄时钟工作法,开了一个番茄,告诉自 ...

  4. 看故事学知识,这篇Java代理的文章妙啊!

    这是我的第 208 期分享 作者 | java金融 来源 | java金融(ID:java4299) 分享 | Java中文社群(ID:javacn666) 什么是代理 代理模式是常用的java设计模 ...

  5. 每天看了哪些技术点,都记录在该文章下面,时常回过头来看看。

    2012.12.10 今天看了YQBlog.edmx这个文件, <add name="YQBlogEntities" connectionString="metad ...

  6. 计算机bios设置论文,玩转电脑必看知识——各种BIOS设置详解 的更多相关文章

    7.IDE Primary Master UDMA(第一个IDE主控制器下的UDMA模式) 8.IDE Primary Slave UDMA(第一个IDE从控制器下的UDMA模式) 9.IDE Sec ...

  7. paddle 标注_一看就会,手把手教你编程,批量文章标注拼音(附源码)

    文/IT可达鸭 图/IT可达鸭.网络 前言 是不是学了Python之后,苦于没有项目练手?是不是看了很多关于编程视频,等到自己动手时,却怎么也做不出一个项目? 工作在一线的老程序员告诉你,别慌,让我手 ...

  8. 年轻人为什么不看百趣代谢组学2022年高分项目文章精选集锦

    在这过去的半年里,虽然在疫情反复无常,但是老师们并未停止科研的步伐,文章大放异彩,绽放在各大主流期刊. 编辑搜图 请点击输入图片描述(最多18字) ​BIOTREE今年协助客户在代谢组学.蛋白质组学和 ...

  9. *一篇看了心有所感且文风特别好的文章**

    愿你 亲爱的自己: 我不知道为什么写信给你,更不知道你何时能收到这封信,在这里有些愿望寄托于你. 首先愿你平安无事地度过青春期,但别平安无事地度过青春.你不是他们口中的乖乖女,这点我比谁都清楚,你有时 ...

最新文章

  1. Google经典面试题解析
  2. [JDBC技术]3.JDBC数据库连接池实例
  3. 牛客网NOIP赛前集训营-提高组(第六场)B-选择题
  4. 有关Non-cacheable,,Cacheable, non-shareable,inner-shareable,outer-shareable的理解
  5. 干货!不得不知的UI界面中“行为召唤按钮”设计秘诀
  6. 光流 | OpenCV中的Lucas-Kanade光流与稠密光流:基于Opencv+Python(附代码)
  7. TensorFlow 2.x GPU版在conda虚拟环境下安装步骤
  8. n条直线相交最多有几个邻补角_【初中数学】102条做初中几何辅导线的规律
  9. 教程 | Hadoop集群搭建和简单应用
  10. php使用自定义alert,IOS_iOS自定义alertView提示框实例分享,本文实例为大家分享iOS自定义a - phpStudy...
  11. HTML5本地存储详解
  12. 关于linux文件系统出现脏数据修复的思路
  13. 运维学习部分基础知识概括
  14. Pentaho Report Designer
  15. 计算机专业简历教育背景怎么写,简历中的教育背景应该怎么写
  16. 各种显示接口DBI、DPI、LTDC、DSI、FSMC
  17. 使用CefSharp开发一个12306“安心刷票弹窗通知”工具
  18. 年终囍一批、愁一批......浮躁啊,眼红啊,这个真有
  19. 还说治理类项目不性感?这个DAO上线半年吸金700万美元
  20. Android 中光线传感器的使用详解

热门文章

  1. CodeForces - 1480C Searching Local Minimum(交互+二分)
  2. SPOJ - IITKWPCE Let us play with strings(回文自动机+Palindrome Series优化dp)
  3. CodeForces - 1036B Diagonal Walking v.2(思维)
  4. HDU - 6514 Monitor(二维差分)
  5. UVA1601The Morning after Halloween 单向加双向bfs
  6. linux设置光标位置,linux下光标定位和输出颜色设置
  7. 我国计算机网络事业发展,金标尺公考
  8. 剑指 Offer II 014. 字符串中的变位词
  9. 伯努利数与自然数幂和
  10. 源码免杀-过启发式的思路