news 2026/7/13 13:50:29

TCP 三次握手与四次挥手:从 3 个核心状态变迁到 2MSL 等待的完整流程解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TCP 三次握手与四次挥手:从 3 个核心状态变迁到 2MSL 等待的完整流程解析

TCP 三次握手与四次挥手:从状态变迁到 2MSL 等待的深度解析

在网络通信的世界里,TCP协议如同一位严谨的邮差,确保每一份数据都能准确无误地送达目的地。而三次握手和四次挥手,则是这位邮差建立信任和礼貌告别的关键仪式。本文将带您深入TCP连接管理的核心机制,从状态机的视角剖析这两个经典流程。

1. TCP连接建立:三次握手的艺术

TCP连接建立的过程被称为"三次握手",这不仅是网络通信的基础,更是可靠性设计的典范。让我们先看一个典型的握手流程:

客户端 服务端 | | | SYN=1, seq=x | |------------------------------>| | | | SYN=1, ACK=1, seq=y | | ack=x+1 | |<-------------------------------| | | | ACK=1, ack=y+1 | |------------------------------>|

1.1 状态变迁详解

客户端视角

  • CLOSED:初始状态
  • SYN_SENT:发送SYN包后进入此状态
  • ESTABLISHED:收到SYN-ACK并发送ACK后进入

服务端视角

  • CLOSED:初始状态
  • LISTEN:绑定端口后进入监听状态
  • SYN_RCVD:收到SYN包后进入
  • ESTABLISHED:收到ACK后完成连接

关键点:服务端的LISTEN状态是握手过程的起点,而SYN_RCVD状态常成为SYN洪泛攻击的目标

1.2 为什么必须是三次?

两次握手看似可行,实则存在严重隐患:

  1. 历史连接问题:网络延迟可能导致旧的SYN包突然到达,服务端会误认为是新连接
  2. 资源浪费:服务端在收到SYN后立即分配资源,若客户端不确认会导致资源滞留
  3. 序列号同步:三次握手确保双方初始序列号(ISN)被正确确认
# 简化的三次握手模拟 def three_way_handshake(): client_seq = generate_isn() # 客户端生成初始序列号 server_seq = generate_isn() # 服务端生成初始序列号 # 第一次握手:SYN send_packet(SYN=1, seq=client_seq) # 第二次握手:SYN-ACK syn_ack = receive_packet() assert syn_ack.SYN == 1 and syn_ack.ACK == 1 assert syn_ack.ack == client_seq + 1 # 第三次握手:ACK send_packet(ACK=1, ack=syn_ack.seq + 1)

1.3 初始序列号(ISN)的奥秘

ISN并非从0开始,而是基于时钟的动态值,这设计考虑了:

  • 安全性:防止攻击者猜测序列号
  • 可靠性:避免网络中残留的旧包被误认为有效数据
  • 唯一性:确保同一四元组(源IP、源端口、目的IP、目的端口)的旧连接不会干扰新连接

2. TCP连接终止:四次挥手的智慧

如果说三次握手是礼貌的问候,那么四次挥手就是郑重的告别。典型的挥手流程如下:

客户端 服务端 | | | FIN=1, seq=u | |------------------------------>| | | | ACK=1, ack=u+1 | |<-------------------------------| | | | | (服务端处理剩余数据) | | | FIN=1, seq=v | | ACK=1, ack=u+1 | |<-------------------------------| | | | ACK=1, ack=v+1 | |------------------------------>|

2.1 状态变迁全解析

主动关闭方(以客户端为例)

  • FIN_WAIT_1:发送FIN后进入
  • FIN_WAIT_2:收到ACK后进入(等待对端FIN)
  • TIME_WAIT:收到FIN并发送ACK后进入
  • CLOSED:2MSL超时后进入

被动关闭方(服务端)

  • CLOSE_WAIT:收到FIN并发送ACK后进入
  • LAST_ACK:发送自己的FIN后进入
  • CLOSED:收到ACK后完成关闭

2.2 为什么需要四次挥手?

TCP是全双工协议,每个方向必须单独关闭:

  1. 客户端发送FIN,表示不再发送数据(但还能接收)
  2. 服务端ACK确认
  3. 服务端处理完数据后发送FIN
  4. 客户端ACK确认

关键差异:服务端的ACK和FIN不能合并发送,因为中间可能需要时间处理剩余数据

2.3 TIME_WAIT状态的价值

主动关闭方会保持TIME_WAIT状态2MSL(最长报文段寿命)时间,这看似浪费,实则必要:

  • 可靠终止:确保最后一个ACK能到达对端(若丢失可重传)
  • 旧连接清理:让网络中残留的旧连接报文失效
  • 新连接保护:防止相同四元组的新连接收到旧数据

