这是一个只要涉及两个个体之间协同工作就会遇到的基本问题。问题的名字叫“两军问题”。

什么是两军问题?

先来看看什么是两军问题。

两个将军 A1 和 A2 决定攻打同一个敌人 B ,任一方都没有敌人强大,所以只有共同进攻才有胜算。敌军正好位于两个将军之间,意味着信使可能会被敌军抓住。两军问题指的就是在这样的条件下两个将军如何就是否进攻达成共识。下面的图片来自维基百科https://en.wikipedia.org/wiki/Two_Generals%27_Problem 。

这个问题没有乍看起来那么简单。将军 A1 给将军 A2 送信说明天进攻。这样,信使出发后,A1 是没有办法去确认信使是不是真的把信送到了的。这样 A1 就会选择不进攻,因为他怕到时候进攻的只有他自己。要让事情确定一些,A2 需要收到信之后给 A1 一个确认信息,说“我已经收到了你给我的要明天进攻的信息了”。信使在给 A1 送信路上也可能会被抓,这样, A2 会倾向于不进攻,因为他知道 A1 如果收不到他的确认信息是不会发动进攻的。

所以这里的逻辑顺推下来,不管双方试图确认多少次,都不能最终确认跟彼此达成了共识。每个将军都会怀疑最后的那条信息是否送到了。两军问题有被称为“两军悖论”,是一个无解问题。

计算机网络的两军问题

两军问题是计算机科学领域的一个思想实验。主要揭示了在连接不可靠的情况下,去协同行动有多么的难。

所谓连接不可靠,指的就是网络上两个节点,也就是两台计算机直接通信是随时有可能失败的。而互联网其实恰巧就是这么一个连接不可靠的网络。两军问题和拜占庭将军问题都是计算机网络课程的常见内容,用来揭示为何 TCP 协议不可能保证两个网络终端之间的状态是一致的。举个例子,通过互联网连接的两台计算机的屏幕上,要想百分百保证随时都显示相同的字符,是不可能的。

这里插一句,两军问题无解,而拜占庭将军问题是两军问题的一个泛化,所以也就意味着拜占庭将军问题在一个随时都会发生任意错误的网络上也是无解问题。换句话说就是拜占庭将军问题在互联网上是无解的。比特币使用的 POW 解决了拜占庭将军问题,是通过添加了经济激励这一层。

认识到去中心化网络的这种不确定性,是理解所有网络行为的基础。

工程上采用的解决方案

但是理论上无解的问题,工程上依然可以给出一个足够好的解决方案。

解决两军问题的工程思路就是接受不确定性这个事实,但是努力把不确定性控制到一个可以接受的程度。例如,我们可以让将军 A1 发出一百个信使送信,那么信使全部都被抓住的可能性就很小了。这样,A1 自己决定进攻,A2 只要收到哪怕一个信使的信息也会进攻。这就是一个足够好的解决方案了。

工程上,TCP 协议需要三次握手来建立连接,也是为了降低不确定性。但是总体而言,TCP 是不完全可靠的协议,所以互联网是一个不完全可靠的网络。

总结

关于两军问题,我们就聊到这里。两军问题是两个将军如何在通信通道不安全的条件下协同进攻的问题,是计算机网络的基本问题。两军问题无解,导致去中心化网络上的通信本身就不会绝对安全,但是工程上却可以通过巧妙的协议设计来把不确定性降低到一个可以接受的程度。通过两军问题,也可以看出去中心化和去信任的难度。

参考: