TCP三次握手与四次挥手详解:建立与断开连接的底层逻辑

embedded/2025/3/13 14:02:15/

在计算机网络中,TCP(传输控制协议)通过三次握手建立连接,通过四次挥手终止连接。这两个过程是确保数据可靠传输的核心机制,下面从原理、步骤和应用场景展开分析。


一、三次握手:建立连接的“默契确认”

1. ​第一次握手(SYN)​

客户端发送一个SYN(同步)报文,携带随机生成的初始序列号(如x=1234567),进入SYN_SENT状态,等待服务器确认。
作用:表明客户端请求建立连接,并同步序列号。

2. ​第二次握手(SYN-ACK)​

服务器收到SYN报文后,回复一个SYN-ACK报文,携带自己的初始序列号(如y=7654321)和确认号ack=x+1,进入SYN_RECV状态。
作用:确认收到客户端请求,并同步自身序列号。

3. ​第三次握手(ACK)​

客户端收到SYN-ACK报文后,发送ACK报文确认服务器的序列号(ack=y+1),进入ESTABLISHED状态。服务器收到ACK后也进入该状态,连接建立完成。
作用:确保双方序列号一致,防止旧连接干扰(如历史报文延迟到达)。


核心意义

  • 同步序列号:为后续数据传输提供顺序依据。
  • 验证可达性:三次交互确认双方通信正常。
  • 防止半开连接:避免无效请求占用资源。

二、四次挥手:优雅断连的“礼貌告别”

1. ​第一次挥手(FIN)​

主动关闭方(如客户端)发送FIN报文,表示数据发送完毕,进入FIN_WAIT_1状态。
注意:此时客户端仍可接收数据。

2. ​第二次挥手(ACK)​

被动方(服务器)收到FIN后,发送ACK确认(ack=u+1),进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。
作用:确认收到关闭请求,但允许被动方继续发送残留数据。

3. ​第三次挥手(FIN)​

被动方完成数据发送后,发送FIN报文,进入LAST_ACK状态。
注意:全双工特性要求双方独立关闭连接。

4. ​第四次挥手(ACK)​

主动方收到FIN后,发送ACK确认(ack=w+1),进入TIME_WAIT状态,等待2MSL(约4分钟)后关闭。被动方收到ACK后立即关闭。
作用:确保ACK可靠传输,避免旧连接报文干扰新连接。


核心意义

  • 全双工关闭:允许双方独立完成数据传输。
  • 防止数据丢失:TIME_WAIT状态确保延迟报文被丢弃。
  • 资源释放:彻底关闭连接,避免端口占用。

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

  • 三次握手:两次握手可能导致旧连接干扰(如延迟报文被误认为新请求),三次交互可避免此类问题。
  • 四次挥手:TCP是全双工协议,需分别关闭双向通道;若仅两次挥手,被动方可能仍有数据未发送。

四、总结

三次握手与四次挥手是TCP协议可靠性的基石:

  • 建立连接:通过序列号同步和状态确认,确保双方准备就绪。
  • 断开连接:通过全双工关闭和超时机制,避免资源泄漏和数据丢失。
    这两个过程虽然增加了通信开销,却为互联网数据传输提供了坚实的保障。

http://www.ppmy.cn/embedded/172258.html

相关文章

【Linux docker 容器】关于想要让虚拟机在开机时候也docker自己启动,容器也自己启动,省去要自己开docker和容器

确认 Docker 服务状态: 首先,你需要确保 Docker 服务已经在虚拟机上安装并正确配置。你可以使用如下命令来检查 Docker 服务的状态: systemctl status docker.service 如果服务没有运行,你可以使用以下命令启动它: s…

【MapSet】哈希表

目录 1. 搜索树 1.1 概念 1.2 操作-查找 1.3 操作-插入 1.4 操作-删除(难点) 1.5 性能分析 1.6 和java类集的关系 2. 搜索 2.1 概念及场景 2.2 模型 3. Map的使用 3.1 关于Map的说明 3.2 关于Map.Entry的说明 3.3 Map的常用方法说明 3.4 …

选择循环汇编

一、选择结构(if-else) 核心逻辑: 比较条件:用 CMP 指令 条件跳转:用 JE(等于跳转)、JNE(不等于跳转)、JG(大于跳转)等 代码块分割&#xff1a…

SVN 拉取,文件冲突 解决办法

情景 svn 在拉取代码时 提示 已跳过,其余有冲突 ,警告至少还有一个的文件处于冲突状态 导致文件拉取失败 一、原因 版本库和本地工作副本之间存在文件冲突,导致文件无法正常拉取。 二、 Terminal 窗口解决办法 1.查看冲突文件 在 Termin…

Excel之实践出真知——数据分析

Excel之实践出真知——数据分析 1. 引言2. 内容3. 社群4. 其他文章 1. 引言 学习Excel的过程也许会让你感到很枯燥,这一点我是深有体会的,为什么会这样呢,今天我们要探讨的问题就是这一个,我们开始吧。 学习,学了之后…

交通工具驱动电机技术解析:电瓶车、汽车、地铁与高铁的电机对比

点击下面图片,为您提供全新的嵌入式学习路线 文章目录 [TOC](文章目录)一、引言二、电瓶车:直流无刷电机(BLDC)三、电动汽车:永磁同步电机(PMSM)与感应电机1. 永磁同步电机(主流选…

面试之《commonjs,requirejs和es6 Module的区别》

设计理念 CommonJS:是为服务器端环境设计的模块化规范,以同步加载模块为核心思想。服务器端读取文件速度快,同步加载不会造成明显性能问题,方便开发者在代码执行前就确定模块间的依赖关系,便于管理和维护。RequireJS&…

docker搭建elk

文章目录 1.拉取镜像2.ES配置3.logstash配置4.kibana配置5.创建自定义网络6.docker-compose.yml文件7.springboot对接Logstash1.创建一个springboot项目引入主要依赖2.application.yml配置3.resources目录中新增logback-spring.xml4.启动项目,搞点日志5.进入kibana控…