【网络】传输层协议TCP(中)

news2024/11/7 5:37:49

目录

四次挥手状态变化

流量控制

PSH标记位

URG标记位


四次挥手状态变化

之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手,下面是四次挥手的状态变化

那么我们下面可以来验证一下CLOSE_WAIT这个状态,这个状态出现的条件是后调用close的一方(比如服务器)调用close之前(调用完close就进入last_ack),我们可以很容易模拟出来,直接比如让客户端先调用close,不让服务器端调用close即可,这样就可以看到这个状态

用指令netstat -natp,a表示all

这就证明一件事情,如果我们发现服务器上有大量close_wait状态的时候,这就意味着大概率我们写的服务器有BUG,主要是没有close fd

我们把服务器进程关掉就看不到这个状态了,因为进程结束会把所有文件描述符释放掉

我们可以看到图中有一个time_wait的状态,对这个就是等待一段时间,这个状态实际上是先调用close的一方收到对方的close并给应答后处于的一种状态,这个状态通常持续的时间是分钟级别的,所以我们也可以较容易的看到

这样虽然服务器进程已经关闭,但是这里的端口仍然是被占用的,这也就是为什么立即启动服务器会bind err

所以我们的处理方法就是设置地址复用

那么等待的时间是多少呢?

TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待两个MSL的时间才能回到CLOSED状态

MSL是 Maximum Segment Lifetime(报文在网络中最大存活时间),我们可以看Linux中它是多长

也就是一分钟,所以TIME_WAIT的时间就是两分钟

下面解释一下为什么会等待这么长的时间

1.因为有可能我关闭了服务器后立马又绑定相同的IP和端口,这是其实是发给上一次连接的数据由于阻塞在了网络中一段时间,现在发到了服务器,这样旧报文就会影响新连接

2.或者说,四次挥手的最后一次ACK可能会丢,如果等待了2个MSL,对方没收到ACK就会超时重传,这是处于TIME_WAIT的我们就可以重新发ACK。总之,就是又重传的机会,保证让对方也关闭连接。

流量控制

有下面这样一种场景,如果A给B发消息非常快,导致B的缓冲区被打满了,那么新来的数据就会被丢弃,尽管TCP有超时重传机制,但是这样其实是不合理的,因为发送的数据被丢掉就会白白占用网络资源;不仅如此如果A发送的过于慢,这也会导致效率低下。

这上面的问题就和我们要说的流量控制有关,B可以通过应答ACK报文通告给A自己缓冲区剩余空间的大小,那么A就可以选择加快或减慢发送的速度

这里就是B就是通过报头中的16位窗口大小将自己缓冲区的大小通告给A的

那如果B的缓冲区满了,A和B就不进行数据交互了,那么A是如何知道B什么时候有空间呢?

A会向B发送窗口探测,B会向A发送窗口更新通知,这两种机制是会同时存在的。

PSH标记位

那如果B一直没空间,A就会给B发的报头中把PSH标记位 置一(当然PSH标记位的应用场景不只是会这么极端),就是让B尽快向上交付,当然取走缓冲区中的数据取决于应用层,这里的意思是应用层调用read的时候不要阻塞,即使要读走的内容很少,也要尽量读走

URG标记位

这个标记位 置一是指16位紧急指针有效,16位紧急指针中存着紧急数据在报文数据中的偏移量(广义的指针就是指能找到想要的数据即可),这个紧急数据一般是一个字节,通常是上层应用层规定好的。

这个大概的应用场景是:比如客户端要给服务器上传数据,上传到一半不想上传了,但是此时服务器TCP缓冲区中还有很多数据,这些数据其实都不想上传了,有了紧急指针就可以不按序到达,TCP协议可以让上层先把带有紧急指针的报文读上去,这样就可以停止上传了

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

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

相关文章

11款PDF阅读器深度体验分享!你选哪一款?

不管是哪个行业还是哪个职位,每天处理的文件中,PDF格式的文档占据了相当大的比例。为了提高工作效率,我尝试了市面上几款流行的PDF阅读器,下面来和大家分享我用过的11款PDF阅读软件怎么样吧。 一、福昕PDF编辑器 直达通道&#…

Gradle篇(入门到精通)

目录 一、前言 1. 项目构建历史 1.1. 传统方式 1.2. 构建工具 1.3. Gradle 2. 初始 groovy 2.1. 什么是 Groovy 2.2. Groovy 安装环境 2.3. groovy 与 Java 对比 3. groovy 特性 3.1. 基础语法 3.2. 闭包 二、gradle 实战 1. Gradle 环境搭建 1.1. 安装 gradle …

8.FreeRTOS之软件定时器

什么是定时器? 简单可以理解为闹钟,到达指定一段时间后,就会响铃。 STM32 芯片自带硬件定时器,精度较高,达到定时时间后会触发中断,也可以生成 PWM 、输入 捕获、输出比较,等等,功…

MySQL 9从入门到性能优化-系统信息函数

【图书推荐】《MySQL 9从入门到性能优化(视频教学版)》-CSDN博客 《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

人脸识别算法 - 专利1分析

专利CN117576758A中说明了一种人脸识别算法的整体识别流程,本文将对这篇文章进行详细讲解,并说明有创造性的算法部分。 前置知识:人脸识别 人脸识别技术是一种通过计算机技术和模式识别算法来识别和验证人脸的技术。它能够用于识别人脸的身份…

Linux之nfs服务器和dns服务器

NFS服务器 NFS(Network File System,网络文件系统),NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统 中看来,那个远程主机的目录就好像是自己的一个磁盘分区一样。 注&am…

