拜占庭将军问题

news2024/9/21 12:34:10

前言

在分布式系统中交换信息, 部分成员可能出错导致发送了错误的信息, 在这种情况下如何达成共识. 这就是拜占庭将军问题所要解决的.

问题的简要描述如下:

  1. 3个军队协同作战(为了简单易懂, 以3个军队描述)
  2. 每支军队的作战策略有两种"进攻"和"撤退"
  3. 每个军队之间通过信使传递消息
  4. 问: 如何达成共识制定统一的作战策略呢?

简单, 只要他们两两交换信息, 然后少数服从多数就可以咯.

image-20230102112730121

交换信息之后, 每人收到的进攻:撤退=2:1, 则最终统一策略进攻.

但是, 在拜占庭将军问题中, 可能会有错误信息, 也就是叛军的出现. 如果B发送信息时做了手脚, 分别发送不同的策略:

image-20230102113216010

这样一来, A收到的进攻:撤退=2:1, 最终决定进攻. 而C收到的进攻:撤退=1:2, 最终决定撤退. 就会导致最终行为不一致了.

上面这个行为对应到计算机系统中, 将军就是计算机, 消息的传递对应了通讯系统, 叛军则对应了恶意节点.

那么对应到计算机领域中, 描述的就是这样一个问题: 在分布式系统中, 可能存在故障节点, 也可能存在恶意节点, 如何保证系统行为的一致性.

如何解决这个困境呢?

口信消息

在这篇论文中描述了这个问题并给出了作者的解决方案(全英文我也没咋看懂).

在这里就是再增加一个军队, 然后首先发出指令的是指挥官, 指挥官负责下发作战指令, 下属部队接收后再进行信息交换, 判断大家接收到的指令是否一致. 流程大致如下:

image-20230102114442137

其中在第二步交换少数服从多数, 是为了防止指挥官是叛军, 给大家发送了不同的指令.

如此一来, 无论ABCD 哪个出现问题, 另外3个都可以保持相同的策略. (你可以尝试着令其中任意一个叛变).

为什么要4个军队??

如果是3个军队的话, 其中C是叛军, 那么可能出现这样的情况:

image-20230102165357840

C收到进攻的命令后, 故意在信息交换时发送撤退. 此时, B收到的命令就是进攻:撤退=1:1. 无法抉择AC哪个有问题, 最终会导致AB采用不同的策略. (若A是叛军同理)

从这里可以看出, 当军队数量为4时, 叛军数量不能大于1. 或者用论文中的结论: 若叛军数量为 m, 则将军数量需大于3m.

2个叛军的情况

根据之前的描述, 若叛军数量为2, 则将军数量最少为7. 在这种情况下如何保证行为的一致性呢?

第一步: 指挥官先下发本次作战指令:

image-20230102173236220

但是很不幸, 其中A/B都是叛军. 此时, 若仍然按照上面所述进行在下属不对中进行情报交换, 则可能出现这样的情况(其中B也是叛军, 会传递错误情报):

  • C收到的情报, 进攻的: A/B/D/G, 撤退的: E/F, 则最终进攻
  • E收到的情报, 进攻的: C/D/G, 撤退的: A/B/F. 票数持平
  • 最终会导致CE的决策不一致.

那么如何处理这种情况呢? 嵌套交换情报, 这里拿C举例, C为了确保D发送给自己的情报准确, 会询问每个人D发出的情报是什么:

image-20230102174943675

C获取D的情报时, 其实就相当于将D当做了指挥官, 下属又交换了一轮情报.

如此一来, C获取到的情报中, B可能是进攻, 也可能是撤退, 如果B=进攻, 则进攻:撤退=4:2(还有 A 的一票为进攻), 最终进攻. 若B=撤退, 则进攻:撤退=3:3. 未选出结果. 可以重新选择指挥官再次投票.

那么每个人收到的命令可能不一致么? 依据少数服从多数, DEFG的结果可能是正确的. 对于B来说, 无论他发送给他人的策略是什么, 经过这一轮协商, 大家最终会得到一个统一的策略.

