一、三次握手(Three-Way Handshake)
目的:建立 TCP 连接,同步初始序列号(ISN),协商窗口大小等参数。
1. 详细流程
客户端 服务器
| |
|--- SYN(seq=x) -------->| // 客户端向服务器发送 SYN 包(请求建立连接)
| |
|<-- SYN+ACK(seq=y, ack=x+1)---| // 服务器响应 SYN+ACK 包(同意建立连接)
| |
|--- ACK(seq=x+1, ack=y+1) -->| // 客户端确认,发送 ACK 包(连接建立完成)
2. 关键点
- SYN 包:客户端随机生成初始序列号
x,标志位SYN=1; - SYN+ACK 包:服务器生成自己的初始序列号
y,并确认客户端的序列号(ack=x+1); - ACK 包:客户端确认服务器的序列号(
ack=y+1),此时双方序列号偏移量均为 1。
3. 为什么需要三次握手?两次不行吗?
- 防止历史连接:若客户端发送的 SYN 包因网络延迟滞留,后续新连接建立后,旧 SYN 到达服务器会被识别为无效(序列号不匹配);
- 同步初始序列号:双方需交换各自的初始序列号,确保后续数据按序传输;
- 可靠性验证:三次握手可验证双方发送和接收能力是否正常(客户端→服务器、服务器→客户端、客户端→服务器)。
二、四次挥手(Four-Way Handshake)
目的:关闭 TCP 连接,确保双方数据传输完毕。
1. 详细流程
客户端 服务器
| |
|--- FIN(seq=u) -------->| // 客户端请求关闭连接(发送 FIN 包)
| |
|<-- ACK(seq=v, ack=u+1)---| // 服务器确认收到 FIN(进入 CLOSE_WAIT 状态)
| |
|<-- FIN(seq=w, ack=u+1)---| // 服务器发送 FIN 包(请求关闭连接)
| |
|--- ACK(seq=u+1, ack=w+1) -->| // 客户端确认 FIN(进入 TIME_WAIT 状态)
2. 关键点
- FIN 包:表示请求关闭连接,发送方数据已发送完毕;
- CLOSE_WAIT 状态:服务器收到 FIN 后进入此状态,需等待上层应用确认关闭;
- TIME_WAIT 状态:客户端发送最后 ACK 后进入此状态,持续 2MSL(最大段生存时间),确保服务器收到 ACK(若服务器未收到会重发 FIN)。
3. 为什么需要四次挥手?
- 半关闭机制:TCP 连接是全双工的,需分别关闭发送和接收通道;
- FIN 与 ACK 分离:服务器收到客户端 FIN 后,可能仍有数据需发送,因此先 ACK 确认,再单独发送 FIN。
三、状态转换图(高频考点)
1. 三次握手状态变化
客户端:CLOSED → SYN_SENT → ESTABLISHED
服务器:CLOSED → LISTEN → SYN_RCVD → ESTABLISHED
2. 四次挥手状态变化
客户端:ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
服务器:ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED
3. TIME_WAIT 状态的作用
- 确保最后一个 ACK 包被服务器收到(若丢失,服务器会重发 FIN);
- 等待足够时间,让本次连接的所有数据包在网络中消失,防止干扰新连接。
四、问题
1. 问:为什么 TIME_WAIT 状态需要持续 2MSL?
答:
- MSL(Maximum Segment Lifetime)是数据包在网络中的最大生存时间;
- 2MSL 确保:
- 本次连接的所有数据包都已过期(若服务器重发 FIN,客户端可响应);
- 新连接不会收到旧连接的残留数据包。
2. 问:TCP 连接建立后,客户端突然崩溃,服务器如何处理?
答:
- 服务器通过 TCP 保活机制(Keep-Alive) 检测连接状态:
- 若长时间无数据传输,服务器发送探测包;
- 若多次探测无响应,服务器关闭连接。
3. 问:SYN 洪泛攻击(SYN Flood)如何发生?如何防御?
答:
- 攻击原理:攻击者伪造大量 SYN 包,服务器响应 SYN+ACK 后无法收到 ACK,导致半连接队列占满,拒绝正常请求;
- 防御措施:
- 增大半连接队列长度;
- 启用 SYN Cookie(不缓存 SYN 状态,用算法生成 ACK 序列号);
- 限速过滤异常流量。
五、总结
三次握手:客户端发 SYN,服务器回 SYN+ACK,客户端再发 ACK;
四次挥手:客户端发 FIN,服务器 ACK,服务器发 FIN,客户端 ACK;
TIME_WAIT 等 2MSL,保活机制防崩溃,SYN Cookie 抗攻击。