两将军问题,又被称为两将军悖论、两军问题, 是一个经典的计算机思想实验。

首先, 为避免混淆,我们需要认识到两将军问题虽然与拜占庭将军问题相关,但两者不是一个东西。拜占庭将军问题是一个更通用的两将军问题版本, 通常在分布式系统故障容错、区块链中广泛讨论也会犹豫。

1.两将军问题

两支军队,驻扎在两个山头,准备攻击山谷里的同一伙敌人,两将军只有同时发起进攻才能获胜,两将军约定攻击时间的的唯一方式是派遣信使通过山谷,山谷处于敌占区。
如果信使被俘获了,那么攻击信息将会丢失。

现象一:A将军先派遣信使向 B 将军传递“晚上 10 点一起进攻”,但是 A 将军不知道信使能否穿越敌占区,由于担心自己成为唯一进攻方,A 将军可能会犹豫是否按计划进攻;此时 B 将军收到后可以派遣信使确认收到,B的信使也可能被俘获,由于担心A没有收到确认信号而退缩,B将军也会犹豫;再次确认也不能解决,因为再次确认的新信使也可能被俘获。因此交替确认是无止尽的。

现象二:将军A派遣信使,过了很长时间未收到回复,将军A不知道是自己的信使被俘获了还是将军B的确认信使被俘获了。

我们意识到即使双方不断确认已收到对方的上一条信息,也无法确保对方已与自己达成共识。

两将军问题是无解的,目前的tcp三次握手、四次挥手都是工程解(这个一会再聊)。

2.两将军问题的头脑风暴

许多人试图解决/缓解双将军问题,提出了一些能落地的实践。

这里我们依旧假设通道的不确定性,信使只会被俘获,但是不会叛变篡改。

2.1 霰弹打鸟

如果A将军每次派遣100名信使(编号1到100),期待B将军最差也能收到一名信使的信息。

B将军根据收到的信使数量,评估这条通道的可靠性,并根据概率也派遣合适数量的确认信使。

eg:  A将军派遣100信使,B将军收到10名信使的信息,B将军基本可确认这条信道可靠度为10%,B将军最少应派出10名信使(根据概率会有1名信使到达对岸)。

2.2 间歇性重试

霰弹打鸟的姿势太费信使了,但至少可帮助B将军提高信心,达成共识。

还有一种少费信使(并能提高将军信心)的策略,假设跨越山谷到达对岸并返回耗时20min, A将军可间隔20min派遣信使到对岸,直到收到对岸B将军的首次信使确认(就不再派遣)。

以上两种策略是对速度和成本的权衡,采用哪一种取决于哪一种更适合我们遇到的问题。

3. 为什么说tcp三次握手[1]是双将军问题的工程解?

