小汪,TCP连接和断连夺命6连问你可能扛得住?

扫码关注 有惊喜

目录

TCP三次握手连接和四次挥手断连的几处疑问

一、建立连接,为什么是三次握手,而不是二次握手?

二、为什么每次建立 TCP 连接时,初始化的序列号都要求不一样呢?

三、断开连接,为什么是四次握手,而不是三次握手?

四、为什么TIME_WAIT等待的时间是2MSL?

五、为什么需要 TIME_WAIT 状态?

六、为什么需要 TIME_WAIT 状态?

Reference


TCP三次握手连接和四次挥手断连的几处疑问

一、建立连接,为什么是三次握手,而不是二次握手?

  1. 防止资源浪费 + 防止历史连接的建立。

考虑一种不正常的情况,客户端发了两次请求链接的报文,第二条被服务器捕捉到,返回数据,完成了两次握手。数据传送完成之后,链接关闭。但是这时候,第一条拥塞的请求报文现在到达了服务器端,服务器还以为客户端要又一次建立连接,于是发送确认,然后把自己敞开,等着客户端发送过来数据。于是,很多的网络资源就是这样浪费掉了. 如果实行三次握手,服务器收到了一条过期的请求报文,返回确认信息,客户端接收到了服务器的信息之后感到莫名其妙,心想:我他妈又没要连接,你返回这个是不是疯了。于是忽略。服务器过一段时间还没有收到第三次握手的数据,知道客户端并没有要求建立链接的请求,含泪离开。

  1. 同步双方初始序列号

TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素,它的作用:

  • 接收方可以去除重复的数据;

  • 接收方可以根据数据包的序列号按序接收;

  • 可以标识发送出去的数据包中, 哪些是已经被对方收到的(通过 ACK 报文中的序列号知道); 可见,序列号在 TCP 连接中占据着非常重要的作用,所以当客户端发送携带「初始序列号」的 SYN 报文的时候,需要服务端回一个 ACK 应答报文,表示客户端的 SYN 报文已被服务端成功接收,那当服务端发送「初始序列号」给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。

二、为什么每次建立 TCP 连接时,初始化的序列号都要求不一样呢?

主要原因有两个方面:

  • 为了防止历史报文被下一个相同四元组的连接接收(主要考虑)

  • 为了安全性,防止黑客伪造的相同序列号的 TCP 报文被对方接收

三、断开连接,为什么是四次握手,而不是三次握手?

TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。TCP是全双工模式:

  • 这就意味着,关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了,但是客户端还能接收服务端的数据。

  • 服务端收到客户端的 FIN 报文时,先回一个 ACK 应答报文,但此时服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

  • 从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN 一般都会分开发送,因此是需要四次挥手。

简单地说,前 2 次挥手用于关闭一个方向的数据通道,后两次挥手用于关闭另外一个方向的数据通道。

注意:在特定情况下,四次挥手是可以变成三次挥手的

四、为什么TIME_WAIT等待的时间是2MSL?

  1. MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

  2. TIME_WAIT 等待 2 倍的 MSL,因为网络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间。

  3. 2MSL时长 这其实是相当于至少允许报文丢失一次。

五、为什么需要 TIME_WAIT 状态?

主动发起关闭连接的一方,才会有 TIME-WAIT 状态。

需要 TIME-WAIT 状态,主要是两个原因:

防止历史连接中的数据,被后面相同四元组的连接错误的接收; 保证「被动关闭连接」的一方,能被正确的关闭;

  • 原因一:防止历史连接中的数据,被后面相同四元组的连接错误的接收

为了防止历史连接中的数据,被后面相同四元组的连接错误的接收,因此 TCP 设计了 TIME_WAIT 状态,状态会持续 2MSL 时长,这个时间足以让两个方向上的数据包都被丢弃,使得原来连接的数据包在网络中都自然消失,再出现的数据包一定都是新建立连接所产生的。

  • 原因二:保证「被动关闭连接」的一方,能被正确的关闭

