两将军问题和TCP三次握手
兩將軍問題,又被稱為兩將軍悖論、兩軍問題, 是一個經(jīng)典的計算機(jī)思想實驗。
首先, 為避免混淆,我們需要認(rèn)識到兩將軍問題雖然與拜占庭將軍問題相關(guān),但兩者不是一個東西。拜占庭將軍問題是一個更通用的兩將軍問題版本, 通常在分布式系統(tǒng)故障容錯、區(qū)塊鏈中廣泛討論也會猶豫。
1.兩將軍問題
兩支軍隊,駐扎在兩個山頭,準(zhǔn)備攻擊山谷里的同一伙敵人,兩將軍只有同時發(fā)起進(jìn)攻才能獲勝,兩將軍約定攻擊時間的的唯一方式是派遣信使通過山谷,山谷處于敵占區(qū)。
如果信使被俘獲了,那么攻擊信息將會丟失。
現(xiàn)象一:A將軍先派遣信使向 B 將軍傳遞“晚上 10 點一起進(jìn)攻”,但是 A 將軍不知道信使能否穿越敵占區(qū),由于擔(dān)心自己成為唯一進(jìn)攻方,A 將軍可能會猶豫是否按計劃進(jìn)攻;此時 B 將軍收到后可以派遣信使確認(rèn)收到,B的信使也可能被俘獲,由于擔(dān)心A沒有收到確認(rèn)信號而退縮,B將軍也會猶豫;再次確認(rèn)也不能解決,因為再次確認(rèn)的新信使也可能被俘獲。因此交替確認(rèn)是無止盡的。
現(xiàn)象二:將軍A派遣信使,過了很長時間未收到回復(fù),將軍A不知道是自己的信使被俘獲了還是將軍B的確認(rèn)信使被俘獲了。
我們意識到即使雙方不斷確認(rèn)已收到對方的上一條信息,也無法確保對方已與自己達(dá)成共識。
兩將軍問題是無解的,目前的tcp三次握手、四次揮手都是工程解(這個一會再聊)。
2.兩將軍問題的頭腦風(fēng)暴
許多人試圖解決/緩解雙將軍問題,提出了一些能落地的實踐。
這里我們依舊假設(shè)通道的不確定性,信使只會被俘獲,但是不會叛變篡改。
2.1 霰彈打鳥
如果A將軍每次派遣100名信使(編號1到100),期待B將軍最差也能收到一名信使的信息。
B將軍根據(jù)收到的信使數(shù)量,評估這條通道的可靠性,并根據(jù)概率也派遣合適數(shù)量的確認(rèn)信使。
eg:? A將軍派遣100信使,B將軍收到10名信使的信息,B將軍基本可確認(rèn)這條信道可靠度為10%,B將軍最少應(yīng)派出10名信使(根據(jù)概率會有1名信使到達(dá)對岸)。
2.2 間歇性重試
霰彈打鳥的姿勢太費信使了,但至少可幫助B將軍提高信心,達(dá)成共識。
還有一種少費信使(并能提高將軍信心)的策略,假設(shè)跨越山谷到達(dá)對岸并返回耗時20min, A將軍可間隔20min派遣信使到對岸,直到收到對岸B將軍的首次信使確認(rèn)(就不再派遣)。
以上兩種策略是對速度和成本的權(quán)衡,采用哪一種取決于哪一種更適合我們遇到的問題。
3. 為什么說tcp三次握手[1]是雙將軍問題的工程解?
知乎上有個問題:?TCP 為什么是三次握手,而不是兩次或四次?[2]
有三個回答角度。
??①?TCP 為什么是三次握手,而不是兩次或四次?- 朋克雪球兔的回答 - 知乎[3]
??②?(TCP 為什么是三次握手,而不是兩次或四次?- 車小胖的回答 - 知乎[4]
??③?TCP 為什么是三次握手,而不是兩次或四次?- wuxinliulei的回答 - 知乎[5]
希望大家仔細(xì)讀一讀。
首先我們要知道:
三次握手是為了在兩個方向上同步(syn)序列號(seq=m),同步一次序列號需要一去一回兩個包,倆方向就4個包。第2,3個包由一側(cè)發(fā)出可以合并到一起所以最后三個包。
但是根據(jù)雙將軍問題,誰說一來一回兩個包就能確保同步成功。
為了緩解雙將軍問題,tcp3次握手增加了超時重試的機(jī)制。(注意:重試只在信息同步的發(fā)起方)
第一個包:A發(fā)送給B的SYN中途丟失,沒有到達(dá)B
A會周期性超時重傳,直到收到B的確認(rèn)。
第二個包,即是發(fā)送給A的SYN+ACK 中途丟失,沒有到達(dá)A
B會周期性超時重傳,直到收到A的確認(rèn),此時第一個包A也會重試SYN
第三個包:即A發(fā)送給B的ACK 中途丟失,沒有到達(dá)B
A發(fā)完ACK,單方面認(rèn)為tcp Established狀態(tài),而B顯然認(rèn)為tcp為Active狀態(tài)。
a. 假定此時雙方都沒有數(shù)據(jù)發(fā)送,B會周期性超時重傳,直到收到A的確認(rèn),收到之后B的TCP 連接也為 Established狀態(tài),雙向可以發(fā)包。
b. 假定此時A有數(shù)據(jù)發(fā)送,B收到A的 Data + ACK,自然會切換為established 狀態(tài),并接受A的 Data。
c. 假定B有數(shù)據(jù)發(fā)送,數(shù)據(jù)發(fā)送不了,會一直周期性超時重傳SYN + ACK,直到收到A的確認(rèn)才可以發(fā)送數(shù)據(jù)。
??https://finematics.com/two-generals-problem/
??https://www.bilibili.com/read/cv16604716
總結(jié)
本文記錄了兩將軍問題: 對于不可靠信道,無數(shù)次確認(rèn)都不能百分百達(dá)成可靠共識。
TCP 三次握手是在兩個方向確認(rèn)包的序列號, 增加了超時重試, 是兩將軍問題的一個工程解。(本文部分內(nèi)容提煉自知乎,感謝這屆網(wǎng)友的智慧)
引用鏈接
[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
點“贊”戳“在看”
體現(xiàn)態(tài)度很有必要!
總結(jié)
以上是生活随笔為你收集整理的两将军问题和TCP三次握手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea中使用git合并代码
- 下一篇: 云南各地代表性方言辞典