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

news2024/12/27 23:27:18

目录

四次挥手状态变化

流量控制

PSH标记位

URG标记位

滑动窗口

快重传

拥塞控制

延迟应答

mtu

TCP异常情况


四次挥手状态变化

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

那么我们下面可以来验证一下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协议可以让上层先把带有紧急指针的报文读上去,这样就可以停止上传了

滑动窗口

我们之前说过TCP发消息可以串行发,就是发一条消息等一个应答,但是这样发送效率太低。所以TCP一次发多条报文,然后等应答。

那么问题就来了,一次发多条,这些消息都是无需等待确认应答而可以继续发的数据,这个数量是怎么看的呢?

其实无需等待应答而可以继续发送数据的最大值就是滑动窗口的大小

我们可以认为滑动窗口就是发送缓冲区的一部分区域,这个区域是连续的,其中的数据都是暂时不需要应答而可以直接发送的数据

如果不考虑网络情况,滑动窗口的大小一般是对方接收缓冲区中剩余空间的大小,其实这个数据在三次握手的时候接收方就可以通过报头中的16位窗口大小告诉发送方了

我们可以把滑动窗口认为成下面的样子

其实简单来说,要维护一个窗口其实就是维护一段数组空间(可以把缓冲区看成char类型的数组),只需要两个整型变量即可,一个表示窗口开始位置,一个表示结束位置。

我们之前说过超时重传机制,就是对于已发送但是未收到应答的报文进行保存,万一报文丢失触发超时重传我们得找到那个报文,其实报文正好就存在于滑动窗口中

并且这个滑动窗口只能是向右滑动,可以变大,可以变小直至为零。因为滑动窗口的大小就取决于对方接收缓冲区的大小(暂时先这样理解,后面会说其实跟网络状况也有关系)

快重传

为了提高发送笑效率,TCP引入了快重传策略,就是当收到3个报文中具有同样的确认序号时就会重发滑动窗口的最左边的报文。

因为我们知道确认序号的意义就是确认序号之前的报文全部都收到了,接收方之所以会发三个同样的确认序号就是它收到了滑动窗口中间的一些报文,但是滑动窗口最左边(滑动窗口内)的报文没有收到,接收方收到报文后必须发确认应答,并且确认序号只能是滑动窗口左边(滑动窗口外)的已经收到的数组下标

如果没有3个呢?那就会触发超时重传

所以快重传其实是一个提效的策略,而超时重传则是一个兜底的策略

就以为有了上面的策略,所以才不会害怕滑动窗口最左侧丢包。

那如果是滑动窗口中间或最右侧丢包呢?这种情况其实最终还是转化成最左侧丢包,因为收到应答的报文会被分离出滑动窗口

对方在收到一批报文时,会发回一批应答报文,如果这个应答报文是乱序的呢?

1.首先应答报文也是有序号的,不用担心乱序问题

2.就算是乱序的,比如先收到确认序号是3001,后收到2001,其实收到3001是就已经能确定2000收到了,2001其实就可以直接丢弃了

所以就算一部分应答报文会丢失,后面的应答报文也会通告情况,所以是允许部分应答报文丢失的,这一切还是要归功于确认序号的意义上:确认序号之前的报文全部都收到了

接收数据的一方是要对报文进行排序后才能放到接收缓冲区的

我们上面说流量控制,其实滑动窗口就是流量控制的具体实现

缓冲区终归是有限的,那到头了怎么办?我们可以把缓冲区认为成是一个环状结构,滑动窗口就在这个环上循环

拥塞控制

我们发送数据看的其实不仅是通信双方的主机,还有网络

所以拥塞控制就是用来衡量网络的健康状况的

如果网络拥塞了,那么就会导致大面积丢包;如果发送量超过拥塞窗口就会导致网络拥塞

什么控制发送量呢?就是滑动窗口

每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小作比较,取较小的值作为实际发送的窗口

所以滑动窗口的大小就是对方接收能力和拥塞窗口的最小值

