← 每日面试题 学习看板

什么是TCP三次握手、四次挥手?

面试题/04 计算机相关-网络-组件-虚拟化/02 计算机网络/什么是TCP三次握手、四次挥手?.md

面试记录 2026-09-27

题目:什么是TCP三次握手、四次挥手?

难度:low

标签:computer/network, general/knowledge

评分:⭐⭐☆☆☆(2/5)

我的回答

TCP 通过三次握手和四次挥手,确保了自己可靠性的保证,信息传递的可靠性的保证。

通过三次握手确认发送方与接收方的接收与发送能力。

通过四次挥手来确定消息整个全部结束,再加确认这个事情已经完结。

点评

优点:

不足:

补充:

  1. 客户端发 SYN, seq=x → SYN_SENT
  2. 服务端回 SYN+ACK, seq=y, ack=x+1 → SYN_RCVD
  3. 客户端回 ACK, ack=y+1 → ESTABLISHED(服务端收到也进入 ESTABLISHED)
  1. 主动方发 FIN → FIN_WAIT_1
  2. 被动方回 ACK → CLOSE_WAIT,主动方进入 FIN_WAIT_2
  3. 被动方数据发完后发 FIN → LAST_ACK
  4. 主动方回 ACK → TIME_WAIT,2MSL 后 CLOSE;被动方收到 ACK → CLOSE

完整讲解

第一部分:知识重点剖析

核心考点定位:考察 TCP 连接建立与释放的具体报文交换流程、状态机流转,以及设计背后的原因。

知识点拆解:

  1. 三次握手流程(建立连接):SYN → SYN+ACK → ACK,双方通过交换初始序列号确认彼此的收/发能力。
  2. 为什么是三次:两次不行——服务端可能重复建立早已失效的历史连接,浪费资源;三次是最少的可靠握手次数(每次交互双方各确认一次收发能力,需要 3 次报文才能完成)。
  3. 四次挥手流程(释放连接):FIN → ACK → FIN → ACK,被动方需要独立回 ACK 因为它可能还有数据要发完。
  4. 为什么挥手是四次:TCP 是全双工,双向连接要分别关闭。FIN 表示"我这边没数据要发了",而 ACK 表示"我知道你要关了",两者不能合并(因为 ACK 时可以还有数据待发)。
  5. TIME_WAIT 与 2MSL:主动关闭方进入 TIME_WAIT 状态等待 2MSL(Linux 默认 60s)。目的是(1)保证最后一个 ACK 到达,若丢失被动方可重发 FIN;(2)让旧连接的延迟报文在网络中自然消亡,避免污染新连接。
  6. 异常场景:SYN Flood 攻击(半连接队列被打满)、TIME_WAIT 过多(大量短连接导致)、CLOSE_WAIT 堆积(应用层未 close socket 代码 bug)。
递进:握手是"三次因为要确认双向收发",挥手是"四次因为全双工要分开关"。

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. 两次握手为什么不行?
  1. 生产环境大量 TIME_WAIT 怎么办?
  1. CLOSE_WAIT 堆积说明什么?
  1. 如何防止 SYN Flood 攻击?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,TCP 三次握手和四次挥手我分开讲。

三次握手:目的是双向确认彼此的收发能力。

为什么是三次:两次不够,如果客户端的 SYN 在网络中延迟到达,服务端可能建立一条已经没用的连接。三次是"每次交互双方各确认一次"的最小交互次数。

四次挥手:连接是全双工的,要分别关,所以不能像握手那样合起来。

TIME_WAIT 为什么要等 2MSL:一是保证最后一个 ACK 能到达被动方,如果丢了被动方会重发 FIN;二是让旧连接的所有报文都自然消亡,避免污染同一个四元组的新连接。生产上如果 TIME_WAIT 太多,通常意味着大量短连接,可以开启 tcp_tw_reuse 或者复用连接。

CLOSE_WAIT 堆积是另一种异常,说明应用代码没 close socket,通常是 bug。