计算机网络一块知识一直是大学生头疼的一块,而面试官却经常会考察这方面的知识,尤其是 TCP 三次握手和四次挥手,本文将对其进行图文分析。

TCP 的三次握手和四次挥手

题目

TCP 的三次握手和四次挥手

推荐解析

目的

TCP 是一种面向连接的协议,其三次握手和四次挥手的过程是为了建立和终止连接,保证通信的可靠性和完整性。

过程

三次握手的过程是:

1)客户端向服务器发送 SYN 包( SYN = 1,表示请求建立连接),并进入 SYN_SENT 状态。

2)服务器收到 SYN 包,返回 SYN + ACK 包( SYN = 1,ACK = 1,表示确认请求并同意建立连接),并进入 SYN_RCVD 状态。

3)客户端收到 SYN+ACK 包,发送 ACK 包( ACK = 1,表示确认收到服务器的同意),并进入 ESTABLISHED 状态。

四次挥手的过程是:

1)客户端向服务器发送 FIN 包( FIN = 1,表示要关闭连接),并进入 FIN_WAIT1 状态。

2)服务器收到 FIN 包,返回 ACK 包( ACK = 1,表示确认收到客户端的请求),并进入 CLOSE_WAIT 状态。

3)服务器的应用程序将所有数据发送给客户端后,向客户端发送 FIN 包,并进入 LAST_ACK 状态。

4)客户端收到 FIN 包后,发送 ACK 包( ACK = 1,表示确认收到服务器的关闭请求),并进入 TIME_WAIT 状态,等待 2MSL(最大报文段生存时间)后关闭连接。

为什么不能是两次握手三次挥手?

如果使用两次握手,那么会存在一种情况:客户端发送了 SYN 包,但是由于网络原因或其他问题导致该包延迟了一段时间到达服务器,此时服务器认为客户端要建立连接,向客户端发送了 SYN+ACK 包,并进入 SYN_RCVD 状态。但是客户端在等待服务器的 ACK 包时,却没有收到服务器的 SYN+ACK 包,认为连接未建立,所以不发送 ACK 包。这时,服务器一直在等待客户端的 ACK 包,连接也无法建立,造成资源浪费和效率低下。

总结:如果采用两次握手,只能确定客户端的发信能力和接收端的收信能力,但不能确定客户端的收信能力和接收端的发信能力。

如果使用三次挥手,那么会存在一种情况:客户端发送 FIN 包,服务器收到后立即返回 ACK 包,并进入 CLOSE_WAIT 状态。此时,客户端还有数据没有发送完毕,但是服务器已经关闭连接,客户端只能等待超时,才能关闭连接,造成连接的资源浪费。

总结:如果采用三次挥手,会造成客户端超时等待,数据未完全传输,资源浪费。

为什么第四次挥手客户端需要等待 2*MSL(报文段最长寿命)时间后才进入 CLOSED 状态?

客户端在发送最后一个 ACK 报文确认服务器的 FIN 报文后,需要等待2倍的 MSL(报文段最长寿命)时间后才进入 CLOSED 状态,主要是为了确保服务器已经收到了该确认报文。

MSL 是指报文在网络中最长的存活时间,一般认为它的值为 2 分钟。在正常情况下,服务器收到客户端的确认报文后会立即关闭连接,但是由于网络的不稳定性,可能导致最后一个 ACK 报文丢失。如果客户端立即关闭连接,那么服务器无法收到确认,会认为客户端并没有收到服务器的 FIN 报文,从而会重新发送 FIN 报文。而客户端此时已经关闭连接,无法接收到服务器的重传 FIN 报文,导致服务器一直等待连接关闭,造成资源浪费。

为了避免这种情况,客户端需要等待 2 倍的 MSL 时间,确保服务器收到了确认报文并关闭了连接。这样即使服务器的重传 FIN 报文到达客户端,客户端也可以忽略它,因为此时客户端已经关闭连接。等待2倍的 MSL 时间可以确保网络中的所有报文都已经被丢弃,避免了潜在的连接问题。

其他补充

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

TCP 的三次握手和四次挥手是用于建立和终止 TCP 连接的过程。

三次握手( Three-way Handshake ):

1)第一次握手( SYN ):客户端向服务器发送一个 SYN(同步序列编号)包,其中包含一个随机生成的初始序列号( ISN )。

2)第二次握手( SYN + ACK ):服务器收到 SYN 包后,会发送一个 SYN + ACK 包作为响应,其中 ACK 确认号设置为客户端的 ISN 加 1,同时服务器也会生成一个自己的随机 ISN。

3)第三次握手( ACK ):客户端收到 SYN + ACK 包后,会向服务器发送一个 ACK 包,其中 ACK 确认号设置为服务器的 ISN 加 1。

通过这样的三次握手过程,双方都确认了对方的接收能力和发送能力,建立了可靠的 TCP 连接。

四次挥手( Four-way Handshake ):

1)第一次挥手( FIN ):当客户端决定关闭连接时,会发送一个 FIN(结束)包给服务器。

2)第二次挥手( ACK ):服务器收到 FIN 包后,会发送一个 ACK 包作为确认。

3)第三次挥手( FIN ):当服务器也决定关闭连接时,会发送一个 FIN 包给客户端。

4)第四次挥手( ACK ):客户端收到 FIN 包后,会发送一个 ACK 包作为确认,此时连接正式关闭。

通过这样的四次挥手过程,双方都确认了彼此的关闭意图,并逐步关闭连接。

CSDN 某同学:

三次握手的本质是确认通信双方收发数据的能力首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了我的发件能力和他的收件能力是可以的。于是他给我回信,我若收到了,我便知我的发件能力和他的收件能力是可以的,并且他的发件能力和我的收件能力是可以。然而此时他还不知道他的发件能力和我的收件能力到底可不可以,于是我最后回馈一次,他若收到了,他便清楚了他的发件能力和我的收件能力是可以的。这,就是三次握手。

TCP 报文结构图

欢迎交流

在阅读本文后,你应该了解 TCP 的三次握手和四次挥手并且要知道了为什么不能是两次握手和三次挥手,接下来我将提出相关的三个问题,欢迎小伙伴在评论区进行留言!

1)TCP 协议为什么需要三次握手和四次挥手?

2)TCP 协议中,为什么要使用 SYN 标志位初始化连接?

3)TCP 协议中,为什么要使用全双工模式?