为什么需要三次握手

三次握手基础:

  1. tcp三次握手是同步双方序列号和窗口大小的过程.

三次握手

三次的原因:

  1. 一次肯定不行,C不知道是否连接成功,发送数据则错误.
  2. 两次的话存在一个问题:
  3. 已过期的连接包再现,S会回复确认并以为连接成功.
  4. 三次的话,过期的包,由于C并未发起连接,C就不会回复.
  5. `总结: 防止已失效的连接请求报文段重现造成错误.`

网络流传的原因(有待商榷):

  1. 源自华中科技大研究生入学考题:
  2. 说若改成两次,则S以为发送确认后已成功,而实际丢失,而C则等待确认,造成死锁.
  3. 我认为关键是序列号不同步,导致无法通信.

参考图:

ps: 圆圈代表选用的序列号,叉代表断开. 
错误情况1 
1. 图1是原因1的情况,两次握手是肯定不行的,三次则可以避免. 
2. 图2是两次握手的另一种错误!服务器确认包丢失->假设服务器对后来包采取丢弃处理,则客户端不可能连接成功. 
错误情况2 
3. 图3是回复,且以新到达连接包作为序列号,看似能解决问题. 
4. 但图4绝杀了,连接包的延迟到达,使得在两次连接情况下,服务器无法判断连接包的先后顺序,从而无法同步序列号.(重传时间一开始小于2MSL,所以有可能.) 
错误情况3 
5. 图5引入三次连接能解决这个问题,后到的包直接丢弃,因为客户端可选择地发生确认包,它知道自己想要的是哪个包(自己最新发送的连接包的确认包). 
6. 但仍可能遇到丢包问题,这时,客户端不知服务器是否收到,服务器可选择发生所有收到的包(由于不知道客户端真正的包是哪个),而客户端只会回复一个包,其他丢弃.


后记: 
1. 关于图6的做法,重复发送所有包只是我设想的一种解决办法,并未细看tcp详解,迟点再看. 
2. 关于握手连接的问题还有很复杂的情况,未一一总结. 
3. 同学提出,两次连接时,服务器采取对后到的连接包不回复的策略,但如果没有收到确认则等待2MSL后重发.咋一想似乎可行,但无论如何,2MSL太久了.

posted on 2017-12-08 17:51  willaty  阅读(452)  评论(0编辑  收藏  举报

导航