ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
二将军问题是网络领域的一个经典问题,用于表达计算机网络中互联协议设计的微妙性和复杂性。这里给出一个二将军问题的简化版本: 一支白军被围困在一个山谷中,山谷的左右两侧是蓝军。困在山谷中的白军人数多于山谷两侧的任意一支蓝军,而少于两支蓝军的之和。若一支蓝军对白军单独发起进攻,则必败无疑;但若两支蓝军同时发起进攻,则可取胜。两只蓝军的总指挥位于山谷左侧,他希望两支蓝军同时发起进攻,这样就要把命令传到山谷右侧的蓝军,以告知发起进攻的具体时间。假设他们只能派遣士兵穿越白军所在的山谷(唯一的通信信道)来传递消息,那么在穿越山谷时,士兵有可能被俘虏 ![](https://img.kancloud.cn/d1/89/d1895f0a7c98352b39481dda696e1050_390x732.png) ![](https://img.kancloud.cn/d1/89/d1895f0a7c98352b39481dda696e1050_390x732.png) ![](https://img.kancloud.cn/d1/89/d1895f0a7c98352b39481dda696e1050_390x732.png) 只有当送信士兵成功往返后,总指挥才能确认这场战争的胜利(上方图)。现在问题来了,派遣出去送信的士兵没有回来,则左侧蓝军中的总指挥能不能决定按命令中约定的时间发起进攻? 答案是不确定,派遣出去送信的士兵没有回来,他可能遇到两种状况: 1)命令还没送达就被俘虏了(中间图),这时候右侧蓝军根本不知道要何时进攻; 2)命令送达,但返回途中被俘虏了(下方图),这时候右侧蓝军知道要何时进攻,但左侧蓝军不知道右侧蓝军是否知晓进攻时间 类似的问题在计算机网络中普遍存在,例如发送者给接受者发送一个 HTTP 请求,或者 MySQL 客户端向 MySQL 服务器发送一条插入语句,然后超时了没有得到响应。请问服务器是写入成功了还是失败了?答案是不确定,有以下几种情况: 1)可能请求由于网络故障根本没有送到服务器,因此写入失败; 2)可能服务器收到了,也写入成功了,但是向客户端发送响应前服务器宕机了; 3)可能服务器收到了,也写入成功了,也向客户端发送了响应,但是由于网络故障未送到客户端。 无论哪种场景,在客户端看来都是一样的结果:它发出的请求没有得到响应。为了确保服务端成功写入数据,客户端只能重发请求,直至接收到服务端的响应。 类似的问题问题被称为网络二将军问题