如果叛军不是指挥官呢?, 你可以尝试一下, 结果更为清晰, 且不会出现平票的情况.

多个叛军的情况

在2个叛军的情况下, 进行了2轮协商拿到了最终的决策. 如果叛军数量是 m, 则需要协商 m 轮才能得出结论. 碍于篇幅, 在这里就不细述了.

从这里也能看出这个算法的效率并不高, 随着叛军数量的增加, 算法的效率也会随之变动.

消息签名

有关数字签名的原理可查看这篇文章.

思路也很简单, 在每个消息中增加签名信息, 保证消息无法伪造. 还是回到上面的消息传递场景, 交换流程大致如下:

image-20230102120109957

因为消息中带有签名信息, 他人无法伪造. 因此:

  1. B出现问题, 篡改了A的消息, 则C立即会发现
  2. A出现问题, 发送给两人不同的指令, 则B/C便会发现. 此时可以先解决叛军, 再重新商议.
  3. A/B都出现问题了, 系统中超过半数都是恶意节点, 已然不正常了.

如果在环境中各个节点都是可以信赖的, 不存在篡改消息或伪造消息等恶意行为, 推荐使用非拜占庭算法, 即故障容错算法. 在这种环境中, 可能存在消息丢失/重复 等问题, 但不会发生消息的篡改. (这种算法后面有时间再研究)

但是可能存在恶意节点的系统中(比如区块链), 就必须使用拜占庭算法了.

针对拜占庭问题, 大佬们又陆续提出了些其他的解决方案, 比如FTMP, BFT 等. 不过我只是为了涉猎, 没有深入了解.


原文地址: https://hujingnb.com/archives/881

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/134838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SparkLaunch提交Spark任务到Yarn集群

SparkLaunch提交任务1.提交Spark任务的方式2.SparkLaunch 官方接口3.任务提交流程及实战1.提交Spark任务的方式 通过Spark-submit 提交任务通过Yarn REST Api提交Spark任务通过Spark Client Api 的方式提交任务通过SparkLaunch 自带API提交任务基于Livy的方式提交任务&#xf…

深拷贝浅拷贝的区别?如何实现一个深拷贝

一、数据类型存储 前面文章我们讲到,JavaScript中存在两大数据类型: 基本类型引用类型 基本类型数据保存在在栈内存中 引用类型数据保存在堆内存中,引用数据类型的变量是一个指向堆内存中实际对象的引用,存在栈中 二、浅拷贝…

【2】SCI易中期刊推荐——遥感图像领域(2区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

2022年最有开创性的10篇AI论文总结

2022年随着聊天GPT和Mid - journey和Dall-E等图像生成器的流行,我们看到了整个人工智能领域的重大进展。在人工智能和计算机科学的时代,这是令人振奋的一年。本文我们总结了在2022年发表的最具开创性的10篇论文,无论如何你都应该看看。 1、Al…

Apache Calcite初识

Calcite原理和代码讲解(一) https://blog.csdn.net/qq_35494772/article/details/118887267quickstart:Apache Calcite精简入门与学习指导 https://blog.51cto.com/xpleaf/2639844quickstart:多源数据的关联 csv和mem数据类型 https://cloud.tencent.com/developer/article/162…

【Javassist】快速入门系列14 使用Javassist导入包路径

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

CSS复习(一)

CSS复习1.前言2. CSS介绍2.1 CSS的引入方式2.2 选择器2.2 颜色的赋值方式3. 补充4.display4.1 盒子模型4.1.1 盒子模型之宽高盒子模型之外边距盒子模型之边框盒子模型之内边距4.2 文本问题1.前言 首先补充一下部分相关知识: 分区标签自身没有显示效果,…

【算法】kmp、Trie、并查集、堆

文章目录1.kmp2.Trie3.并查集4.堆1.kmp KMP 的精髓就是 next 数组:也就是用 next[j] k;简单理解就是:来保存子串某个位置匹配失败后,回退的位置。 给定一个字符串 S,以及一个模式串 P,所有字符串中只包含大小写英文字…

大文件上传如何做断点续传

大文件上传如何做断点续传 一、是什么 不管怎样简单的需求,在量级达到一定层次时,都会变得异常复杂 文件上传简单,文件变大就复杂 上传大文件时,以下几个变量会影响我们的用户体验 服务器处理数据的能力请求超时网络波动 上…

信息安全3——数字签名和认证

1 )签名:手写签名是被签文件的物理组成部分,而数字签名不是被签消息的物理部分,因而需要将签名连接到被签消息上。 2 )验证:手写签名是通过将它与其它真实的签名进行比较来验证而数字签名是利用已经公开的验…