第十八章 用于大型程序的工具

18.1 异常处理 异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行通信并做出相应的处理。异常使得问题的检测与解决过程分离开来。 18.1.1 抛出异常 当执行一个throw时,跟在throw后面的语句将不再被执行。相反,程序的控制权从throw转…

红米K80入网,骁龙8至尊版加持主打极致性价比

小米年度旗舰小米 15、15Pro 已经于本周二正式发布,不过 4499 元与 5299 元起售价想必劝退了不少追求极致性价比的小伙伴儿。 于是有同学表示:接下来人民的希望就全看旗舰捍门员红米了。 好消息是,目前新款红米 K80 系已获入网许可&#xff0…

ARM base instruction -- bfi

Bitfield Insert copies a bitfield of <width> bits from the least significant bits of the source register to bit position <lsb> of the destination register, leaving the other destination bits unchanged. 位域插入将<width>位的位域从源寄存器的…

uicc.hci.service的理解

一、uicc.hci.framework的java类 (1) HCIDevice i : getHCIservice 判断获取的service能否实现&#xff0c;若可以则调用并实现serviceimp&#xff0c;并记录appid。 ii : isHCIServiceAvaliable 用于获取service可用性的信息&#xff0c;返回0代表可用。 二、uicc.hci.servic…

更安全高效的文件传输工具,Ftrans国产FTP替代方案可以了解

文件传输协议&#xff08;FTP&#xff09;&#xff0c;诞生于1971年&#xff0c;自20世纪70年代发明以来&#xff0c;FTP已成为传输大文件的不二之选。内置有操作系统的 FTP 可提供一个相对简便、看似免费的文件交换方法&#xff0c;因此得到广泛使用。 随着企业发展过程中新增…

在元神操作系统启动时自动执行任务脚本

1. 背景 本文主要介绍让元神操作系统启动时自动执行任务脚本的方法&#xff0c;适用于无人化任务执行目的。将任务脚本及相关的应用程序准备好之后&#xff0c;把装有元神操作系统的U盘插入目标电脑&#xff0c;然后打开电脑电源就会自动完成所设置的任务。 2. 方法 &#x…

优雅的LUA数据记录方法-serpent序列化+LUA Table

目录 简述如何集成&#xff1f;如何使用序列化 反序列化 参考 简述 项目里需要使用LUA脚本将数据记录到文件&#xff0c;要方便的增加、查找、删除&#xff0c;要方便的加载与存回。 使用序列化/反序列化 lua table可以很容易实现这些功能。 序列化将table转换为字符串 反序列…

jmeter脚本-请求体设置变量and请求体太长的处理

目录 1、查询接口 1.1 准备组织列表的TXT文件&#xff0c;如下&#xff1a; 1.2 添加 CSV数据文件设置 &#xff0c;如下&#xff1a; 1.3 接口请求体设置变量&#xff0c;如下&#xff1a; 2、创建接口 2.1 见1.1 2.2 见1.2 2.3 准备创建接口的请求体TXT文件&#xff…

Sonatype Nexus 部署手册

文章目录 一、前言二、软件环境2.1 版本变更&#xff1a;2.1.1 变更存储的原因2.2.2 H2作为存储的注意点 三、资源配置四、开始部署4.1 部署jdk174.2 离线部署nexus4.2.1 下载4.2.2 部署1. 上传到服务器2. 解压3. 添加用户4. 修改启动参数5. 迁移sonatype-work &#xff0c;并授…

servlet开发

一、Servelet &#xff08;一&#xff09;Servelet概述 1.概念&#xff1a;Severlet是一门动态web资源开发技术。 2.本质&#xff1a;Severlet本质是一段Java程序&#xff0c;但和Java程序不同的是&#xff0c;Severlet程序无法独立运行&#xff0c;需要放服务器中&#xff…

opencv - py_imgproc - py_houghlines and py_houghcircles 霍夫线和圆变换

文章目录 1.霍夫线变换目标理论 OpenCV 中的霍夫变换概率霍夫变换其他资源 2.霍夫圆变换目标理论 1.霍夫线变换 目标 在本章中&#xff0c; 我们将了解霍夫变换的概念。我们将了解如何使用它来检测图像中的线条。我们将看到以下函数&#xff1a;cv.HoughLines()、cv.HoughLi…

数据结构 ——— 用堆解决TOP-K问题

目录 何为TOP-K问题 用堆解决TOP-K问题 代码实现 何为TOP-K问题 比如&#xff1a;整个专业的前10名&#xff0c;世界500强&#xff0c;富豪榜&#xff0c;游戏中前100的活跃玩家等 对于 TOP-K 问题&#xff0c;能想到的最简单直接的方式就是排序 但是&#xff0c;如果数据…

开发之翼:划时代的原生鸿蒙应用市场开发者服务

前言 随着"纯血鸿蒙" HarmonyOS NEXT在原生鸿蒙之夜的正式发布&#xff0c;鸿蒙生态正以前所未有的速度蓬勃发展。据知已有超过15000个鸿蒙原生应用和元服务上架&#xff0c;覆盖18个行业&#xff0c;通用办公应用覆盖全国3800万多家企业。原生鸿蒙操作系统降低了接…

WAF+AI结合,雷池社区版的强大防守能力

网上攻击无处不不在&#xff0c;为了保护我自己的网站&#xff0c;搜索安装了一个开源免费的WAF 刚安装完成就收到了海外的攻击&#xff0c;看到是海外的自动化攻击工具做的 雷池刚好也有AI分析&#xff0c;于是就尝试使用这个功能&#xff0c;看看这个ai能力到底怎么样 以下…