两将军问题和TCP三次握手

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

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

1.双将军问题

两将军问题和TCP三次握手

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

宏观现象一: 两将军先后派遣信使,交替确认收到的攻击信息,交替确认是无止尽的,两将军不能达成共识。

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

我们意识到 即使不断确认收到对方的上一条信息, 也没办法确保对方与自己达成(同一时间攻击的共识)

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

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

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

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

2.1 霰弹打鸟

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

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

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

2.2 间歇性重试

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

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

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

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

两将军问题和TCP三次握手

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

希望大家仔细读一读。

首先我们要知道:

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

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

为了缓解双将军问题,tcp3次握手增加了超时重试的机制。

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

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

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

B会周期性超时重传,直到收到A的确认。 (实际上第一次包:A因为没有收到ACK确认,也会重传)

第三个包:即A发送给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的确认才可以发送数据。

小林coding 有一篇讲解了握手异常 很是牛叉

总结

本文记录了两将军问题:

对于不可靠信道,即使不断确认收到对方的上一条信息, 也没办法确保对方与自己达成共识。

TCP 三次握手是在两个方向确认包的序列号, 增加了超时重试, 是两将军问题的一个工程解。

(本文部分内容提炼自知乎,感谢这届网友的智慧)

Original: https://www.cnblogs.com/JulianHuang/p/16772563.html
Author: 博客猿马甲哥
Title: 两将军问题和TCP三次握手

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/801063/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 整理了27个Python人工智能库,建议收藏~

    超级无敌干货,第一时间送达!!! 为了大家能够对人工智能常用的 Python 库有一个初步的了解,以选择能够满足自己需求的库进行学习,对目前较为常见的人工智能库进行简要全面的介绍。…

    Python 2023年8月25日
    043
  • python常用modules

    python常用modules 分享下在csdn技能树(内测版)上学到的知识点,python常用module的总结: "os — 多种操作系统接口", &q…

    Python 2023年6月10日
    078
  • 【实践】随机森林算法参数解释及调优(含Python代码)

    前言 上篇文章梳理了随机森林的各理论要点,本文首先详细解释了随机森林类的参数含义,并基于该类讲解了参数择优过程。 随机森林类库包含了RandomForestClassifer类, …

    Python 2023年8月1日
    065
  • pytest学习和使用5-Pytest和Unittest中的断言如何使用?

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年9月10日
    052
  • Flask项目的部署详解

    哈喽,很高兴又见面啦,一起加油一起学习,欢迎您的关注!https://blog.csdn.net/hanhanwanghaha学习路上有您的关注是我的荣幸,一起进步是我的动力,明天…

    Python 2023年8月10日
    068
  • 一张照片,AI生成抽象画(CLIPasso项目安装使用) | 机器学习系列

    前言 ​最近看到一个比较有意思的项目,可以将照片生成对应的抽象画。 项目地址:github地址 看一下项目提供的效果图。 是不是很有意思,我果断把项目弄下来自己玩了玩。下面我分享一…

    Python 2023年10月26日
    066
  • DASCTF x SU 三月wp+复现

    之前给忘了 已经搭建新站很久了~师傅们来找我玩呀因为还没复现完就先放这里了 复现完再放新站 ezpop 直接得到源码: class crow { public $v1; publi…

    Python 2023年8月13日
    054
  • pandas读写csv和xlsx

    import pandas as pd import numpy as np 1、读写csv path = ‘…/111.csv’ 读 data = pd.read_csv(p…

    Python 2023年8月21日
    043
  • scrapy mysql 豆瓣_Scrapy爬取豆瓣电影并存入MySQL数据库

    d: 进入D盘 scrapy startproject douban 创建豆瓣项目 cd douban 进入项目 scrapy genspider douban_spider mo…

    Python 2023年10月4日
    044
  • 【Pandas】DataFrame数据的增删改

    DataFrame数据的增删改 DataFrame增加数据 * 增加一行 增加列 – 根据原有数据增加列 DataFrame修改数据 * 修改单个数据 修改一列数据 D…

    Python 2023年8月6日
    074
  • [Python + Django] Web在线考试管理系统设计及代码实现

    本文最终实现一个Web在线考试管理系统,可作为Python Web,Django的练手项目,也可以作为计算机毕设参考项目。 源码获取方式:​​​​​​​【Django】python…

    Python 2023年8月4日
    066
  • numpy pandas matplotlib 常用API整理

    python数据结构 python常用函数 numpy, pandas, matplotlib 整理python for ML常用的几个库,只是以表格形式给出,方便查阅,具体使用细…

    Python 2023年8月25日
    039
  • 修改pip安装路径的方法

    当我们需要安装python的第三方库时,通常都是打开cmd输入pip install xxx去安装。 但是默认安装路径在C盘,极大占用空间,看看我的C盘空间,已经不足了!!! 所以…

    Python 2023年8月1日
    040
  • go操作Kafka

    1. Kafka介绍 – 1.1.1. Kafka是什么 1.1.2. Kafka的特点 1.1.3. 常用的场景 1.1.4. Kafka中包含以下基础概念 1.1….

    Python 2023年10月13日
    040
  • 【django】allauth模块详解google Oauth

    因为领导提了需求,需要在完整的项目上更改用户登陆以及验证方式,由之前的LDAP改为google Oauth2的验证方式,经过一个多星期的摸索,以及查各种资料,终于搞出来了,在此做个…

    Python 2023年8月5日
    061
  • 笔记篇二:鸢尾花数据集分类

    目录 一、鸢尾花数据集 二、逻辑回归分析 三、逻辑回归实现鸢尾花数据集分类 四、散点图绘制 一、鸢尾花数据集 1、问题 Iris 鸢尾花数据集是一个经典数据集,在统计学习和机器学习…

    Python 2023年10月26日
    061
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球