TCP建立连接和断开连接流程

时间:2022-03-22 10:16:59

一、基本描述

TCP协议为提供面向连接的服务,需要先建立连接,然后才可以通信,通信结束时,需要断开连接。

二、建立连接流程

建立连接的过程也叫做三次握手,流程如下:

TCP建立连接和断开连接流程

1、首先,一定是由客户端发起连接请求,服务端来接收连接请求。客户端发起连接请求后,会先给服务端发送一个SYN包。

2、服务端收到SYN包,会回复SYN的ACK,同时再回复SYN,但SYN和ACK是一起发送的。

客户端收到了SYN+ACK包,完成了客户端到服务端单向连接的建立,然后给服务端回复ACK包。

3、服务端收到客户端发来的ACK包,完成了服务端到客户端单向连接的建立。

说明:

 SYN包会报告TCP需要用到的一些参数。
 服务器在收到SYN后,会将连接放入SyncQueue里(Linux默认2048)。
 服务器在收到ACK后,会将连接放入AcceptQueue里(Linux最大128,应用层可以传入backlog,两者的较小值为AcceptQueue的最大长度)。     

三、断开连接流程

断开连接的过程也叫四次挥手,流程如下:

TCP建立连接和断开连接流程

1、断开连接时,发起方可以是客户端也可以是服务端。发起方会先发送一个FIN包,就进入FIN_WAIT_1状态,此时就不能发送用户数据,等待响应方回复ACK。

2、响应方收到FIN包后,就给发起方回复ACK。此时,响应方进入CLOSE_WAIT状态,因为响应方还有待发送的数据,需要等待发送完毕,才能关闭连接(发起方在发送FIN前,会保证已经发送完数据)。

3、发起方收到ACK后,就进入FIN_WAIT_2。此时还能继续接收数据,直到收到响应方的FIN。

4、响应方等数据发送完毕后,就给发起方发送FIN包。

5、发起方收到响应方的FIN包后,就进入TIME_WAIT状态。

6、响应方收到ACK后,就进入CLOSED状态,完成了断开流程。

7、发起方的TIME_WAIT状态会持续2MSL(最大报文生存时间)。然后,进入到CLOSED。

四、为何建立连接是三次握手,而断开连接需要四次挥手?

1、下图是TCP协议头的结构:

TCP建立连接和断开连接流程
里面有专门的位来标记SYN包,FIN包,ACK序号是否有效。

2、三次握手时的SYN和ACK,是可以通过一个TCP包来发送的。

3、四次挥手时为何没有将SYN和ACK一起发送,是因为响应方还有待发送的数据,需要等数据发送完成才能发送SYN包。

五、为何需要TIME_WAIT状态?

1、一个重要的原因是在发起方发送了ACK后,不能保证响应方一定能收到ACK。响应方在发送FIN后,就等待发起方的ACK,在等待一段时间后,如果没有收到ACK,就会重发FIN包。发起方在TIME_WAIT的时间内(等待ACK的时间+重发FIN最大需要2MSL),如果又收到了响应方的FIN包,就会再发ACK包。