两将军问题和TCP三次握手( 二 )


但是根据双将军问题 , 谁说一来一回两个包就能确保同步成功 。
为了缓解双将军问题 , 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 三次握手是在两个方向确认包的序列号 ,  增加了超时重试 ,  是两将军问题的一个工程解 。
(本文部分内容提炼自知乎 , 感谢这届网友的智慧)

  • https://finematics.com/two-generals-problem/
  • https://www.bilibili.com/read/cv16604716

经验总结扩展阅读