关于TCP连接的三次握手和释放的四次挥手

TCP运输连接管理

  • TCP是面向连接的协议
  • TCP基于运输连接来传送TCP报文段
  • TCP运输连接有三个阶段
  • 建立连接
  • 数据传输
  • 释放连接
    关于TCP连接的三次握手和释放的四次挥手
  • 在TCP连接建立的过程中需要解决以下三个问题
  1. 要使TCP双方能够确知对方的存在
  2. 要允许TCP双方协商一些参数(如最大窗口值、是否使用窗口扩大选项和时间戳选项以及服务质量等);
  3. 能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。

三次握手过程的图解

关于TCP连接的三次握手和释放的四次挥手
一开始两台主机都处于CLOSED状态,主机B中的TCP服务进程创建传输控制块,用来存储TCP连接中的重要信息,例如TCP连接表、指向发送和接收缓存的指针、指向重传队列的指针、当前的发送和接受序号等。接下来主机B准备接受主机A的TCP连接请求,进入LISTEN状态。主机A也是先建立传输控制块,然后向主机B发送TCP连接请求报文(不携带数据),并进入SYN-SENT状态。若主机B收到主机A的请求报文后,同意建立连接,则会向主机A发送TCP请求确认报文(不携带数据),并进入SYN-RCVD状态。主机A收到主机B 的报文后,会向主机B发送TCP确认报文(可携带数据),并进入ESTAB-LISHED状态,主机B收到该报文后,也进入ESTAB-LISHED状态,这是TCP双方便可以基于已经建立好的连接进行传输了。

问题:TCP建立连接最后一次报文是否多余,即能否基于两报文建立连接?

答案是不能的。如下图的假设情况,若是两次报文传输,则最后会造成服务器的资源浪费。关于TCP连接的三次握手和释放的四次挥手

TCP释放连接的四次挥手图解

关于TCP连接的三次握手和释放的四次挥手
现在主机A与主机B都处于连接已建立状态,此时主机A中的应用进程通知主机A的TCP释放连接,也就是主动关闭连接,主机A向主机B发送TCP释放连接报文,进入FIN-WAIT-1状态。主机B收到报文后,会向主机A发送TCP确认报文段,并进入CLOSE-WAIT状态,此时TCP服务器进程应该通知其高层应用进程,TCP客户进程要断开与自己的连接,这是的TCP客户进程处于半关闭状态(TCP客户进程以及没有数据要向服务器进程发送了,但如果服务器进程还有数据要发送的话,客户进程依然要接收)。主机A收到主机B的确认报文段之后,进入FIN-WAIT2状态。当主机B中的服务器进程没有数据要向主机A发送的时候,就会向主机A发送TCP连接释放报文段,并进入LAST-ACK状态。主机A收到了主机B的报文段之后,就会向主机B发送TCP确认报文段,并且进入TME-WAIT状态,主机B收到了主机A的确认报文段之后,就进入CLOSED状态,而此时的主机A中的客户进程还需要经过2MSL(4min)时间段的等待,才会进入CLOSED状态。

问题:为什么主机A需要等待2MSL时间段才能进入CLOSED状态?

答案是,若不等待直接进入CLOSED状态,有可能会造成服务器最后无法关闭,等待2MSL时长也可以使连接中没有旧报文段的信息。
关于TCP连接的三次握手和释放的四次挥手
以上便是有关TCP连接时的三次握手和释放时的四次挥手问题