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

TCP 连接管理:深入分析四次握手与三次挥手

TCP 连接管理:深入分析四次握手与三次挥手


一、TCP 连接建立:四次握手(Four-Way Handshake)

核心目标可靠地协商初始序列号(ISN),确保双方具备双向通信能力,防止历史连接混淆。

工作流程与报文详解
  1. SYN(Client → Server)

    • 标志位SYN=1, ACK=0
    • 序列号(Seq):随机值 X(Client ISN)
    • 作用:请求建立连接,声明初始序列号。
  2. SYN-ACK(Server → Client)

    • 标志位SYN=1, ACK=1
    • 序列号(Seq):随机值 Y(Server ISN)
    • 确认号(Ack)X+1(确认收到Client的SYN)
    • 作用:同意建立连接,提供自身ISN,确认客户端SYN。
  3. ACK(Client → Server)

    • 标志位ACK=1
    • 序列号(Seq)X+1(延续Client序列号)
    • 确认号(Ack)Y+1(确认收到Server的SYN)
    • 作用:确认服务端的SYN,连接正式建立。
  4. (可选)ACK + Data

    • 实际中,此报文常携带应用层数据(如HTTP请求)。
为什么需要四次握手?
  • 两次握手缺陷:若失效的SYN(因延迟超时)到达服务端,服务端会错误建立连接。
  • 三次握手解决:Client通过第三次ACK拒绝历史连接(若收到旧SYN的ACK,则发送RST重置)。
内核实现关键点
  • 半连接队列(SYN Queue):存储收到SYN但未完成握手的连接。
  • 全连接队列(Accept Queue):存储完成握手等待accept()的连接。
  • SYN Flood防御:使用SYN Cookies(如Linux)避免资源耗尽。

二、TCP 连接终止:三次挥手(Three-Way Handshake)

核心目标双方独立关闭双向数据流,确保数据完整传输。

工作流程与报文详解
  1. FIN(主动关闭方 → 被动方)

    • 标志位FIN=1, ACK=1
    • 序列号(Seq):当前已发送数据的下一序号 M
    • 作用:声明发送通道关闭(仍可接收数据)。
  2. ACK(被动方 → 主动方)

    • 标志位ACK=1
    • 确认号(Ack)M+1
    • 作用:确认收到FIN,通知应用层关闭。
  3. FIN(被动方 → 主动方)

    • 标志位FIN=1, ACK=1
    • 序列号(Seq)N(可能携带最后数据)
    • 确认号(Ack)M+1(保持对FIN的确认)
    • 作用:通知主动方自身发送通道关闭。
  4. ACK(主动方 → 被动方)

    • 标志位ACK=1
    • 确认号(Ack)N+1
    • 作用:确认被动方的FIN,连接完全关闭。
为什么是三次挥手?
  • 被动方的ACKFIN不能合并发送:因应用层可能需要时间处理剩余数据(CLOSE_WAIT状态)。

三、关键状态与异常处理

状态触发条件意义
SYN_SENT发送SYN后等待SYN-ACK
SYN_RECEIVED收到SYN并回复SYN-ACK等待最终ACK
ESTABLISHED完成握手数据可双向传输
FIN_WAIT_1主动方发送FIN等待ACK或FIN
CLOSE_WAIT被动方收到FIN等待应用层关闭
LAST_ACK被动方发送FIN等待最终ACK
TIME_WAIT主动方收到FIN并发送ACK确保被动方收到ACK(2MSL)
TIME_WAIT 的重要性
  • 持续时间2 * MSL(MSL通常为30s/60s)。
  • 作用
    1. 确保被动方重传的FIN能被响应(若ACK丢失)。
    2. 防止相同四元组(源IP/端口 + 目标IP/端口)的新连接收到旧连接的延迟报文。

四、流程图解

连接建立(四次握手)
  Client                          Server|                              ||-------- SYN (Seq=X) -------->|  → Server: SYN_RCVD|                              ||<----- SYN-ACK (Seq=Y, Ack=X+1) --|  → Client: ESTABLISHED|                              ||------ ACK (Ack=Y+1) -------->|  → Server: ESTABLISHED|                              |
连接终止(三次挥手)
  Client (主动关闭)               Server|                              ||---------- FIN (Seq=M) ------>|  → Server: CLOSE_WAIT|                              ||<------- ACK (Ack=M+1) -------|  |                              ||<------- FIN (Seq=N) ---------|  → Server: LAST_ACK|                              ||------ ACK (Ack=N+1) -------->|  → Client: TIME_WAIT (2MSL)|                              |      Server: CLOSED

五、总结

特性四次握手三次挥手
核心目的协商初始序列号,防止历史连接独立关闭双向数据流
关键状态SYN_SENT, SYN_RCVDFIN_WAIT, CLOSE_WAIT, TIME_WAIT
设计难点SYN Flood攻击防御TIME_WAIT优化与端口复用
合并报文ACK与数据合并常见ACK与FIN不可合并(需等待应用层)

实际意义

  • 握手:确保通信双方具备可靠传输的基础能力。
  • 挥手:优雅终止连接,避免数据丢失与资源泄漏。
  • TIME_WAIT:TCP可靠性设计的最后防线,牺牲短期资源换取协议健壮性。

补充:在极端优化场景(如HTTP/1.1 Keep-Alive)中,一个连接可处理多次请求,减少握手/挥手开销。但底层机制仍是TCP可靠性的基石。

http://www.lryc.cn/news/621353.html

相关文章:

  • NetLimiter:精准掌控网络流量,优化网络体验
  • vue3+leaflet案例:告警系统GIS一张图(附源码下载)
  • 新增和编辑共用弹窗模板
  • 深度解析 Vue 高阶技巧:提升工程化能力的实用方案
  • 机器人伴侣的智能升级:Deepoc具身智能模型如何重塑成人伴侣体验
  • AI驱动的智能爬虫架构与应用
  • C++中的链式操作原理与应用(三):专注于异步操作延的C++开源库 continuable
  • 开发避坑指南(26):Vue3 input输入框前置后 置元素解决方案
  • uniapp开发动态添加密码验证
  • 【力扣322】零钱兑换
  • C++ 排序指南
  • Kafka下载和安装
  • Ubuntu 22.04 远程桌面设置固定密码的方法
  • HQA-Attack: Toward High Quality Black-Box Hard-Label Adversarial Attack on Text
  • CoreShop商城框架开启多租户(3)
  • PyTorch 2025全解析:从基础到前沿,深度学习框架的技术演进与实战指南
  • ESP32入门开发·通用硬件定时器 (GPTimer)
  • C# 高并发处理方式
  • 算法题Day1
  • torchvision中数据集的使用与DataLoader 小土堆pytorch记录
  • # Vue 列表渲染详解
  • VLMs开发——基于Qwen2.5-VL 实现视觉语言模型在目标检测中的层级结构与实现方法
  • RxJava Android 创建操作符实战:从数据源到Observable
  • 中久数创——笔试题
  • PiscTrace基于YOLO追踪算法的物体速度检测系统详解
  • 2025.8.24复习总结
  • React.memo、useMemo 和 React.PureComponent的区别
  • 基于场景的无人驾驶叉车分类研究:应用场景与技术选型分析
  • springboot myabtis返回list对象集合,对象的一个属性为List对象
  • 飞算 JavaAI 真是 yyds