年终总结(我心飞翔向)

2022 年度个人总结(自由向) 前奏 其实在2021年12月底考研前就回家了,回家做毕设。他们考研的那几天回了中北,参加了党支部会议,见证了一批同学的转预转正;收拾了一大波衣服,因为我已经提前想到…

Git(三) - Git 常用命令

一、设置用户签名 说明: 签名的作用是区分不团操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。GIT 首次安装必须设置一下用户签名,否则无法提交代码。 注意: 这里设置用户前面和将来登录…

微机原理真题2019年,错题整理

目录 2019年 填空 编程 1​编辑 2 3 练习册的题 2019年 1:在计算机中能够在一组信息中取出所需要的一部分信息的器件是() A:触发器 B:寄存器 C:译码器 D:锁存器 2:宏汇编程序中一般由3个段组成,这三…

FreeRTOS实验使用01

1:vTaskList的使用 我使用的时候,如果把pcWriteBuff定义在任务中,程序会卡死,不信你可以尝试一下,所以我就把pcWriteBuff定义到了全局中,才能使用 2:队列问题 场景:创建3个格子的队…

搜狗 workflow异步调度框架(二)HTTP客户端

1.避免进程提前终止 由于任务的启动是异步的,所以任务的执行和主线程的执行是并行的,如果不加任何的控制,那么当主线程执行完所有操作以后直接退出,并且导致整个进程的终止。 WFFacilities::WaitGroup 可以根据情况阻塞线程或者恢…

DDR3 数据传输 (六)

引言 前文链接: DDR3 数据传输 (一) DDR3 数据传输 (二) DDR3 数据传输 (三) DDR3 数据传输 (四) DDR3 数据传输 (五) 本文在前文设计的基础上,给出板级验证。<

Spring Boot MongoDB 入门

1. 概述 2. 快速入门 3. 基于方法名查询 4. 基于 Example 查询 5. MongoTemplate 6. 自增主键 666. 彩蛋 1. 概述 可能有一些胖友对 MongoDB 不是很了解&#xff0c;这里我们引用一段介绍&#xff1a; FROM 《分布式文档存储数据库 MongoDB》 MongoDB 是一个介于关系数据…

《计算机视觉》:角点检测与图像匹配

文章目录 任务一:基本处理-Harris角点检测原理代码结果与分析任务二:SIFT算法原理代码结果与分析任务一:基本处理-Harris角点检测 数据:棋盘图片 要求:自己写函数实现Harris角点检测子,设置不同参数,比较检测结果 边缘检测子:sobel检测子 响应函数参数alpha:0.05 参数…

【JavaScript】BOM 概念及相关操作

文章目录【JavaScript】BOM 概念及相关操作一. BOM概念BOM可以操作的内容二.window内置对象和属性(1) 获取浏览器窗口的尺寸(2) 获取文档窗口的尺寸(3) 浏览器的常见事件(4) 浏览器的历史记录(5) 浏览器的标签页(6) 浏览器卷去的尺寸(7) 浏览器滚动到的位置浏览器滚动到的位置案…

ARM 按键轮询编程实战

一、什么是按键 1、按键的物理特性 平时没人按的时候&#xff0c;弹簧把按键按钮弹开。此时内部断开的。有人按下的时候&#xff0c;手的力量克服弹簧的弹力&#xff0c;将按钮按下&#xff0c;此时内部保持接通&#xff08;闭合&#xff09;状态&#xff1b;如果手拿开&…