TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,用于在互联网中提供数据的可靠传输。其建立和断开连接的过程简单来说就是通过三次握手和四次挥手的机制来实现。
TCP三次握手(建立连接过程)
- 第一次握手:
- 客户端(
Client)向服务器(Server)发送一个SYN(同步序列编号,Synchronize Sequence Numbers)报文段(SYN报文里包含自身的初始化序号seq),并将自身初始化序号seq设置为随机数X。 - 此时,客户端进入
SYN_SENT(SYN发送)状态,等待服务器确认。
- 客户端(
- 第二次握手:
- 服务器收到客户端的
SYN报文段后,若同意建立连接,则会回复一个SYN+ACK(同步-确认)报文段。 - 服务器回复的
SYN报文里同样有一个随机的初始序号seq=Y,并将确认号ACK设置为X+1,表示已接收到并准备接收客户端的数据。 - 服务器进入
SYN_RECEIVED(SYN接收)状态。
- 服务器收到客户端的
- 第三次握手:
- 客户端收到服务器的
SYN+ACK报文段后,会再次发送一个ACK(确认)报文段给服务器。 确认号ack设置为Y+1,表明已经收到了服务器的SYN并将自己的序号seq保持不变或递增(取决于具体实现)。 - 客户端进入
ESTABLISHED(建立连接)状态。 - 服务器收到这个
ACK之后也进入ESTABLISHED状态,至此,双方都处于已连接状态,可以开始进行双向的数据传输。
- 客户端收到服务器的
TCP四次挥手(断开连接过程)
- 第一次挥手:
- 当客户端完成数据传输任务后,它首先向服务器发送一个
FIN(结束,Finish)报文段,请求关闭连接,同时带上最后的确认号ACK。 - 发送完
FIN后,客户端进入FIN_WAIT_1状态,等待服务器确认。
- 当客户端完成数据传输任务后,它首先向服务器发送一个
- 第二次挥手:
- 服务器收到
FIN报文段后,向客户端回送一个ACK报文段作为确认,此时服务器知道客户端不再有数据要发送,但仍可能继续发送数据给客户端。 - 服务器进入
CLOSE_WAIT状态,客户端则进入FIN_WAIT_2状态。
- 服务器收到
- 第三次挥手:
- 当服务器确认没有数据需要再发送给客户端时,服务器也发送一个
FIN报文段给客户端,请求关闭连接。 - 服务器随后进入
LAST_ACK状态,等待来自客户端的最终确认。
- 当服务器确认没有数据需要再发送给客户端时,服务器也发送一个
- 第四次挥手:
- 客户端收到服务器发来的
FIN报文段后,发出对服务器FIN的确认ACK报文段。 - 客户端进入
TIME_WAIT状态,等待足够的时间确保服务器收到该确认报文,服务器收到这ACK报文后,就正式关闭连接。而客户端等待(通常是2MSL,即Maximum Segment Lifetime,报文最大生存时间,2MSL时间是TCP/IP协议中规定的某个值,表示报文段在网络中存在的时间。具体的时长取决于具体的实现和协议栈的配置,但通常来说,2MSL的时长大约为4到8分钟。)后,如果没有收到服务器的重传报文,就会确认连接已经关闭,然后释放相关的资源。
- 客户端收到服务器发来的