TCP 三次握手与四次挥手常见面试题
一、三次握手(建立连接)
过程解析:
-
第一次握手(客户端→服务器)
- 客户端发送带有
SYN=1和随机序列号Seq=x的报文段,请求建立连接,进入SYN_SENT状态。
- 客户端发送带有
-
第二次握手(服务器→客户端)
- 服务器收到请求后,发送
SYN=1、ACK=1、确认号Ack=x+1和自身随机序列号Seq=y的报文段,进入SYN_RCVD状态。
- 服务器收到请求后,发送
-
第三次握手(客户端→服务器)
- 客户端确认收到服务器的响应,发送
ACK=1、确认号Ack=y+1、序列号Seq=x+1的报文段,进入ESTABLISHED状态;服务器收到后也进入ESTABLISHED状态,连接建立完成。
- 客户端确认收到服务器的响应,发送
常见面试题 1:为什么需要三次握手?
-
原因 1:防止历史连接初始化
若两次握手,客户端旧的 SYN 报文段可能被服务器接收,导致建立无效连接(如网络延迟导致旧报文段后到达)。三次握手时,服务器的 SYN+ACK 会被客户端识别为旧连接而拒绝。 -
原因 2:确保双向通信可达
三次握手可验证客户端和服务器的发送 / 接收能力:- 第一次:客户端能发,服务器能收;
- 第二次:服务器能发,客户端能收;
- 第三次:客户端能发(确认服务器的 ACK),服务器能收(确认客户端的 ACK)。
二、四次挥手(断开连接)
过程解析:
-
第一次挥手(主动关闭方→被动关闭方)
- 客户端(或服务器)发送
FIN=1、序列号Seq=u的报文段,请求关闭连接,进入FIN_WAIT_1状态。
- 客户端(或服务器)发送
-
第二次挥手(被动关闭方→主动关闭方)
- 被动关闭方发送
ACK=1、确认号Ack=u+1、序列号Seq=v的报文段,确认关闭请求,进入CLOSE_WAIT状态;主动关闭方收到后进入FIN_WAIT_2状态。
- 被动关闭方发送
-
第三次挥手(被动关闭方→主动关闭方)
- 被动关闭方处理完剩余数据后,发送
FIN=1、ACK=1、确认号Ack=u+1、序列号Seq=w的报文段,请求关闭连接,进入LAST_ACK状态。
- 被动关闭方处理完剩余数据后,发送
-
第四次挥手(主动关闭方→被动关闭方)
- 主动关闭方发送
ACK=1、确认号Ack=w+1、序列号Seq=u+1的报文段,进入TIME_WAIT状态;被动关闭方收到后进入CLOSED状态,主动关闭方等待2MSL后也进入CLOSED状态。
- 主动关闭方发送
常见面试题 2:为什么挥手需要四次?
- 原因:TCP 的半关闭特性
服务器收到客户端的 FIN 时,可能仍有数据未发送完,因此先回复 ACK 确认关闭请求(第二次挥手),待数据发送完毕后再发送 FIN(第三次挥手)。而三次握手时,服务器可在 SYN+ACK 中同时确认和请求连接,因此只需三次。
常见面试题 3:TIME_WAIT 状态的作用是什么?
-
确保最后一次 ACK 到达服务器
若 ACK 丢失,服务器会重发 FIN,TIME_WAIT 状态的客户端可重新发送 ACK,避免连接异常关闭。 -
避免旧报文段干扰新连接
旧连接的报文段可能在网络中滞留,等待2MSL(最大报文段生存时间的 2 倍)后,旧报文段会自然失效,防止新连接接收旧数据。
常见面试题 4:SYN Flood 攻击是什么?如何防御?
-
攻击原理:
攻击者发送大量 SYN 报文段,占用服务器的半连接队列(SYN_RCVD 状态),导致正常连接请求被拒绝。 -
防御措施:
- SYN Cookie: 服务器不存储半连接状态,而是根据客户端 IP、端口等信息生成 Cookie,收到 ACK 时验证 Cookie 合法性。
- 缩短半连接超时时间: 清理无效的 SYN_RCVD 状态,释放资源。
- TCP Syncookies: 内核参数
net.ipv4.tcp_syncookies=1开启,动态分配资源。
常见面试题 5:三次握手和四次挥手中的状态转换?
-
三次握手状态:
客户端:CLOSED → SYN_SENT → ESTABLISHED
服务器:CLOSED → LISTEN → SYN_RCVD → ESTABLISHED -
四次挥手状态:
主动关闭方:ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
被动关闭方:ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED
三、核心总结对比
| 阶段 | 目的 | 关键报文段 | 为什么是 N 次? |
|---|---|---|---|
| 三次握手 | 建立可靠连接 | SYN→SYN+ACK→ACK | 确保双向通信,防止历史连接 |
| 四次挥手 | 安全释放连接 | FIN→ACK→FIN→ACK | 支持半关闭,允许剩余数据传输 |

3586

被折叠的 条评论
为什么被折叠?



