一、基本描述
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的最大长度)。
三、断开连接流程
断开连接的过程也叫四次挥手,流程如下:
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协议头的结构:
里面有专门的位来标记SYN包,FIN包,ACK序号是否有效。