TCP 三次握手与四次挥手
介绍
TCP 是一种面向连接的、可靠的、基于字节流的传输层协议。它在建立连接时使用三次握手建立连接,在断开连接时使用四次挥手断开连接。
三次握手

目的
确保客户端和服务端双方都具有 发送和接收数据 的能力。
流程
- 第一次握手:
客户端向服务端发送 SYN=1
的同步序列号,并随机生成一个序列号 seq
发送给服务端。此时,客户端进入 SYN_SEND
状态。
- 第二次握手:
服务端收到 SYN=1
的同步序列号,向客户端发送 SYN=1
的同步序列号和 ACK=1
的确认,同时会生成一个服务端的的序列号 seq
, 并确认客户端的序列号 ack= 客户端seq + 1
一起发送给客户端。此时,服务端进入 SYN_RECV
状态。
- 第三次握手:
客户端收到 SYN=1
的同步序列号和 ACK=1
的确认,向服务端发送 ACK=1
的确认,并将自己的序列号 seq
加 1,同时将确认服务端的序列号 ack = 服务端seq + 1
发送给服务端。此时,客户端进入 ESTABLISHED
状态,服务端收到后也进入 ESTABLISHED
状态。
四次挥手
目的
确保双方都能 安全关闭连接 ,避免数据丢失。

流程
- 第一次挥手:
客户端发送 FIN=1
的结束序列号,并随机生成一个序列号 seq
发送给服务端,通知服务端准备关闭连接。此时,客户端进入 FIN_WAIT_1
状态。
- 第二次挥手:
服务端收到 FIN=1
的结束序列号,向客户端发送 ACK=1
的确认,同时确认客户端的序列号 ack = 客户端seq + 1
发送给客户端。此时,服务端进入 CLOSE_WAIT
状态。客户端收到后进入 FIN_WAIT_2
状态。这时服务端并不会立即关闭连接,因为还有处理未完成的请求,因此,在这个阶段,服务端会处理完所有未完成的请求,并把相应的数据发送给客户端。
- 第三次挥手:
客户端发送 FIN=1
的结束序列号和 ACK=1
的确认,并随机生成一个序列号 seq
和确认客户端的序列号 ack = 客户端seq + 1
发送给客户端。 通知服务端准备关闭连接。此时,服务端进入 LAST_ACK
状态,等待客户端的确认。
- 第四次挥手:
客户端向服务端发送 ACK=1
的确认,并将自己的序列号 seq
加 1,确认服务端的序列号 ack = 服务端seq + 1
发送给服务端。此时,客户端收到后进入 TIME_WAIT
状态,等待服务端的确认,在这个状态下,客户端会进行一个超时等待,通常为 1-4 分钟,如果超时还没有收到服务端的确认,则客户端会重发 ACK
报文。
服务端收到后,关闭连接,客户端和服务端同时进入 CLOSED
状态。