阅读 216

分析TCP三次握手四次挥手的必要性(上)

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

近期系统性的学习网络工程的相关知识,发现里面很多设计都很具有学习的价值。尤其是TCP网络连接的三次挥手和四级挥手的相关问题 在面试过程中已经成为最会被问、最基础的面试题之一,通过学习建立网络连接的过程,自我总结出源码中的热点函数和思想,具有很高的学习价值。

TCP 三次握手

三次握手的流程

image.png

  1. 客户端——发送带有SYN标志的数据包——服务端 一次握手 Client进入syn_sent状态(过程中,发送方传递SYN=1,SEQ=x)
  2. 服务端——发送带有SYN/ACK标志的数据包——客户端 二次握手 服务端进入syn_rcvd(过程中,发送方反馈 ack=X+1,同时发送标记信号 SYN=1,SEQ=y)
  3. 客户端——发送带有ACK标志的数据包——服务端 三次握手 连接就进入Established状态(过程中发送方反馈 ack=y+1,同时发送序列信号 seq=z)

3次握手的原因

3次握手的过程中,建立了可靠的通信信道。同时保证了客户端与服务端同时具备发送、接受数据的能力。

只握手2次的可行性

不可以,如果只握手2次,只能保证单项通道是正常的。在进行握手的过程中,每次进行握手的时候,发送方除了会发送自己的序列号,也会将之前接收方提供的序列号进行+1操作。这样就能保证过程中的发送、接受顺序是完全按照时序的。如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认)。

2次握手会导致的问题

最常见的就是死锁。例如A像B发送请求,B返回建立连接请求后,如果2次握手,即认为可以进行数据传输,此时一直在等在数据组传递。假如这个过程中B的返回信号丢失了,A仍然在等待响应。在这种情况下,A会一直进行等待,而B也会因为分组超时,重复发送相同的数据。造成死锁。

文章分类
后端
文章标签