也就是说,TIME-WAIT 作用是等待足够的时间以确保最后的 ACK 能让被动关闭方接收,从而帮助其正常关闭。

六、为什么需要 TIME_WAIT 状态?

过多的 TIME-WAIT 状态主要的危害有两种:

  • 第一是占用系统资源,比如文件描述符、内存资源、CPU 资源、线程资源等;

  • 第二是占用端口资源,端口资源也是有限的,一般可以开启的端口为 32768~61000,也可以通过 net.ipv4.ip_local_port_range参数指定范围。

Reference

  1. https://zhuanlan.zhihu.com/p/493915289

  2. https://zhuanlan.zhihu.com/p/591865232

  3. https://developer.aliyun.com/article/556694

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/614635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习激活函数

激活函数 激活函数是人工神经网络中的一个重要组成部分。它们用于向神经网络中添加非线性因素,使得网络能够解决复杂问题,如图像识别、语言处理等。激活函数的作用是决定一个神经元是否应该被激活,也就是说,它帮助决定神经元的输…

科技顶天,市场立地 。璞华科技“顶天立地”的成长之路

科技顶天,市场立地。 几十年来,我们越来越深刻地认识到,这就是真理,质朴而深刻。尤其在当前特殊的国际国内商业环境中,这一理念不但没有过时,反而恰逢其时。有这么一家企业,一直践行“科技顶天…

使用阿里云镜像创建一个Spring Boot项目

由于现在的idea在创建项目时已经不支持Java8版本了,如果我们还想用8版本,可以使用阿里云镜像创建。所以得改变原有的地址为:https://start.aliyun.com springboot版本选择2开头的任意版本的。 1.配置6个依赖 2.改变下载依赖地址 下载依赖默认…

Proteus仿真stm32f103r6输出PWM/正弦波

资料下载地址:Proteus仿真stm32f103r6输出PWM/正弦波 一、仿真图 Proteus仿真stm32f103r6输出PWM/正弦波 二、程序 #include "pbdata.h"u16 fre; void RCC_Configuration(void); void GPIO_Configuration(void); void TIM3_Configuration();void Dela…

动物脚掌“温度升降”体验:ZL-021大小鼠冷热板测痛仪

ZL-021大小鼠冷热板测痛仪用于评估动物对疼痛的敏感度。通过将小鼠或大鼠放置在温度可调的热板上,记录它们在板上停留的时间来评估它们对不同温度刺激的反应。 优点说明:设备能够明确指示组织损伤情况,同时对动物影响较小,可以反…

学生评教,问卷调查表评价教师统计,python+pandas处理数据

先上一个结果表格 几个关键步骤 1、问卷网站上设置相关题目,条目,最好用评分题目(点击文本选项,但是保存下来的是分值),如图 2、pandas清洗数据,包括unstack,其目的是把所有学生得…

快速了解VR全景拍摄技术运用在旅游景区的优势

豆腐脑加了糖、烤红薯加了勺,就连索菲亚大教堂前都有了“人造月亮”,在这个冬季,“尔滨”把各地游客宠上了天。面对更多的游客无法实地游玩,哈尔滨冰雪世界再添新玩法,借助VR全景拍摄技术对冬季经典冰雪体验项目进行全…

什么是Modbus协议?

Modbus协议是一种在工业自动化领域广泛应用的通信协议,它允许不同设备之间进行可靠的数据交换和控制。该协议最初由Modicon公司于1979年创建,旨在提供一种简单而有效的方法,使PLC(可编程逻辑控制器)和其他自动化设备能…

AI老照片修复-Bringing-Old-Photos-Back-to-Life

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. AI老照片修复原理-…

修改idea或者pycharm或者android studio的快捷键,快速跳转到行尾

