TCP传输中的“三次握手”建立连接和“四次握手”释放连接过程

TCP的连接管理主要面向三个连接阶段,分别是连接建立,传输数据,连接释放。
其中连接的建立和连接释放是两个重要的知识点,分别有两个比较形象的称呼:三次握手和四次握手。
最近正在学习传输层的知识,故借本文对这两个阶段进行简要整理。

首先必须明确的是TCP协议是采用客户/服务器的方式,主动发起连接建立的应用进程称为客户机,被动等待连接建立的应用进程称为服务器。

三次握手

在这里插入图片描述
一次连接建立的过程如下:

  1. 客户机首先向服务器发送一个TCP请求连接报文,报文不含应用层数据,比较值得注意的是就是报文首部字段,SYN = 1, seq = J;SYN=1表示这是一个请求连接报文,而seq = J 则是表示该报文段的序号,用于确保可靠传输(报文不携带数据但是仍然消耗一个序号)。
  2. 服务器收到请求连接报文之后,若同意该请求,则为该TCP分配缓存,然后发送一个确认连接报文,其首部的字段分别为:SYN= 1,seq = K,ACK = 1, ack = J + 1;SYN=1表示这是一个连接接收报文,seq表示服务器发送报文的序号,ACK是确认位,而ack = J + 1则是表示服务端已经收到了J号报文,下一个报文希望接收的是序号为 J + 1的报文。
  3. 当客户端接收到服务器的确认报文之后,需要再向服务端进行确认连接。这是再发送一个普通的确认报文即可。其ACK=1,ack = K+1.

这里值得注意的一个点就是,为什么不能一次或者两次握手就完成连接?
我们来假设一下,如果使用一次握手那么会存在什么样的问题?
服务端不同意请求或繁忙,但由于是一次握手,客户端不清楚服务器是否为其分配了缓存,这样就会导致后续的数据传输失效。
如果只使用二次握手,则会发生:
当服务器同意连接请求之后,发送接收确认报文后,客户端因为一些原因(如停机)导致无法传输数据,进而无法发送确认连接报文,那么服务端就会为这个掉线的客户端分配多余的资源,导致资源浪费。

四次握手

在这里插入图片描述
TCP的连接释放可以简单概括为两个阶段:

  1. 前两次握手是为了终止客户机到服务器的数据传输,但是服务器仍可以向客户机发送数据
  2. 后两次握手是为了终止服务器向客户机发送数据。

四次握手的过程如下:

  1. 客户机向其TCP发出一个连接释放报文,其首部字段 FIN = 1,seq = u。当某一端发起一个附带FIN=1的报文时,则表示这一端终止发送数据,后续只能被动接收数据。
  2. 服务器接收客户端释放报文,返回确认报文,其首部字段为 ACK=1,seq = v,ack = u + 1。这样从客户端到服务器的单向数据传输就终止了。但服务器仍然可以向客户端发送数据
  3. . 若服务端没有要向客户端发送的数据了,那么服务端发出连接释放报文,其首部字段 FIN = 1,ACK= 1,seq = w,ack = u + 1。
  4. 客户机接收到连接释放报文之后,必须发出确认,其中ACK=1,seq = u + 1, ack = w + 1。此时TCP还未真正释放,必须经过时间等待计时器设置的时间2MSL后,客户端才进入关闭连接的状态。

这里需要清楚一点就是,为什么不能三次握手就完成连接的释放,即省略最后一步,确认报文。。
因为这里是TCP协议,通过确认机制来保证可靠传输,针对一个非确认报文,接收方需要发送一个确认报文给发送方,如果客户机未接收到发送方的释放连接报文,而服务器并不清楚就主动断开连接,这样就会使得客户机继续保留维护连接的资源,造成资源浪费。一般来说,服务器未接收到确认报文的话,就会触发超时重传,确保客户机接收到连接释放的报文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章