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

【TCP】三次握手 与 四次挥手 详解

三次握手 与 四次挥手

  • 1. 三次握手
  • 2. 四次挥手
  • 三次握手和四次挥手的区别

在正常情况下,TCP 要经过三次握手建立连接,四次挥手断开连接

在这里插入图片描述

1. 三次握手

在这里插入图片描述

服务端状态转化:

  • [CLOSED -> LISTEN]
    服务器端调用 listen 后进入 LISTEN 状态,等待客户端连接;
  • [LISTEN -> SYN_RCVD]
    一旦监听到连接请求(同步报文段 SYN),就将该连接放入内核等待队列中,并向客户端发送 SYN + ACK 确认报文。
  • [SYN_RCVD -> ESTABLISHED]
    服务端一旦收到客户端的确认报文 ACK,就进入 ESTABLISHED 状态,可以进行读写数据了。

客户端状态转化:

  • [CLOSED -> SYN_SENT]
    客户端调用 connect,发送同步报文段 SYN;
  • [SYN_SENT -> ESTABLISHED]
    connect 调用成功,收到服务器的 SYN + ACK 报文段则进入 ESTABLISHED 状态,开始读写数据;

三次握手有啥用 ? 和可靠性有什么关系 ?

  1. 三次握手相当于 “投石问路”, 检查一下当前这个网络的情况是否满足可靠传输的条件。
    如果网络本身效果比较差,强行进行 TCP 传输,也会涉及到大量的数据丢包,更具体的说,三次握手是在检测通信双方的发送能力和接收能力是否都正常。
  2. 让通信双方能协商一些必要的信息,TCP 通信过程中,需要客户端和服务器之间有一些共同的信息,在三次握手过程中相互之间可以交互一些必要的内容。

举个栗子:
以打电话为例, 这个过程就是在检验通信双方的发送能力和接收能力:

在这里插入图片描述

假如说小明麦克风坏了,喂了几次没回应,就会重传,重试几次还没回应就放弃。

为啥是三次握手,两次行不行? 四次行不行 ?

  • 四次?行,但是没必要,分开传输不如合在一起效率高。
  • 两次 ?不行!两次,意味着缺少最后一次
  • 由上面的两张图就可以知道,两次的话,此时客户端知道双方的发送和接收能力都是正常的
  • 但是服务器这边是残缺的,不知道自己的发送能力和客户端的接收能力是否 OK
  • 此时服务器对于当下能否满足可靠传输心里没底
  • 这第三次交互就是为了给服务器吃一个定心丸。

2. 四次挥手

在这里插入图片描述

服务端状态转化:

  • [ESTABLISHED -> CLOSE_WAIT]
    当客户端主动关闭连接(调用 close),服务器会收到结束报文段 FIN ,服务器返回确认报文段 ACK 并进入 CLOSE_WAIT;
  • [CLOSE_WAIT -> LAST_ACK]
    进入 CLOSE_WAIT 后说明服务器准备关闭连接(需要处理完之前的数据);当服务器真正调用 close (用户代码中执行了 socket.close) 关闭连接时,会向客户端发送 FIN,此时服务器进入 LAST_ACK 状态,等待最后一个 ACK 到来(这个 ACK 是客户端确认收到了 FIN )
  • [LAST_ACK -> CLOSED]
    服务器收到了对 FIN 的 ACK,彻底关闭连接。

客户端状态转化:

  • [ESTABLISHED -> FIN_WAIT_1]
    客户端主动调用 close 时,向服务器发送结束报文段,同时进入 FIN_WAIT_1;
  • [FIN_WAIT_1 -> FIN_WAIT_2]
    客户端收到服务器对结束报文段的确认 ACK,则进入 FIN_WAIT_2,开始等待服务器的结束报文段;
  • [FIN_WAIT_2 -> TIME_WAIT]
    客户端收到服务器发来的结束报文段 FIN,进入 TIME_WAIT,并发出 LAST_ACK;
  • [TIME_WAIT -> CLOSED]
    客户端要等待一个 2MSL(Max Segment Life,报文最大生存时间)的时间,才会进入 CLOSED 状态。

为什么还要 TIME_WAIT ?
为的是给最后一次 ACK 提供重传机会,表面上 A 发送完 ACK 后就没有 A 的事了,按理说 A 可以销毁连接了,但是怕最后一个 ACK 丢包,若最后一个 ACK 丢了,那么 B 一定会因为没收到 ACK 重传 FIN,如果 A 已经销毁连接了,那么就无人能够处理这个 FIN 了,因此 A 不应该释放的太早,要等待一段时间,确保 B 不会重传 FIN 后再真正的销毁连接。

为什么是TIME_WAIT的时间是2MSL?