ctrl enter这个快捷键是idea默认配置的,就是将光标所在的行切一刀,并且换到下一行。但是在我的开发习惯里面不怎么使用ctrl enter这个快捷键, 反而开发java或者flutter软件需要快速跳转到行尾添加分号 ; ,但是使用end键脱离了我…

ARM 寄存器

文章目录 ARM 寄存器介绍一、未分组寄存器 R0~R7二、分组寄存器 R8~R14三、程序计数寄存器 R15(PC)四、当前程序状态寄存器 R16(CPSR)管理模式(SVC)用户模式(USR) 汇编里的寄存器名称…

YOLOv8-Seg改进:轻量化改进 | MobileNetV3,轻量级骨架首选

🚀🚀🚀本文改进:MobileNetV3的创新点包括:使用自适应瓶颈宽度、借鉴SENet中的Squeeze-and-Excitation机制、引入h-swish激活函数等。 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教…

JVM 元空间、java中的元空间

JVM 元空间 元空间 元空间 原空间(Meta Space) ​ 用于存放类信息、常量、静态变量、JIT即时编译器百年以后的机器代码等数据等。例如:java.lang.Object类的元信息、Integer.MAX_VALUE等常量。 JDK1.6 HotSpot JVM 使用Method Area方法区存…

植物大战僵尸-C语言搭建童年游戏(easyx)

游戏索引 游戏名称&#xff1a;植物大战僵尸 游戏介绍&#xff1a; 本游戏是在B站博主<程序员Rock>的视频指导下完成 想学的更详细的小伙伴可以移步到<程序员Rock>视频 语言项目&#xff1a;完整版植物大战僵尸&#xff01;可能是B站最好的植物大战僵尸教程了&…

Jenkins基础篇--凭据(Credential)管理

什么是凭据 Jenkins的Credentials直译为证书、文凭&#xff0c;我们可以理解为它是钥匙&#xff0c;用来做某些事情的认证。 如Jenkins 和 GitLab交互时&#xff0c;需要添加GitLab的API令牌和登录凭证。 如Jenkins 添加从节点时&#xff0c;需要添加从节点的登录凭证或者Je…

Jenkins基础篇--添加用户和用户权限设置

添加用户 点击系统管理&#xff0c;点击管理用户&#xff0c;然后点击创建用户&#xff08;Create User&#xff09; 用户权限管理 点击系统管理&#xff0c;点击全局安全配置&#xff0c;找到授权策略&#xff0c;选择安全矩阵&#xff0c;配置好用户权限后&#xff0c;点击…

Redis内存分析工具

Redis内存分析工具RDR 了解一下RDR的优势 1&#xff0c;首先RDR工具是图形化界面&#xff0c;能非常直观的就能看到内存主键分布 2&#xff0c;可以快速分析 Redis 内存中那个 Key 值占用的内存最大 启动 ./rdr-linux show -p 8080 /usr/local/redis-5.0.3/data/dump.rdb st…

线索系统性能优化实践

引言 在京东家居事业部&#xff0c;线索CRM系统扮演着至关重要的角色&#xff0c;它作为构建家居场景核心解决方案集的首要环节&#xff0c;肩负着获客和拓展业务的重要使命。然而&#xff0c;随着业务的不断扩张和市场需求的日益增长&#xff0c;系统原有的架构开始显露出诸多…

使用图形化界面工具DataGrip

目录 添加数据源 展示所有数据库 创建数据库 创建表 修改表结构 在DataGrip中执行SQL语句 &#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&am…

构建基于RHEL9系列(CentOS9,AlmaLinux9,RockyLinux9等)的Nginx1.24.0的RPM包

本文适用&#xff1a;rhel9系列&#xff0c;或同类系统(CentOS9,AlmaLinux9,RockyLinux9等) 文档形成时期&#xff1a;2023年 因系统版本不同&#xff0c;构建部署应略有差异&#xff0c;但本文未做细分&#xff0c;对稍有经验者应不存在明显障碍。 因软件世界之复杂和个人能力…