TCP连接的三次握手和四次挥手

224 阅读3分钟

一. 握手分析

三次握手的原因:客户端和服务端同时建立稳定的连接。是后续通信的基础。

1. 第一次握手:客户端发送SYN包给服务端,等待服务端的ACK回复。此时,客户端进入SYN-SENT状态。此次握手作用是服务端知道自己的接受能力和客户端的发送能力都没问题。 (SYN是synchronize(同步)的缩写,ACK是(acknowledgment)的缩写)

2. 第二次握手: 服务端收到客户端的SYN后,返回一个自己的ACK包以及自己的SYN包,然后等待客户端的ACK回复,服务端进入SYN-RECIVED状态。此次握手作用是客户端知道自己的发送能力和服务端的接受能力没有问题。

3. 第三次握手: 客户端收到服务端的ACK包后,进入ESTABLISHED阶段。然后根据收到的SYN包返回给服务端一个ACK包。等待中的服务端收到ACK回复之后,也把自己的状态改为TSTABLISHED。此次握手的作用是服务端知道自己的发送能力没有问题。


二. 挥手分析

四次挥手的原因:客户端和服务端确认通信完成情况下断开连接。下面假设客户端为主动关闭连接的一方,服务器是被动关闭连接的一方。

1. 第一次挥手: 客户端发送FIN=1给服务端,表示客户端没有数据需要发送了,但是此时客户端还可以接受数据。

2. 第二次挥手: 服务端收到客户端的FIN之后,发送ACK给客户端,表示服务端已经知道客户端没有数据需要发送了。此时服务端如果还有数据需要发送给客户端,则继续发送,没有的话进入第三次挥手。

3. 第三次挥手: 服务端发送SYN=1给客户端,表示服务端也没有数据需要发送了。

4. 第四次挥手: 客户端收到服务端的FIN字段后,发送ACK给服务端,表示客户端知道服务端没有数据要发送了,此时服务端收到客户端的ACK之后,关闭连接,客户端在发送完报文2MSLS时间之后也关闭连接。


三. 四次挥手的第二次和第三次为什么不能合并成一次?

分析:因为第二次挥手是服务端告知客户端,服务端收到客户端没有数据需要发送的消息,但此时服务端可能还会有数据需要发送,第二次挥手和第三次挥手之间的时间就是服务端用来发送剩下的数据的。等到剩下的数据发送完毕之后,服务端发送第三次挥手,表示服务端也没有数据需要发送了,请求关闭连接。然后进入第四次挥手。