当前位置: 首页 > news >正文

两军对垒问题及个人的思考

在 Andrew S. Tanenbaum著的《计算机网络》中,为了描述计算机通信的不确定性,他曾在上面提出这样一个问题——两军对垒问题

🍉请先看一下什么是两军对垒问题:

🌍一支白军被围困在一个山谷中,两旁的山上都是蓝军,白军的实力超过了任何一支蓝军单独的力量,但是两支蓝军合起来的力量却超过了白军。如果任何一支蓝军单独发起进攻,则它将被白军击败,然而,如果两支蓝军同时发动进攻,则它们将会取得胜利。

✌两支蓝军希望能够同时发动进攻,然而,它们唯一的通信介质是派士兵穿过山谷传递信息,而在穿越山谷时士兵可能被白军抓住,从而丢失信息(即它们必须使用一条不可靠的通信信道),现在的问题是:是否存在一个让蓝军获胜的协议?

🌳假如蓝军1号的指挥官发送这样一条消息:" 我建议我们在3月29日的黎明时发起进攻。怎么样?‘’现在假设该消息到达了蓝军2号,2号指挥官同意了这一建议,并且他的回信安全的到了蓝军1号,进攻会如期进行吗?
在这里插入图片描述

💜可能不会,因为蓝军2号指挥官并不知道他的回信是否能送到,如果回信没有送过去,蓝军1号将不会发动进攻,所以对他来说,贸然发动进攻将是十分愚蠢的。

💪假如我们进行改进,建议发起方必须对应答消息进行确认
在这里插入图片描述

🍀假设没有消息丢失,蓝军2号将得到确认:但是蓝军1号指挥官现在就会犹豫,因为他不知道他的确认信息是否发送过去了,如果确认信息没有送到蓝军2号,他发动进攻就会全军覆没。

💪假如我们再进行改进,接受方必须对发送方的应答进行确认
在这里插入图片描述

🌵假如没有信息丢失,蓝军1号得到确认:但是蓝军2号指挥官同样会犹豫,因为他不知道他的确认消息是否发送过去了。如果确认消息没有到,那么他发动进行就会全军覆没。

🏅实际上,可以证明完成这一任务的协议并不存在,我们使用反证法,假如存在一个这个协议,如果我们从协议中去掉所有无关紧要的信息,这样我们得到的协议中每条消息都是至关重要的,如果最后一条消息没被发送过去呐,我们刚才说过,它是至关重要的,如果它丢失了,则进攻就不会如期进行,同时由于最后一条消息的发送者永远不知道他发送的消息是否能正确的到达,所有他也不会贸然发动进攻。同时,另一支蓝军也会对此猜疑,所以他也不会贸然发动进行。

我们把这个问题与断开连接进行类比,用"断开连接"来替代 “发动进攻”,即可以得出结论,如果任何一方要在确定另一方做好了断开连接的准备之后才断开连接,那么断开连接的操作永远不会发生

所以在TCP断开连接时,是由某一端独立的决定是否要断开连接。

📢由这个问题我们可以得到一个结论:通信本身就是具有不确定性的,而对于TCP来说,它也不是一个绝对可靠的协议,它只是通过确认,重传哪些机制,把它的不确定性变到一个可接受的范围。

相关文章:

  • HDFS的启动流程和HA
  • ISP算法----AWB总结及源代码
  • 【Java基础(六)】面向对象与类的基础知识
  • Python爬虫——BeautifulSoup的基本使用
  • Acwing 802. 区间和
  • 传统方式连接数据库的弊端和数据库连接池原理
  • 什么叫 “雪碧图”?
  • 公众号网课搜题题库使用方法
  • Excel中身份证号码相关操作详解
  • 如何用4行 C 代码实现一个跨平台的命令行 mp3 播放器
  • ES 查询用法
  • golang泛型
  • 如何快速安装JDK 1.8 以及配置环境变量
  • DataGrip 如何导出和恢复整个数据库数据,使用单个 SQL 文件
  • 基于SpringBoot+MyBatisPlus+DynamicDatasource+mysql的多数据源本地事务方案
  • $translatePartialLoader加载失败及解决方式
  • 78. Subsets
  • Android系统模拟器绘制实现概述
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • python docx文档转html页面
  • React 快速上手 - 07 前端路由 react-router
  • SpringCloud集成分布式事务LCN (一)
  • vue.js框架原理浅析
  • Vue.js源码(2):初探List Rendering
  • 聊聊directory traversal attack
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 通过npm或yarn自动生成vue组件
  • 第二十章:异步和文件I/O.(二十三)
  • ​2020 年大前端技术趋势解读
  • # 飞书APP集成平台-数字化落地
  • #define、const、typedef的差别
  • #图像处理
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (十八)三元表达式和列表解析
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .gitignore
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net(C#)中String.Format如何使用
  • .NET命名规范和开发约定
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • ::前边啥也没有
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ActionScript][AS3]小小笔记
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [C#]C#学习笔记-CIL和动态程序集
  • [C语言]——函数递归
  • [Electron]ipcMain.on和ipcMain.handle的区别