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

三次握手四次挥手

文章目录

      • 三次握手与四次挥手详解
        • 一、三次握手(建立TCP连接)
        • 二、四次挥手(关闭TCP连接)
        • 总结

三次握手与四次挥手详解

在TCP/IP协议中,TCP(传输控制协议) 是一种面向连接、可靠的传输层协议。为了实现可靠通信,TCP在建立连接时需要“三次握手”,关闭连接时需要“四次挥手”。以下是详细说明:

一、三次握手(建立TCP连接)

三次握手的目的是同步通信双方的序列号和确认号,并交换TCP窗口大小等信息,最终建立可靠的连接。过程如下:

  1. 第一次握手(客户端 → 服务器)

    • 客户端主动发起连接,发送SYN报文(同步序列编号)。
    • 报文内容:SYN=1(表示这是一个连接请求),初始序列号seq=x(客户端随机生成的起始序号)。
    • 此时客户端状态:SYN_SENT(等待服务器确认)。
  2. 第二次握手(服务器 → 客户端)

    • 服务器收到SYN报文后,同意建立连接,发送SYN+ACK报文
    • 报文内容:SYN=1(服务器也发起同步),ACK=1(确认客户端的请求),确认号ack=x+1(表示已收到客户端的seq=x,下一次期望收到x+1),服务器初始序列号seq=y(服务器随机生成的起始序号)。
    • 此时服务器状态:SYN_RCVD(等待客户端确认)。
  3. 第三次握手(客户端 → 服务器)

    • 客户端收到SYN+ACK报文后,发送ACK报文确认。
    • 报文内容:ACK=1,确认号ack=y+1(表示已收到服务器的seq=y,下一次期望收到y+1),客户端序列号seq=x+1(基于第一次握手的x递增)。
    • 此时客户端状态:ESTABLISHED(连接建立)。
    • 服务器收到ACK报文后,状态也变为ESTABLISHED,双方开始传输数据。

为什么需要三次握手?

  • 核心是防止失效的连接请求报文被服务器接收,导致错误连接。例如:客户端发送的连接请求因网络延迟滞留,超时后客户端重新发送请求并建立连接;若滞留的请求随后到达服务器,服务器会误认为是新请求并回复,但客户端已忽略,此时服务器会一直等待客户端确认,造成资源浪费。
  • 三次握手通过客户端的最后一次确认,确保双方都明确“对方已准备好连接”,避免上述问题。
二、四次挥手(关闭TCP连接)

TCP连接是全双工的(双方可同时发送数据),关闭连接时需双方分别终止各自的发送通道,因此需要四次挥手。过程如下:

  1. 第一次挥手(主动关闭方 → 被动关闭方)

    • 假设客户端主动关闭连接,发送FIN报文(结束标志)。
    • 报文内容:FIN=1,序列号seq=u(客户端当前的序列号,基于之前传输的数据递增)。
    • 此时客户端状态:FIN_WAIT_1(等待对方确认)。
  2. 第二次挥手(被动关闭方 → 主动关闭方)

    • 服务器收到FIN报文后,发送ACK报文确认。
    • 报文内容:ACK=1,确认号ack=u+1(表示已收到客户端的关闭请求),服务器序列号seq=v(服务器当前的序列号)。
    • 此时服务器状态:CLOSE_WAIT(等待自身数据发送完毕),客户端状态:FIN_WAIT_2(等待服务器的关闭请求)。
    • 注意:此时服务器仍可向客户端发送数据,客户端需继续接收。
  3. 第三次挥手(被动关闭方 → 主动关闭方)

    • 服务器完成所有数据发送后,发送FIN报文,表示自己也准备关闭连接。
    • 报文内容:FIN=1ACK=1,序列号seq=w(服务器最后的序列号),确认号ack=u+1(重复确认,确保客户端知晓)。
    • 此时服务器状态:LAST_ACK(等待客户端确认)。
  4. 第四次挥手(主动关闭方 → 被动关闭方)

    • 客户端收到FIN报文后,发送ACK报文确认。
    • 报文内容:ACK=1,确认号ack=w+1(表示已收到服务器的关闭请求),客户端序列号seq=u+1
    • 此时客户端状态:TIME_WAIT(等待一段时间,确保服务器收到确认),服务器收到ACK后状态变为CLOSED
    • 客户端在TIME_WAIT(通常为2倍报文最大生存时间,约1-4分钟)后,状态变为CLOSED,连接彻底关闭。

为什么需要四次挥手?

  • 因TCP是全双工通信,双方需分别关闭各自的发送通道。服务器收到客户端的FIN后,可能还有未发送完的数据,因此先回复ACK确认“已收到关闭请求”,待数据发送完毕后,再发送FIN告知“我方也关闭”,因此需要四次交互。
  • TIME_WAIT的作用:防止最后一次ACK报文丢失(若服务器未收到ACK,会重发FIN,客户端可在TIME_WAIT内重传ACK);确保网络中滞留的报文已失效,避免新连接受到旧报文干扰。
总结
  • 三次握手:通过“请求-确认-再确认”建立可靠连接,同步双方序列号。
  • 四次挥手:因全双工特性,双方需分别关闭发送通道,通过四次交互完成,并通过TIME_WAIT保证连接彻底关闭。

这两个过程是TCP可靠性的核心保障,广泛应用于HTTP、FTP等依赖可靠传输的协议中。

http://www.dtcms.com/a/339587.html

相关文章:

  • 决策树算法详解
  • Orange的运维学习日记--47.Ansible进阶之异步处理
  • ESP32应用——HTTP client(ESP-IDF框架)
  • STM32之MCU和GPIO
  • AT_abc397_f [ABC397F] Variety Split Hard
  • 高速传输的关键:8B/10B编码学习记录
  • 应用控制技术与内容审计技术
  • 系统架构设计师-操作系统-避免死锁最小资源数原理模拟题
  • 寻找旋转排序数组中的最小值
  • 黄金本周想法
  • 给类或实例打上标识即类的元数据标签方便程序在运行时对其进行分类、识别、筛选
  • 32K上下文开源语音理解、40分钟深度交互——Voxtral-Small-24B-2507本地部署教程
  • GCC编译输出中text,data,bss和dec的含义
  • 构建自主企业:AgenticOps 的技术蓝图
  • 基于 STM32 单片机的远程老人监测系统设计
  • 科大讯飞语音服务之:BNF文件
  • 基于用户画像的个性化匹配模型
  • 【Proteus仿真】【51单片机】基于51单片机自动售货机12864屏幕
  • 这是关于Oracle碎片的文章
  • 空间智能赋能低空经济建设
  • 录音转文字:怎么快速精转提取重点?
  • 【弦乐教程】四 / 五部和声铺底写作指南 —— 从声部配置到禁忌规避
  • 8.19笔记
  • 训练数据转 LMDB 格式:必要性解析与核心优势全指南
  • 假设检验的原理
  • PDR与RSSI融合定位入门:从原理到实践
  • 如何用Prometheus和FastAPI打造任务监控的“火眼金睛”?
  • WSL虚拟机(我的是ubuntu20.04)将系统文件转移到E盘
  • 前端面试核心技术30问
  • 35岁对工作的一些感悟