兩將軍問題和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.pswp.cn/news/281836.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281836.shtml
英文地址,請注明出處:http://en.pswp.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 圖標管理工具…