拥塞探测和TCP发送数据其实是同时进行的,拥塞控制的核心算法其实就是指数级增长,因为指数级增长一开始为慢启动,不会给拥塞的网络增加太多的压力;然后一旦发现网络状况较好就会增长的很快,尽快恢复通信;但是到了后面又开始比例增长,否则指数级增长过快了,大致是下面这样

延迟应答

这个意思就是收到数据后先等待一段时间,当然这个时间不会超过超时重传的时间,就是为了可能上层会取走一部分数据,这时就可以向发送方通报更大的接收能力了

mtu

Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。  MTU是 数据链路层 的概念

这个值我们可以通过ifconfig命令看到,是1500字节

所以网络中能够传输的最大数据包大小是1500字节

TCP异常情况

如果进程崩溃掉了,那么已经建立好连接的双方就会正常进行四次挥手

如果是机器重启导致进程退出,同样会执行上面的操作,所以有进程时的重启会比没进程时慢一些

如果网线断开或者突然断电,那么这方就直接关闭连接了,对方会发消息或者由于保活策略发一些试探性报文,如果没有应答就会断开连接

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

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

相关文章

阿里云docker安装禅道记录

docker network ls docker network create -d bridge cl_network sudo docker run --name zentao --restart always -p 9982:80 --networkcl_network -v /data/zentao:/data -e MYSQL_INTERNALtrue -d hub.zentao.net/app/zentao:18.5 升级禅道 推荐用按照此文档升级&a…

迈入国际舞台,AORO M8防爆手机获国际IECEx、欧盟ATEX防爆认证

近日,深圳市遨游通讯设备有限公司(以下简称“遨游通讯”)旗下5G防爆手机——AORO M8,通过了CSA集团的严格测试和评估,荣获国际IECEx及欧盟ATEX防爆认证证书。2024年11月5日,CSA集团和遨游通讯双方领导在遨游…

Win11家庭版 配置 WSL/Ubuntu+Docker详细步骤

最近换了台工作电脑,Windows系统的,想发挥下显卡的AI算算力,所以准备搞下docker环境,下面开始详细介绍: 1、准备系统 最开始是想安装Windows Docker Desktop的,奈何网络问题,死活不能下载镜像…

apache poi 实现下拉框联动校验

apache poi 提供了 DataValidation​ 接口 让我们可以轻松实现 Excel 下拉框数据局校验。但是下拉框联动校验是无法直接通过 DataValidation ​实现,所以我们可以通过其他方式间接实现。 ‍ 步骤如下: 创建一个隐藏 sheet private static void create…

LabVIEW扫描探针显微镜系统

开发了一套基于LabVIEW软件开发的扫描探针显微镜系统。该系统专为微观尺度材料的热性能测量而设计,特别适用于纳米材料如石墨烯、碳纳米管等的研究。系统通过LabVIEW编程实现高精度的表面形貌和热性能测量,广泛应用于科研和工业领域。 项目背景 随着纳…

【Python】强大的正则表达式工具:re模块详解与应用