MSL 是 TCP 报文的最大生存时间,因此 TIME_WAIT 持续存在 2MSL 的话

  • 就能保证在两个传输方向上的尚未被接收或迟到的报文段都已经消失
    (否则立刻客户端立即重新创建连接时,可能会收到来自上一个进程的迟到的数据(FIN),但是这种数据很可能是错误的);
    在这里插入图片描述

  • 同时也是在理论上保证最后一个报文可靠到达
    (假设最后一个ACK丢失,那么服务器会再重发一个FIN。这时虽然客户端的进程不在了,但是 TCP 连接还在,仍然可以重发 LAST_ACK );

在这里插入图片描述

CLOSE_WAIT
一般而言,对于服务器上出现大量的 CLOSE_WAIT 状态,原因就是服务器没有正确的关闭 socket,没有执行到 socket.close 导致四次挥手没有正确完成。这是一个 BUG。只需要加上对应的 close 即可解决问题。

三次握手和四次挥手的区别

  1. 三次握手一定是客户端发起的(主动发起请求的一方叫做客户端)
    四次握手可能是客户端发起的,也有可能是服务器主动发起的

  2. 三次握手,中间有两次合并和,
    四次握手,中间两次合并不了,不能合并的原因在于 B (被动接收 FIN 的那一方)发送 ACK 和 FIN 的时机不同,
    <1> 四次挥手中,B 发送给 A 的 ACK 是由操作系统内核负责的(除了应用层,TCP/IP … 本身就是属于操作系统层面),那么意味着,当内核收到 FIN 后会立即返回 ACK (我们是感知不到的)
    <2> B 发送给 A 的 FIN,是由用户代码负责的,B 中代码调用了 socket.close() 方法时才触发 FIN 发送,所以要等到用户代码执行到 socket.close() 方法才触发,但是什么时候发送 取决于用户代码,若 <1> <2> 操作之间的时间差较大,就不能合并了,若时间差较小,由于 延时应带和捎带应答 机制,可能会合并。
    而三次握手中 B 发送的 ACK 和 SYN 都是由内核负责的,是同一时机所以能够合并。
    在这里插入图片描述

好啦! 以上就是对 TCP 三次握手 与 四次挥手的讲解,希望能帮到你 !
评论区欢迎指正 !

相关文章:

【TCP】三次握手 与 四次挥手 详解

三次握手 与 四次挥手 1. 三次握手2. 四次挥手三次握手和四次挥手的区别 在正常情况下&#xff0c;TCP 要经过三次握手建立连接&#xff0c;四次挥手断开连接 1. 三次握手 服务端状态转化&#xff1a; [CLOSED -> LISTEN] 服务器端调用 listen 后进入 LISTEN 状态&#xff…...

正则表达式新解

文章目录 是什么&#xff1f;正则用法匹配单个字符匹配一组字符其他元字符核心函数 贪婪匹配和非贪婪匹配正则练习 是什么&#xff1f; 正则表达式(Regular Expression)是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊…...

MissionPlanner编译过程

环境 windows 10 mission planner 1.3.80 visual studio 2022 git 2.22.0 下载源码 (已配置git和ssh) 从github上克隆源码 git clone gitgithub.com:ArduPilot/MissionPlanner.git进入根目录 cd MissionPlanner在根目录下的ExtLibs文件下是链接的其它github源码&#xff0…...

SpringBoot 员工管理---通用模板 ---苍穹外卖day2

感谢点击 希望你有所收获! 目录 1.新增员工 需求分析:根据页面原型进行业务分析 接口设计 数据库设计 代码开发 功能测试 如何在接口文档中统一添加JWT令牌 ​ 获取当前登录员工的ID 2.员工分页查询 需求分析 代码开发 如何将日期格式化 ​3.启用禁用员工 1.新…...

可信执行环境(Tee)入门综述

SoK: Hardware-supported Trusted Execution Environments [ArXiv22] 摘要引言贡献 范围系统和威胁模型系统模型威胁模型共存飞地对手无特权软件对手系统软件对手启动对手外围对手结构对手侵入性对手 关于侧信道攻击的一点注记 VERIFIABLE LAUNCH信任根&#xff08;RTM&#xf…...

Java浮点运算为什么不精确

有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是 Java 浮点运算? 在 Java 中&#xff0c;浮点运算指的是对浮点数进行加减乘除等基本运算…...

linux使用操作[1]

文章目录 版权声明快捷键ctrl c 强制停止ctrl d 退出、登出history命令光标移动快捷键清屏快捷键 软件安装命令常见linux系统包管理器yum命令apt命令 systemctl命令软连接日期&时区修改linux时区ntp程序 IP地址&主机名ip&主机名域名解析win配置主机名映射虚拟机…...

