Skip to content

TCP 三次握手与四次挥手

面试必问系列:用最通俗的方式讲清楚 TCP 连接建立与断开

什么是 TCP?

TCP(Transmission Control Protocol):传输控制协议

简单理解:TCP 就像打电话,双方需要确认彼此都能听得到,才能开始聊天


一、三次握手:建立连接

为什么要握手?

就像两个人见面要打招呼:

A:你好,我能听到你说话吗?
B:你好,我能听到你说话,你也能听到我吗?
A:是的,我可以听到你说话!

→ 三次确认后,双方都知道彼此能正常通信

三次握手流程

状态变化:

  • 客户端:CLOSED → SYN_SENT → ESTABLISHED
  • 服务器:LISTEN → SYN_RCVD → ESTABLISHED

每个字段的含义


为什么要三次?

问题:两次不行吗?

一次:A → B:我要连接
     B → A:好的,连接吧
     
问题:B 不知道 A 能不能听到 B 的回复

问题:四次呢?

A → B:我要连接(seq=x)
B → A:好的,我准备好了(seq=y,ack=x+1)
B → A:我真的准备好了(seq=y+1)
A → B:好的,我知道你准备好了

→ 三次就够了,四次浪费

二、四次挥手:断开连接

为什么要挥手?

就像打电话结束时要挂断:

A:我说完了,再见!
B:好的,我知道了。等一下,我还有最后一点要说...
B:我也说完了,再见!
A:好的,再见!

→ 需要四次交互,确保双方数据都传输完毕

四次挥手流程

状态变化:

  • 客户端:ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
  • 服务器:ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED

为什么需要 2MSL?

MSL(Maximum Segment Lifetime):最大报文存活时间

问题:最后一次 ACK 发送到服务器后,客户端为什么不直接关闭?

解决:等待 2MSL(通常是 1-4 分钟),确保服务器重传的 FIN 都能被正确处理


为什么是四次?

问题:三次不行吗?

A → B:FIN(我要断开)
B → A:ACK(好的)
B → A:FIN(我也断开)
A → B:ACK(好的)

→ 可以!但是第二次和第三次不能合并

三、完整流程图


四、常见面试题

Q1:为什么是三次握手而不是两次?

两次握手问题:
- 客户端发送的第一个 SYN 包可能滞留网络中
- 服务器收到旧的 SYN 包,会建立无效连接
- 客户端不认可这个连接,浪费服务器资源

三次握手:
- 第三次握手时,客户端确认了服务器能收到自己的消息
- 避免了无效连接建立

Q2:为什么是四次挥手而不是三次?

- 第二次挥手后,服务器可能还有数据要发送
- 必须等数据发完才能发送第三次挥手
- 无法像三次握手那样合并

Q3:TCP 和 UDP 的区别?

特性TCPUDP
连接面向连接无连接
可靠性可靠不可靠
速度
场景文件传输、网页视频、语音

Q4:SYN 攻击是什么?

攻击原理:
- 黑客发送大量 SYN 包,但不完成第三次握手
- 服务器等待超时过程中,占用大量连接资源
- 正常用户无法连接

防御措施:
- SYN Cookie:服务器不立即分配资源,而是计算一个 cookie
- 缩短 SYN Timeout 时间
- 增加半连接队列长度

五、总结

一句话总结:

  • 三次握手:双方都要确认对方"能收能发",所以需要三次
  • 四次挥手:服务器可能还有数据要发,所以 ACK 和 FIN 不能合并,需要四次