MSL建议值为2分钟,因此TIME_WAIT通常持续4分钟

3. 异常场景分析与实战案例

3.1 SYN洪泛攻击与防御

攻击原理: 攻击者发送大量SYN包但不完成握手,耗尽服务端的半连接队列(SYN_RCVD状态)

防御方案

  • SYN Cookie:不立即分配资源,用加密哈希生成初始序列号
  • 增加队列大小net.ipv4.tcp_max_syn_backlog
  • 减少重试次数net.ipv4.tcp_synack_retries
# Linux系统防御相关参数调整 echo 1024 > /proc/sys/net/ipv4/tcp_max_syn_backlog echo 1 > /proc/sys/net/ipv4/tcp_synack_retries

3.2 TIME_WAIT堆积问题

当短连接频繁时,可能出现大量TIME_WAIT连接:

解决方案

  • 重用选项net.ipv4.tcp_tw_reusenet.ipv4.tcp_tw_recycle
  • 长连接:减少连接创建频率
  • 调整端口范围net.ipv4.ip_local_port_range

3.3 连接状态监控实战

使用netstat命令观察TCP状态:

# 查看所有TCP连接状态 netstat -antp # 统计各状态连接数 netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

典型输出示例:

LISTEN 5 SYN_RECV 2 ESTABLISHED 20 FIN_WAIT1 1 FIN_WAIT2 3 TIME_WAIT 50

4. 面试核心问题深度剖析

4.1 为什么客户端需要等待2MSL?

  1. 确保最后一个ACK到达:如果ACK丢失,服务端会重发FIN
  2. 清除旧连接报文:等待足够时间让网络中残留报文失效
  3. 协议可靠性:TCP设计需要确保连接终止的可靠性

4.2 半关闭状态(Half-Close)的应用

TCP允许单向关闭,这在某些场景非常有用:

// 示例:shutdown实现半关闭 int shutdown(int sockfd, int how); /* how参数: SHUT_RD - 关闭读端 SHUT_WR - 关闭写端 SHUT_RDWR - 全关闭 */

典型应用场景:

  • HTTP/1.1的流水线技术
  • 文件传输确认
  • 金融交易确认流程

4.3 初始序列号的选择策略

现代系统通常采用基于时钟的ISN生成算法:

  1. 每4微秒计数器+1
  2. 添加随机偏移量
  3. 结合加密哈希增强安全性

这有效防止了序列号预测攻击,同时保证了唯一性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 13:50:26

5分钟掌握终极免费OCR工具:Umi-OCR的完整使用指南

5分钟掌握终极免费OCR工具&#xff1a;Umi-OCR的完整使用指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片&#xff0c;PDF文档识别&#xff0c;排除水印/页眉页脚&#xff0c;扫描/生成二维码。内置多国语言库。…

作者头像 李华
网站建设 2026/7/13 13:49:37

AirDropPlus终极指南:3分钟实现Windows与iOS文件传输革命

AirDropPlus终极指南&#xff1a;3分钟实现Windows与iOS文件传输革命 【免费下载链接】AirDropPlus Effortless file transfer and clipboard sync between Windows and iOS — powered by Python and Apple Shortcuts. 项目地址: https://gitcode.com/gh_mirrors/ai/AirDrop…

作者头像 李华
网站建设 2026/7/13 13:49:36

Cursor Pro破解完全指南:5步免费解锁AI编程助手高级功能

Cursor Pro破解完全指南&#xff1a;5步免费解锁AI编程助手高级功能 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your t…

作者头像 李华
网站建设 2026/7/13 13:49:04

双眼视觉的量子隐喻:我们从未见过“确切”的世界

引言&#xff1a;一个深刻的直觉 “人双眼看到的那个世界&#xff0c;本来就不是那么确切的。” 这个将量子力学叠加态概念用于双眼视觉的想法&#xff0c;并非外行的牵强类比&#xff0c;而是触及了感知哲学的核心。它揭示了一个令人震撼的真相&#xff1a;我们所谓的“现实”…

作者头像 李华
网站建设 2026/7/13 13:48:34

深入Winlogon:从RPC消息处理到系统热键拦截的逆向工程实践

1. Winlogon与系统热键的底层机制剖析Windows登录管理器&#xff08;Winlogon&#xff09;作为系统核心组件&#xff0c;负责处理用户登录/注销、安全注意序列&#xff08;SAS&#xff09;等关键操作。当用户按下CtrlAltDel组合键时&#xff0c;系统会触发一系列精密的底层交互…

作者头像 李华