权限提升Linux篇

提权工具 https://github.com/liamg/traitor https://github.com/AlessandroZ/BeRoot https://github.com/rebootuser/LinEnum https://github.com/mzet-/linux-exploit-suggester https://github.com/sleventyeleven/linuxprivchecker https://github.com/jondonas/linux…...

影刀自动化采集底层逻辑

hello,大家好&#xff0c;这里是【玩数据的诡途】 接上回 <我的影刀故事> 今天给大家介绍一下整个采集的底层逻辑&#xff0c;包括业务流程自动化也是基于这一套基础逻辑进行展开的&#xff0c;顺便带大家熟悉一下影刀&#xff0c;既然叫影刀系列了&#xff0c;那后续一些…...

swiper使用

介绍 Swiper&#xff08;swiper master&#xff09;是一个第三方的库&#xff0c;可以用来实现移动端、pc端的滑动操作。&#xff0c;swiper应用广泛&#xff0c;使用频率仅次于jquery, 轮播图类排名第一&#xff0c;是网页设计师必备技能&#xff0c;众多耳熟能详的品牌在使用…...

基于遗传算法解决的多仓库多旅行推销员问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

微信小程序 工具使用(HBuilderX)

微信小程序 工具使用:HBuilderX 一 HBuilderX 的下载二 工具的配置2.1 工具 --> 设置 --> 运行配置2.1.1 微信开发者工具路径2.1.2 node 运行配置 2.2 插件 工具 --> 插件安装2.2.1 下载插件 三 微信小程序端四 同步运行五 BUG5.1 nodemon在终端无法识别 一 HBuilderX…...

设计模式:观察者模式(C++实现)

观察者模式&#xff08;Observer Pattern&#xff09;是一种设计模式&#xff0c;用于定义对象之间的一对多依赖关系&#xff0c;当一个对象&#xff08;称为主题或可观察者&#xff09;的状态发生变化时&#xff0c;它的所有依赖对象&#xff08;称为观察者&#xff09;都会收…...

【前端打怪升级日志之微前端框架篇】微前端qiankun框架子应用间跳转方法

参考链接qiankun官网&#xff1a;微应用之间如何跳转&#xff1f; 1.主应用、子应用路由都是hash模式 主应用根据 hash 来判断微应用&#xff0c;无需考虑该问题 2.主应用根据path判断子应用 方法实现适用条件参数传递存在问题a标签跳转<a href"/toA"></…...

C语言中的typedef struct用法

在学习数据结构的时候&#xff0c;我经常遇到typedef struct&#xff0c;刚开始感觉很别扭&#xff0c;查阅资料之后才真真理解了。 先从结构体说起。 1、结构体用法 struct Student{int age;char s;}如果要定义一个该结构体变量&#xff0c;就需要:struct Student st1; 有没…...

司徒理财:9.27黄金原油日内多空走势行情操作建议

黄金走势分析&#xff1a;      黄金昨日抵达了此前一直强调的日线布林下轨的1903位置&#xff0c;甚至更低&#xff01;昨天的空单也是直接获利收割了&#xff01;现在如果是要继续做空&#xff0c;下方是有日线支撑的&#xff0c;甚至周线的支撑也不远&#xff0c;在1890…...

C++设计模式(Design Patterns)

设计模式主要原则 单一职责原则&#xff08;Single Responsibility Principle&#xff09; 实现类要职责单一 里氏替换原则&#xff08;Liskov Substitution Principle&#xff09; 不要破坏继承关系 依赖倒置原则&#xff08;Dependence Inversion Principle&#xff09; …...

vue点击按钮收缩菜单

问题描述 VUE菜单有一个BUG&#xff0c;当我们点击其它按钮或者首页的时候&#xff0c;已经展示的一级菜单是不会自动收缩的。这个问题也导致很多开发者把一级菜单都换成了二级菜单。 错误展示 错误的效果请看下图。 解决方法 1、寻找菜单文件 因为我使用的是ruoyi的前端框…...

Vue 防止忘记的命令

创建新项目 npm init vuelatest cd <项目名> npm install npm run dev 运行项目 yarn yarn serve 这里如果我用npm install 或者npm run serve会报错&#xff0c;但是新建项目用npm就不会&#xff0c;有大佬知道为什么吗...

APACHE NIFI学习之—RouteOnContent

RouteOnContent 描述: 通过正则表达式匹配输入数据流的内容,然后将输入数据流的副本路由到正则表达式相匹配的输出数据流。 正则表达式作为用户自定义的属性添加,并以该属性名称为输出连线,其值为正则表达式所匹配数据流内容。 当用户定义的属性支持属性表达式语言时,其结…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...