知乎上有个问题: TCP 为什么是三次握手,而不是两次或四次?[2]
有三个回答角度。

  • • ① TCP 为什么是三次握手,而不是两次或四次?- 朋克雪球兔的回答 - 知乎[3]

  • • ② (TCP 为什么是三次握手,而不是两次或四次?- 车小胖的回答 - 知乎[4]

  • • ③ TCP 为什么是三次握手,而不是两次或四次?- wuxinliulei的回答 - 知乎[5]

希望大家仔细读一读。

首先我们要知道:

三次握手是为了在两个方向上同步(syn)序列号(seq=m),同步一次序列号需要一去一回两个包,俩方向就4个包。第2,3个包由一侧发出可以合并到一起所以最后三个包。

但是根据双将军问题,谁说一来一回两个包就能确保同步成功。

为了缓解双将军问题,tcp3次握手增加了超时重试的机制。(注意:重试只在信息同步的发起方)

第一个包:A发送给B的SYN中途丢失,没有到达B

A会周期性超时重传,直到收到B的确认。

第二个包,即是发送给A的SYN+ACK 中途丢失,没有到达A

B会周期性超时重传,直到收到A的确认,此时第一个包A也会重试SYN

第三个包:即A发送给B的ACK 中途丢失,没有到达B

A发完ACK,单方面认为tcp Established状态,而B显然认为tcp为Active状态。

a. 假定此时双方都没有数据发送,B会周期性超时重传,直到收到A的确认,收到之后B的TCP 连接也为 Established状态,双向可以发包。

b. 假定此时A有数据发送,B收到A的 Data + ACK,自然会切换为established 状态,并接受A的 Data。

c. 假定B有数据发送,数据发送不了,会一直周期性超时重传SYN + ACK,直到收到A的确认才可以发送数据。

  • • https://finematics.com/two-generals-problem/

    • https://www.bilibili.com/read/cv16604716

总结

本文记录了两将军问题: 对于不可靠信道,无数次确认都不能百分百达成可靠共识。

TCP 三次握手是在两个方向确认包的序列号, 增加了超时重试, 是两将军问题的一个工程解。(本文部分内容提炼自知乎,感谢这届网友的智慧)

  • 引用链接

[1] tcp三次握手: https://blog.csdn.net/weixin_35942339/article/details/112733885
[2] TCP 为什么是三次握手,而不是两次或四次?: https://www.zhihu.com/question/24853633/answer/573627478
[3] TCP 为什么是三次握手,而不是两次或四次?- 朋克雪球兔的回答 - 知乎: https://www.zhihu.com/question/24853633/answer/200721662
[4] (TCP 为什么是三次握手,而不是两次或四次?- 车小胖的回答 - 知乎: https://www.zhihu.com/question/24853633/answer/115173386
[5] TCP 为什么是三次握手,而不是两次或四次?- wuxinliulei的回答 - 知乎: https://www.zhihu.com/question/24853633/answer/63668444

点“戳“在看

体现态度很有必要!

两将军问题和TCP三次握手相关推荐

  1. TCP三次握手(建立连接)/四次挥手(关闭连接)

    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助. 而且对于有网络协议工程师之类笔试, ...

  2. TCP三次握手及四次挥手详细图解(转)

    1.链接:http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415.html Andrew Huangbluedrum@163.com 相对 ...

  3. 关于TCP三次握手和两次握手的思考

    关于TCP三次握手和两次握手的思考 TCP连接需要握手的原因 两次握手的可行性分析 TCP连接需要握手的原因 TCP协议是一个非常常见的全双工协议,它保证了数据的可靠传输. 使用TCP服务的程序一般需 ...

  4. 深入浅出TCP三次握手四次挥手

    每每想起TCP三次握手这个问题,就会陷入如下的困惑: var forget = ? while(forget) {百度/Google } 而重点在于forget永远等于true,无情的消耗着我这颗只有 ...

  5. TCP三次握手和四次挥手的解释

    基础知识 在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. 它们的含义是: SYN ...

  6. mysql三次握手_一文彻底搞懂 TCP三次握手、四次挥手过程及原理

    原创文章首发于公众号:「码农富哥」,欢迎收藏和关注,如转载请注明出处! TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接. 无论 ...

  7. 三次握手和四次挥手图解_图解 TCP 三次握手和四次挥手

    人到中年,难免长胖发福. 大家好,我是你们有点严肃的胖福(hu), 这里我们聊学习和工作. - 内容提要 - TCP 有 6 种标示:SYN(建立联机) ACK(确认) PSH(传送) FIN(结束) ...

  8. 淘宝二面,面试官居然把TCP三次握手问的这么详细

    TCP 的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度.看似是简单的面试问题,如果你的回答不符合面试官期待的水准,有可能就直接凉凉了. 本文 ...

  9. TCP 三次握手、四手挥手,这样说你能明白吧!

    TCP协议全称为:Transmission Control Protocol,是一种面向链接.保证数据传输安全.可靠的数据传输协议.为了确保数据的可靠传输,不仅需要对发出的每个字节进行编号确认,还需要 ...

最新文章

  1. xdoj(1187~1195 )Orz熊猫杯。
  2. 谁是中国大学理科的王者?
  3. 关于各组评价的自我评价
  4. C# NameValueCollection集合 (转)
  5. python 数据分析库_五个 Python 常用数据分析库
  6. 先天性脑部发育异常_儿童脑发育不良的3大“诱因”,若孩子出现这5种异常,要警惕...
  7. 注解Annotation的IoC:从@Autowired到@Component
  8. 这届程序员,要做好苦日子的准备了?
  9. 4.PHP核心技术与最佳实践 --- 数据库(队列)
  10. java中substring与substr的用法
  11. [JavaScript]20个优秀的Javascript导航技术
  12. 考研复试常见问题(数据库系统概论篇)
  13. 金山词霸手机版java_金山词霸手机java版
  14. c程序设计语言第五单元,一年级语文下册第五单元教案
  15. 智能控制和计算机控制的区别,智能灯光控制系统与传统灯光系统有哪些区别?...
  16. python开发office插件_看完这篇Python操作PPT总结,从此使用Python玩转Office全家桶就没有压力了!...
  17. 做实景三维项目后的一些感想
  18. 高中信息技术python及答案_高中信息技术《Python语言》模块试卷.docx
  19. 我的高中时代--2013春节回高中母校有感(时间是2013春节)
  20. 【JavaScript 逆向】极验三代滑块验证码逆向分析

热门文章

  1. 基于自研分布式内存及流数据库技术的柏睿数据宣布获2亿元C轮融资
  2. PHP socket 概述
  3. 林乐博士答南科大学子问
  4. js 轮播图中点击小圆圈图片跳到指定图片
  5. 爬取新浪微博用户的个人信息和微博内容
  6. Java踩坑笔记 —— base64转换为图片后图片显示不全
  7. constraints
  8. rabbitMQ第五种模型 --topic动态路由
  9. QU不可用计算机,Win10电脑系统属性中显示处理器和已安装的内存不可用的解决方法...
  10. Grafana可视化工具-之变量介绍