三次握手&四次挥手
三次握手
一、概念
1、TCP 协议
TCP(Transmission Control Protocol),即传输控制协议。
TCP 协议是一个 面向连接的、可靠的、基于字节流 的 传输层协议。
TCP 连接可以用于 保证可靠性 和 流量控制机制,包括 Socket、序列号及窗口大小。
其中 Socket 是由 IP 加端口组成的,序列号是用来解决乱序问题的,而窗口大小则是用来做流量控制的。
2、TCP 的特点
- 面向连接:TCP 是通过服务端和客户端进行连接的协议。
- 面向字节流:TCP 服务端和客户端之间的数据通讯是通过 字节流数据 传输的。
- 可靠的:TCP 传输的可靠性得益于 TCP 会记录 信息的发送状态 和 数据的接收与否,对于丢包等发送不成功的情况,TCP 会重新发包,进而保证 TCP 的可靠性。
3、TCP 三次握手

- SYN:Synchronize Sequence Numbers,同步序列号,表示发起一个新连接。
- ACK:确认收到一个新连接。
- SEQ:序列号。
TCP 三次握手执行过程:
(1)第一次握手(在吗?)
Client 将 SYN 发给 Server。
Client 进入 SYN_SENT 状态,等待 Server 确认。
(2)第二次握手(在的,有事?)
Server 收到 SYN,将 SYN+ACK 发给 Client。
Server 进入 SYN_RCVD 状态,等待 Client 确认。
(3)第三次握手(需要数据传输)
Client 收到 SYN+ACK,将 SYN 发给 Server。
连接成功,Client 与 Server 进入 ESTABLISHED 状态,可以传输数据。
TCP 为什么需要三次握手?
为了防止已失效的请求报文段传送到服务端而产生连接的误判。
假设是两次握手:
当 A 发送一个连接请求给 B,但是该请求由于网络原因被阻塞了,一段时间后,A 未收到回复,会认为该消息丢失了,就会重新发送消息。
当 A 和 B 通信完成后,这个被 A 认为已经丢失的请求到达了 B,B 会认为这是一个新的请求连接消息,就向 A 发送确认。
但是 A 认为自己没有给 B 再次发送消息,所以不会理睬 B 的确认,但是 B 会一直等待 A 的消息,导致 B 的资源被浪费。
这就是为什么不能两次握手。
设计成三次握手的情况,客户端在接收到服务端 SEQ+1 的返回消息后,就会知道该连接是历史连接,接着发送报文告诉服务端。
为了节省资源,也没必要设计成更多次的握手。
四次挥手

四次挥手的 6 种状态
(1)FIN_WAIT_1
主动方在 ESTABLISHED 状态的时候,想要主动关闭连接,向对方发送 FIN 报文,并进入 FIN_WAIT_1 状态。
(2)FIN_WAIT_2
当主动方收到被动方回复的 ACK 报文后,就进入了 FIN_WAIT_2 状态。
当主动方进入 FIN_WAIT_2 时,表示半连接状态,即被动方还有数据要发过来。
(3)CLOSE_WAIT
当被动方接收到 FIN 时,会回复一个 ACK,并进入 CLOSE_WAIT 状态。
在该状态中,被动方如果还有数据要发送,就继续发送,如果没有,就关闭连接,并发送一个 FIN 给对方。
(4)TIME_WAIT
当主动方接收到了 FIN 报文,就回复一个 ACK 报文,并进入 TIME_WAIT 状态。
如果主动方在 FIN_WAIT_1 状态下,收到了对方的 FIN+ACK 报文,可以跳过 FIN_WAIT_2 直接进入 TIME_WAIT 状态。
(5)LAST_ACK
被动方发送了 FIN 报文后,最后等待对方的 ACK 报文时进入的状态。收到ACK报文后就可以进入CLOSED状态了。
(6)CLOSED
主动方进入 TIME_WAIT 状态后,再等待 2MSL 就会进入 CLOSED 状态。
被动方在收到 ACK 报文后,立即进入 CLOSED 状态。
TIME_WAIT 的意义
如果没有 TIME-WAIT,主动方会直接进入 CLOSED 状态。
此时如果因为网络原因最后一次 ACK 丢失了,服务端会重复发送 FIN 请求给客户端,所以就需要主动方发送最后一次 ACK 之后进入 TIME_WAIT 状态,等待 2MSL(两个报文最大生命周期),等待这段时间就是为了如果接收到了重发的 FIN 请求能够进行最后一次 ACK 回复。
- Title: 三次握手&四次挥手
- Author: Gabrielle
- Created at : 2024-11-04 14:26:53
- Updated at : 2025-05-20 10:47:28
- Link: https://zoella-w.github.io/2024/11/04/27-三次握手&四次挥手/
- License: This work is licensed under CC BY-NC-SA 4.0.