当前位置: 首页 > news >正文

网络安全 | TCP三次握手与四次挥手

引言

TCP(传输控制协议)是互联网最核心的协议之一,它提供了可靠的、面向连接的通信服务。无论是浏览网页、发送邮件还是使用即时通讯,背后都离不开TCP的握手与挥手过程。本文将用最直观的Mermaid流程图,带你彻底搞懂TCP的三次握手和四次挥手。

为什么需要三次握手?为什么是四次挥手?

在深入流程图之前,我们先理解两个核心问题:

为什么要三次握手?

  • 第一次握手:客户端告诉服务端“我要连接你”
  • 第二次握手:服务端回复“我收到了,你要连我吗?”
  • 第三次握手:客户端回复“好的,我们开始通信吧”

三次握手最小化地保证了双方都有收发能力,同时避免了历史连接重复连接的干扰。

如果只有两次握手,服务端无法确认客户端是否真的准备好了,可能会浪费资源。

为什么要四次挥手?

TCP连接是全双工的,双方都可以独立关闭自己的数据通道:

  • 客户端说“我发完了”
  • 服务端说“我知道你发完了”
  • 服务端说“我也发完了”
  • 客户端说“我知道你也发完了”

四次挥手确保了双方的数据都完整传输完毕,并且可以优雅关闭。

TCP三次握手流程图

服务端(Server)客户端(Client)服务端(Server)客户端(Client)三次握手建立连接连接建立,开始传输数据1. SYN=1, seq=x(请求建立连接)2. SYN=1, ACK=1, seq=y, ack=x+1(同意建立连接)3. ACK=1, seq=x+1, ack=y+1(确认收到,连接建立成功)

三次握手详细说明

步骤发送方向报文关键信息状态变化
1客户端 → 服务端SYN=1, seq=x客户端进入SYN_SENT
2服务端 → 客户端SYN=1, ACK=1, seq=y, ack=x+1服务端进入SYN_RCVD
3客户端 → 服务端ACK=1, seq=x+1, ack=y+1双方进入ESTABLISHED

seq是序列号,ack是确认号。ack = 对方seq + 1表示“我已收到你的上一个包”。


TCP四次挥手流程图

服务端(Server)客户端(Client)服务端(Server)客户端(Client)四次挥手断开连接此时Server可以继续发送数据等待2MSL后关闭1. FIN=1, seq=a(我没有数据要发了)2. ACK=1, ack=a+1(知道你没数据了)3. FIN=1, seq=b(我也没数据要发了)4. ACK=1, ack=b+1(确认收到,彻底断开)

四次挥手详细说明

步骤发送方向报文关键信息状态变化
1客户端 → 服务端FIN=1, seq=a客户端进入FIN_WAIT_1
2服务端 → 客户端ACK=1, ack=a+1服务端进入CLOSE_WAIT
客户端进入FIN_WAIT_2
3服务端 → 客户端FIN=1, seq=b服务端进入LAST_ACK
4客户端 → 服务端ACK=1, ack=b+1客户端进入TIME_WAIT(等待2MSL)
服务端进入CLOSED

2MSL= 2 × Maximum Segment Lifetime(报文最大生存时间),默认通常为2分钟,确保最后一个ACK能被对方收到。


常见问题

为什么连接是三次握手,关闭是四次挥手?

  • 连接时,服务端的SYN和ACK可以合并成一次发送(第二步)。
  • 关闭时,客户端先发出FIN表示自己不再发送数据,但服务端可能还有数据要发,所以ACK和FIN必须分开发送,因此需要四次。

为什么客户端最后要等待2MSL?

  • 保证最后一个ACK能被服务端收到。如果ACK丢失,服务端会重发FIN,客户端可以再次响应。
  • 防止“旧连接”的迷途报文影响新连接。

什么是半关闭状态?

  • 在第一次挥手之后,客户端不再发送数据,但可以接收数据,服务端也可以继续发送数据,这就是半关闭状态(FIN_WAIT_2)。

如果服务端同时收到多个连接请求怎么办?

  • 服务端会将每个连接请求放入半连接队列(SYN队列),三次握手完成后移入全连接队列(Accept队列)。

Linux 下查看TCP状态

# 查看所有TCP连接状态netstat-ant# 查看连接状态统计ss-s# 查看某个端口的连接状态lsof-i:8080

常见状态:

  • LISTEN:监听
  • SYN_SENTSYN_RCVD:握手过程中
  • ESTABLISHED:已建立连接
  • FIN_WAIT_1FIN_WAIT_2TIME_WAITCLOSE_WAITLAST_ACK:挥手中

总结

对比项三次握手四次挥手
目的建立可靠连接优雅关闭连接
次数3次4次
能否合并包可以(SYN+ACK)不能(ACK和FIN必须分开)
关键状态ESTABLISHEDTIME_WAITCLOSE_WAIT
是否必须
http://www.cnnetsun.cn/news/2170524.html

相关文章:

  • Horizon X3 AI开发板:边缘计算与BPU架构实战解析
  • MT5 机构级CTP交易管理系统CTP_PLUS
  • 2026年安卓固件加固公司怎么选?从防护强度、性能损耗到合规支撑全解析
  • 我的第一个医学图像分割项目:用UNet在Kaggle细胞核数据集上跑出0.92 IoU
  • ARM SVE2浮点运算指令优化与AI加速实践
  • JavaScript学习路线
  • Kinematify:基于RGB视频的3D关节物体自动重建技术
  • day01 哈希/排序/数组
  • TL431分压电阻计算公式
  • 电池管理系统(BMS)核心技术解析与应用实践
  • 为什么92%的PHP开发者在PHP 9.0 Beta中踩坑?——异步HTTP客户端配置错误导致AI机器人响应延迟超800ms,附官方补丁包下载链接
  • MiMo 开放平台的MiMo邀请码
  • 基于Rust与WebGPU的本地大模型推理服务器部署与实战指南
  • 避坑指南:UR5e+Realsense手眼标定中,坐标系搞错、采样失败怎么办?
  • Taotoken 用量看板如何帮助开发者洞察 API 消耗
  • AI产品经理必备:掌握这“前后左右”四维能力,轻松定义产品未来!
  • Allegro PCB设计效率翻倍秘诀:活用这5个被低估的SubClass(以Route Keepin为例)
  • Dify 2026多模态集成避坑手册,覆盖OpenAI GPT-4o、Qwen-VL、InternVL2三大底座的11项兼容性验证标准
  • 从STM32到网络协议:实战解析C语言结构体打包(#pragma pack)的两种典型应用场景
  • 监督强化学习框架解析与数学推理任务实践
  • 从AttributeError聊起:Pandas的Series和NumPy的ndarray到底有啥区别?
  • QT自定义控件实战:从零创建一个带渐变背景和图标的自定义Button(继承QPushButton)
  • Hitboxer终极指南:彻底解决游戏键盘冲突的专业工具
  • IOMM框架:图像自监督预训练在UMM视觉生成中的应用
  • 如何在电脑上查看 iQOO 短信(4 种简单方法)
  • Momenta 校招 C++ 考试题到底怎么考?它筛的不是刷题机器,是能把算法和系统一起落地的人
  • Nordic Thingy:53物联网开发平台全解析
  • 开源电台接口DIY:从原理到实战,打造专属业余无线电数字模式连接方案
  • Luxonis OAK4 AI视觉相机:边缘计算与深度感知技术解析
  • 基于源语音感知的神经机器翻译质量评估技术