前言
在计算机网络中,TCP 协议是互联网最核心、最重要的传输层协议。它最大的特点是面向连接、可靠传输、全双工通信。
为了实现“可靠”,TCP 在传输数据前必须建立连接、传输结束后必须断开连接,这就诞生了网络面试最经典的两个过程:
• 三次握手(建立连接)
• 四次挥手(断开连接)
本文从零、通俗、细节全覆盖讲清楚全过程、状态变化、原理、为什么是三次、为什么是四次。
一、TCP 核心基础
1. TCP 是全双工
客户端和服务器各自都有发送通道、接收通道,互不干扰。
• 客户端可以发数据、收数据
• 服务端可以发数据、收数据
正因为双向独立,所以:
• 建连接可以合并报文(三次握手)
• 断连接不能合并报文(必须四次挥手)
2. 关键标志位
• SYN:请求建立连接
• FIN:请求关闭连接
• ACK:确认收到报文
二、TCP 三次握手(建立连接)
1. 全过程详解
第一次握手(客户端 → 服务端:SYN)
客户端主动发起连接,发送 SYN 报文,携带自己的初始序列号 ISN(x)。
• 客户端状态:SYN_SENT
• 作用:客户端测试自己发送能力正常,询问服务端是否在线。
第二次握手(服务端 → 客户端:SYN + ACK)
服务端收到 SYN,确认客户端正常,返回:
1. ACK(x+1):确认收到客户端连接请求
2. SYN(y):服务端也向客户端发起连接请求
• 服务端状态:SYN_RCVD
• 作用:证明服务端收、发能力都正常
第三次握手(客户端 → 服务端:ACK)
客户端收到服务端 SYN+ACK,再次回复确认:ACK(y+1)
• 客户端状态:ESTABLISHED
• 服务端收到后:ESTABLISHED
连接正式建立,可以传输数据!
2. 通俗比喻
• 你:喂听得到吗?(第一次握手 SYN)
• 对方:听得到,你听得见我吗?(第二次 SYN+ACK)
• 你:我也听得到!(第三次 ACK)
通话建立。
3. 为什么是三次握手,不是两次?
核心原因:防止失效连接占用服务器资源
如果只有两次握手:
客户端超时重发的旧过期 SYN到达服务端,服务端直接建立连接、占用资源,但客户端早已断开,造成服务器空连接浪费资源。
三次握手可以双向确认双方收发都正常,杜绝无效连接。
三、TCP 四次挥手(断开连接)
TCP 是全双工,数据通道读、写互相独立。
所以:
• 关闭发送通道 和 关闭接收通道 必须分开执行
• ACK 和 FIN 不能合并,因此必须四次挥手
1. 全过程详解
第一次挥手(客户端 → 服务端:FIN)
客户端数据发送完毕,主动关闭客户端→服务端发送通道。
• 状态:FIN_WAIT_1
第二次挥手(服务端 → 客户端:ACK)
服务端收到关闭请求,回复确认。
• 客户端状态:FIN_WAIT_2
• 此时:客户端不能发数据,但还能收数据
服务端可能还有剩余数据没发完!
第三次挥手(服务端 → 客户端:FIN)
服务端数据全部发送完毕,主动关闭服务端→客户端通道。
• 服务端状态:LAST_ACK
第四次挥手(客户端 → 服务端:ACK)
客户端确认关闭,等待 2MSL 彻底释放连接。
• 服务端收到 ACK:直接断开
• 客户端等待超时后断开
2. 通俗比喻
• 你:我说完了(FIN)
• 对方:收到,我还有点话要说(ACK)
• 对方:我也说完了(FIN)
• 你:好,结束(ACK)
3. 为什么挥手要四次?
握手可以合并 SYN+ACK(新建连接无数据)
挥手存在残留数据:
• 收到关闭请求后,服务端可能还在传数据
• 不能立刻 FIN,必须先发 ACK、传完数据再 FIN
因此ACK 和 FIN 必须分两次发送,总共四次。
4. 为什么客户端最后等待 2MSL?
1. 确保最后一次 ACK 能被服务端收到
2. 防止残留旧报文影响新连接
四、三次握手、四次挥手 核心区别总结
1. 握手三次:建连接、无数据,SYN+ACK 可合并
2. 挥手四次:断连接、存在残余数据,ACK、FIN 不能合并
3. 握手:双向同步序号
4. 挥手:双向分别关闭读写通道
五、面试终极一句话总结
• 三次握手:双向确认收发正常,可靠建立连接
• 四次挥手:双向通道独立关闭,安全释放连接
六、完整流程记忆口诀
握手:问、应答、确认
挥手:我关、我知道、我也关、好的