两将军问题和TCP三次握手

6871e7fff94431bc7286d6c2962cf49f.gif

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

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

1.两将军问题

65a77d199071188a8148aaf76f4214b3.png

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

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

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

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

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

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

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

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

f1256610ece593b73f04383459eaf497.gif

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]是双将军问题的工程解?

4c477f4863dcc89622979ac4d1906831.png

知乎上有个问题: 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

点“d7b47663a5633b58b0b6ce96abd72dc8.gif戳“在看a3a8fceb8eddcaeca59022db82d61925.gif

体现态度很有必要!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发系列五:微信小程序中如何响应用户输入事件

2019独角兽企业重金招聘Python工程师标准>>> 微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序…

理解Object.defineProperty的作用

Object.defineProperty 是vue中双向绑定的基础。vue是通过数据劫持的方式来做数据绑定的,最核心的方法是通过 Object.defineProperty()方法来实现对属性的劫持,达到能监听到数据的变动。要实现数据的双向绑定, 当使用存取器描述属性的特性的时…

java.lang包有哪些类_Java中Lang包的工具类有哪些

Java中Lang包的工具类有哪些发布时间:2020-12-08 16:15:36来源:亿速云阅读:76作者:Leah今天就跟大家聊聊有关Java中Lang包的工具类有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总…

直播修仙:使用.NET 的 WebView2 如何获取请求的响应内容,以微信直播的互动直播为例...

背景近几年直播行业快速发展,门槛也越来越低,越来越的人涌入直播大军。不得不说,直播不仅带来了更多的娱乐消遣,还提供了一个新型的就业方式。说起直播的类型,有一个非常小众的娱乐直播,没有主播&#xff0…

2017年我的阅读书单

2017年我正在看或者已经看完的书单,基本上都是纸质书,主要是长时间阅读也不伤眼。由于现阶段的主要工作是 DevOps 和运维管理,所以涉及运维方面的书我没有再细看,如果是工作用到的话会稍为翻阅下。主要还是看运维开发和 Python 及…

web第6次作业position

position 属性指定了元素的定位类型。 position 属性的五个值: static (静态定位) HTML元素的默认值,即没有定位,元素出现在正常的流中。 静态定位的元素不会受到 top, bottom, left, right影响。 div.stati…

GeneralUpdate版本更新公告20221009

大家好我是juster,GeneralUpdate的开源项目作者。这次将发布GeneralUpdate兼容.NET MAUI和多平台为核心的版本。经过国庆假期的打磨修复了大量开源社区开发者的提交的bug和不合理修改建议,重构、删除了大量代码和结构使用和上一个版本没有太大变化。1.更…

实验2 java_《Java程序设计》实验2

1、使用java语言编程,从键盘输入N个整数存储到数组中,求数组所有元素的和、最大值和平均值。import java.util.Scanner;public class Program01{public static void main(String [] args){Scanner scanner new Scanner(System.in);System.out.println(&…

WPF遍历当前容器中某种控件的方法

原文:WPF遍历当前容器中某种控件的方法版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37591671/article/details/79528845 WPF遍历当前容器中某种控件的方法 WPF遍历当前容器中某种控件的方法1.目的:2.实现思…

gradle 转 maven

1. 预备 1.1. java 环境 验证 java -version   1.2. gradle 安装, 参考, 这里列举下windows下的安装 b.1 下载包:https://gradle.org/releases b.2 解压,例如放到D:\soft\gradle\gradle-3.5 b.3 添加到环境变量, 把D…

详细的DedeCMS(织梦)目录权限安全设置教程

一、目录权限根据统计,绝大部分网站的攻击都在根目录开始的,因此,栏目目录不能设置在根目录。DEDECMS部署完成后,重点目录设置如下:1)将install删除。2) data、templets、uploads、a或html目录,…

java证书的安装_Java 第三方证书安装

1、进入dos命令行,进入目录C:\Program Files (x86)\Java\jre6\lib\security,2、导入命令: keytool -import -keystore "C:\Program Files (x86)\Java\jre6\lib\security\cacerts" -storepass changeit -keypass changeit -alias em…

善用Object.defineProperty巧妙找到修改某个变量的准确代码位置

2019独角兽企业重金招聘Python工程师标准>>> 我今天的工作又遇到一个难题。前端UI右下角这个按钮被设置为"禁用(disabled)"状态。 这个按钮的可用状态由属性enabled控制。我通过调试发现,一旦下图第88行代码执行完毕之后,这个按钮的…

缓冲运动之框架開始一级简单框架实例

***********************缓冲运动【框架開始】-1.html********************************************* <!DOCTYPE html> <html><head lang"en"><meta charset"UTF-8"><title></title><style type"text/css&qu…

将字符串分割为指定长度的子字符串

将一个字符串从左至右&#xff0c;分割成指定长度的子字符串&#xff08;注&#xff1a;最后一个子字符串的长度不一定等于指定的长度&#xff09; 1 #include <stdio.h>2 #include <string.h>3 4 #define STR_LENGTH 5 //分割之后每个字符串的长度&#xff08;最…

使用 C# 开发的轻量级开源数据库 LiteDB

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具或组件&#xff0c;希望对您有用&#xff01;简介 LiteDB 是一个小型、快速、轻量级的 .NET NoSQL 嵌入式数据库&#xff0c;也就是我们常说的 K/V 数据库&#xff0c;完全用 C# …

微信小程序仿微信SlideView组件slide-view

微信小程序仿微信SlideView组件。 使用 1、安装 slide-view 从小程序基础库版本 2.2.1 或以上、及开发者工具 1.02.1808300 或以上开始&#xff0c;小程序支持使用 npm 安装第三方包。 npm install --save miniprogram-slide-view2、在需要使用 slide-view 的页面 page.json 中…

hibernate 环境搭建测试

对于hibernate的介绍&#xff0c;网络上一搜一堆&#xff0c;恐怕我写的也没前辈总结的好。这个博主总结的十分好,方便大家欣赏 http://blog.csdn.net/liujiahan629629/article/details/21442607 真正要掌握&#xff0c;还得需要自己动手&#xff0c;才能丰衣足食。所需jar包j…

jQuary的相关动画效果

第一种&#xff1a;该方法隐藏所有 <p> 元素&#xff1a; <html> <head> <script type"text/javascript" src"jquery.js"></script> <script type"text/javascript"> $(document).ready(function(){ $(&quo…

C# WPF 中使用 MahApps.Metro.IconPacks 提供的图标

概述我们在桌面应用程序开发时经常会用到很多图标&#xff0c;时常我是在阿里矢量图库下载&#xff1a;https://www.iconfont.cn/&#xff0c;然后存放多项目中去引用&#xff0c;不过这样操作起来有点繁琐&#xff0c;这节我们介绍一个更加便捷的方式.用法概述Wpf 图标管理工具…