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

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

1.双将军问题

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

如果信使被俘获了,那么攻击信息将会丢失。

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

微观现象二: 将军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 为什么是三次握手,而不是两次或四次?

分别从三个角度回答。

希望大家仔细读一读。

首先我们要知道:

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

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

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

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

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

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

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

第三个包:即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 三次握手是在两个方向确认包的序列号, 增加了超时重试, 是两将军问题的一个工程解。

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

两将军问题和TCP三次握手的更多相关文章

  1. TCP三次握手四次挥手详解

    转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ...

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

    TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...

  3. TCP三次握手的过程

    三次握手 下图就是wireshark抓包工具抓获的TCP连接建立的三次握手过程: http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415. ...

  4. TCP三次握手/四次挥手详解

    一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能.包含以下四个层次: 1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程 ...

  5. TCP ,UDP概念和TCP三次握手连接 的知识点总结

    OSI 计算机网络7层模型 TCP/IP四层网络模型 传输层提供应用间的逻辑通信(端到端),网络层提供的是主机到主机的通信,传输层提供的是可靠服务. TCP 中常说的握手指的是:连接的定义和连接的建立 ...

  6. Wireshark基本介绍和学习TCP三次握手

    wireshark介绍 wireshark的官方下载网站: http://www.wireshark.org/ wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示 ...

  7. iOS 开发:TCP三次握手连接

    在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...

  8. TCP三次握手原理详解

    TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族. 从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层.网络层.传输层.应用层. TCP协议:即传输控制 ...

  9. 【linux】关于TCP三次握手和四次挥手

    1.TCP是什么 关于OSI的七层模型 TCP在第四层——Transport层,第四层的数据叫Segment->报文 IP在第三层——Network层,在第三层上的数据叫Packet->数 ...

随机推荐

  1. net core天马行空系列-各大数据库快速批量插入数据方法汇总

    1.前言 hi,大家好,我是三合.我是怎么想起写一篇关于数据库快速批量插入的博客的呢?事情起源于我们工作中的一个需求,简单来说,就是有一个定时任务,从数据库里获取大量数据,在应用层面经过处理后再把结果 ...

  2. 2022-07-29 java之异常

    目录 一.异常 1. 异常的概念 2. 异常体系 3.图解异常处理的流程 4.异常处理 1.抛出异常throw 2.捕获异常try{}catch{} 3 声明异常throws 4. finally代码 ...

  3. CSS样式快速入门

    CSS样式快速入门 前言 前端基础的博客主要分为HTML.CSS和JavaScript,本类博客主要用于记录博主的学习过程和分享学习经验,由于博主学识浅薄,经验不足,难免会出现错误,欢迎大家提出问题. ...

  4. JavaScript数组方法总结,本文是根据数组原型上的方法进行总结,由于方法太多将会分篇章发布

    通过浏览器控制台 console 可查看到 Array 数组上原型的所有方法(如下图).对于原型问题此文章暂不过多叙述,单针对对象中的方法进行自我看法的总结:细心的同学可以发现对象原型上所携带的方法基 ...

  5. mysql-shell for GreatSQL 8.0.27编译安装及使用

    目录 0. 前言 1. 修改说明 2. 编译mysql-shell 2.1 环境准备 2.2 开始编译mysql & mysql-shell 2.3 利用patchelf修改mysqlsh二进 ...

  6. BMP位图之代码实现

    从16位开始,不存在调色板,顶多存在一个RGBQUAD的掩码. 16位位图,我没有拿到对应的素材,但是根据官方文档的描述和代码验证后,我总结为下: 当biCompression为BI_RGB时,此时是 ...

  7. Redis 18 Jedis

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 概述 Jedi ...

  8. dentry的引用计数不对导致的crash

    [17528853.189372] python invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=-998[17528853.189 ...

  9. 2020/12/9 酒etf

    2020/12/9 2.315建仓酒etf,之后陆续加仓,拿到年底看看 2020/12/12 2.36卖出部分,目前成本2.106,盈利百分之9.449,白酒应该是没问题,但感觉年前应该有波调整. 2 ...

  10. 【设计模式】Java设计模式 - 观察者模式

    [设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...