强大的正则表达式工具:re模块详解与应用 在编程和数据处理中,字符串的处理是不可避免的一项任务。无论是从文本中提取信息、验证数据格式,还是进行复杂的替换操作,正则表达式(Regular Expression,简称Rege…

Redis数据库测试和缓存穿透、雪崩、击穿

Redis数据库测试实验 实验要求 1.新建一张user表,在表内插入10000条数据。 2.①通过jdbc查询这10000条数据,记录查询时间。 ②通过redis查询这10000条数据,记录查询时间。 3.①再次查询这一万条数据,要求根据年龄进行排序&#…

今天要重新认识下注解@RequestBody

在Spring框架中,RequestBody是一个常用的注解,它用于将HTTP请求体中的数据绑定到控制器(Controller)处理方法的参数上。这个注解通常与RESTful Web服务一起使用,在处理POST或PUT请求时尤为常见,因为这些请求…

在vscode中如何利用git 查看某一个文件的提交记录

在 Visual Studio Code (VSCode) 中,你可以使用内置的 Git 集成来查看某个文件的提交历史。以下是具体步骤: 使用 VSCode 内置 Git 功能 打开项目: 打开你的项目文件夹,确保该项目已经是一个 Git 仓库(即项目根目录下…

JavaScript 23种经典设计模式简介

23种JavaScript经典设计模式 JavaScript经典设计模式 通过之前的学习,我们知道设计模式是一种解决代码组织、代码复用和代码可维护性等问题的技术方法。它通过将代码以特定的方式组织起来,使代码结构更加清晰、可读性更高、易于维护和扩展。为了在开发…

LangChain Ollama实战文献检索助手(二)少样本提示FewShotPromptTemplate示例选择器

本期是用样例来提示大模型生成我们想要的答案。即在输入中给定提示的样例,以及提示模板,然后匹配较相关的样例进行文献综述。 创建示例样本FewShotPromptTemplate 这里我用GTP-o1生成了几个回答,作为样本 samples [{"theme": &…

R语言*号标识显著性差异判断组间差异是否具有统计意义

前言 该R代码用于对Iris数据集进行多组比较分析,探讨不同鸢尾花品种在不同测量变量(花萼和花瓣长度与宽度)上的显著性差异。通过将数据转换为长格式,并利用ANOVA和Tukey检验,代码生成了不同品种间的显著性标记&#x…

AUTOSAR CP NVRAM Manager规范导读

一、NVRAM Manager功能概述 NVRAM Manager是AUTOSAR(AUTomotive Open System ARchitecture)框架中的一个模块,负责管理非易失性随机访问存储器(NVRAM)。它提供了一组服务和API,用于在汽车环境中存储、维护和恢复NV数据。以下是NVRAM Manager的一些关键功能: 数据存储和…

PDF编辑工具Adobe Acrobat DC 2023安装教程(附安装包)

Adobe Acrobat DC 2023 是 Adobe 公司推出的一款功能强大的 PDF 文档处理软件。它不仅支持创建、编辑和签署 PDF 文件,还提供了丰富的工具来管理和优化这些文件。以下是 Acrobat DC 2023 的一些主要特点: 1.PDF 创建与编辑:用户可以直接从多…

Tornado简单使用

Tornado简单使用 1 介绍 Tornado 是一个基于Python的Web服务框架和 异步网络库,它最初由 FriendFeed 开发,后来被 Facebook 收购并开源,通过利用非阻塞网络 I/O, Tornado 可以承载成千上万的活动连接,完美的实现了 长连接、WebS…

基于SpringBoot的城镇保障性住房管理策略

3系统分析 3.1可行性分析 通过对本城镇保障性住房管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本城镇保障性住房管理系统采用SSM框架,JA…

【万字详解】如何在微信小程序的 Taro 框架中设置静态图片 assets/image 的 Base64 转换上限值

设置方法 mini 中提供了 imageUrlLoaderOption 和 postcss.url 。 其中: config.limit 和 imageUrlLoaderOption.limit 服务于 Taro 的 MiniWebpackModule.js , 值的写法要 ()KB * 1024。 config.maxSize 服务于 postcss-url 的…

[实战-11] FlinkSql 设置时区对TIMESTAMP和TIMESTAMP_LTZ的影响

table.local-time-zone table.local-time-zoneDataStream-to-Table Conversion(拓展知识)代码测试flinksql代码执行结果截图1. Asia/Shanghai 结果如下2. UTC结果如下 table.local-time-zone table.local-time-zone可用于设置flinksql的时区。 flink的内…

Bypassuac之白名单结合注册表方式

参考 Bypass UAC 原来这么简单 本章记录一下系统白名单文件结合注册表bypassuac,uac这个东西并不是Windows设置的防御机制而是相当于保护机制,只是用来控制用户行为的,弹个窗来提醒一下用户的行为,和直接的杀软是不一样的性质&am…

【力扣打卡系列】单调栈

坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day20 单调栈 题目描述 解题思路 单调栈 后进先出 记录的数据加在最上面丢掉数据也先从最上面开始 单调性 记录t[i]之前会先把所有小于等于t[i]的数据丢掉,不可能出现上面大下面小的…