TCP协议工作机制二(滑动窗口,流量控制,拥塞控制,延时应答,捎带应答等)

news2025/1/22 20:55:24

目录

滑动窗口

流量控制

拥塞控制

延时应答

捎带应答

面向字节流

异常情况

UDP和TCP对比


滑动窗口

由于TCP是可靠传输,有确认应答,超时重传,连接管理等机制,发送消息时需要等待接收方返回的ack.因此会消耗大量等待ack的时间,我们引入滑动窗口的机制来竭尽可能提高TCP的传输效率

当批量发送一批数据后,发送方就需要等待ACK了,发送方不是等待所有的ACK到达才继续往下发,而是得到一个ACK ,就需要继续往下发下一条或者多条,这样此处等待的ACK始终都是四条.
要想弄清楚滑动窗口机制,我们还需要明白确认序号的含义,确认序号表示:从该序号往前的所有的数据都已经确认到达了,所以如上图,如果只返回了一个4001的确认序号,说明4001之前的数据都确认到达了,此时我们无需再等待4001之前的ACK,直接再继续往下发数条数据.

如果丢包该如何处理?

此处丢包也分俩种情况,一种是发送方发送的数据丢了,一种是接收方返回的ACK丢了

ACK丢了

因为确认序号表示的含义是:该序号之前的所有数据都已经确认到达了,所以我们偶尔几个ACK丢包了也没关系,因为后面的确认序号实际上就包含了之前的ACK的信息.而事实上,操作系统内核再返回这些ACK的时候也并不是全部返回,可能会少返回一部分,这样在不影响可靠性的前提下,也节省了系统资源

数据丢了

由于1001-2000丢包了,接下来2001-3000到达主机B后,B给A返回的ACK确认序号仍然是1001(此时和发来的这个数据序号关系不大),意思是告诉A: 1001-2000数据没有收到,重发一下,所以接下来的几个ACK的确认序号都会是1001,直到B收到了1001-2000的数据,而A在连续收到3次1001-2000的时候,就会重传1001-2000

上述重传方式,也称为"快速重传"(重传操作只重传了丢失的数据),这种重传方式可以视为 超时重传机制在滑动窗口下的变形,如果当前传输数据密集,按照滑动窗口的方式来传输,此时按照快速重传处理丢包,如果传输数据数据稀疏,不按照滑动窗口的方式,此时按照超时重传处理丢包

当然我们可能会收到不止3个确认序号是1001-2000的ACK,所以A可能会重传1001-2000不止一次,但问题不大,B的接收缓冲区会进行去重

流量控制

由上述滑动窗口机制我们知道,滑动窗口的窗口越大,传输效率就越高,但是窗口不能无限放大,因为窗口太大几乎不等待ACK,TCP的可靠性不能保证,窗口太大也会消耗大量的系统资源,发送方发送太快,接收方处理不过来,再发数据意义不大.

因此接收方的处理能力是滑动窗口的窗口大小的一个重要约束,发送方发的速度,不能超出接收方的处理能力,流量控制做的工作就是,根据接收方的处理能力,协调发送方的发送速率

如何衡量接收方的处理能力?

直接查看接收方接收缓冲区剩余大小,比如A给B发送数据,每次A给B发送数据的时候,B就要计算一下自己的接收缓冲区的剩余空间大小,然后把这个值通过ACK报文返回给A,A根据这个值来决定接下来发送的数据的速率是多少(窗口大小是多少),也就是TCP报文中16位窗口大小这部分的值,当然16位窗口大小里的值必须是ACK报文才有效,16位也就是0-65535,并不意味着窗口大小最多只能是64KB,TCP为了能让窗口更大,再选项部分引入了扩展因子,比如此处窗口大小是64KB,宽展因子  是2,意味着64KB左移俩位,此时窗口大小就是256KB了

因此窗口大小不是固定的,是随着传输过程的进行,动态调整的,当窗口大小为0时,发送方暂停发送,在暂停发送等待的过程中,A会给B定期发送一个窗口探测报文,这个报文不携带任何具体的业务数据,只是为了触发ACK查询窗口大小

拥塞控制

流量控制和拥塞控制共同决定发送方发送的窗口大小是多少,流量控制考虑的是接收方的处理能力,拥塞控制描述的是传输过程中,中间节点的处理能力

我们如何衡量中间节点的处理能力呢?

我们通过实验的方式,来测试出一个合适的值

   

0轮,窗口大小1,此处1并不是指1个字节,而是指1个单位, 如果传输顺利,没有丢包就继续扩大窗口,第1轮,窗口大小就是2,扩大1倍.如果传输顺利,没丢吧就继续扩大窗口,第二轮窗口大小就说4,又扩大了一倍,依次类推.初始阶段,由于窗口比较小,每一轮不丢包,都使窗口大小扩大一倍.
增长速率达到阈值后(也就是图中的ssthresh),此处指数增长变为线性增长,注意增长的前提是传输顺利,不丢包,当传输过程一旦丢包,就说明此时发送的速率已经接近网络的极限.因此就把窗口再缩小成一个很小的值(重复刚才指数增长和线性增长的过程,另外新的ssthresh等于刚刚接近极限的那个值的一半).

流量控制和拥塞控制的窗口,共同决定了发送方实际的发送窗口.(取俩者中较小的值)

另外上述的过程是老版本的拥塞控制(之前的互联网中间设备不稳定,且带宽不高),在新版本中,我们在测到一个接近网络极限的值,就直接使用这个值作为拥塞控制的窗口大小了,不再把它变为一个极小的值重新测了

延时应答

延时应答是在滑动窗口的基础上,进一步提高传输效率

滑动窗口的关键是:让窗口大一点,传输速率就快一点,因此就要在接收方能处理的情况下,尽可能增大窗口大小,延时应答就是在收到数据之后,不是立即返回ACK了,而是稍微等一会再返回,等待的时间里,接收方就能把接收缓冲区的数据处理一些,此时剩余的空间就更大一些.

而实际上,延时应答具体是怎么延时的呢?采取的方式是:在滑动窗口下,ack不再每一条数据都返回了,可能是隔几数据返回一个ACK

捎带应答

捎带应答是在延时应答的基础上的,把本来俩个不同时机发送的数据,因为有了延时应答,就可能变成同一时机打包一起发送了.

 因为有了捎带应答和延时应答,四次挥手变成三次挥手也成为了可能,捎带应答俩个数据变成一份发送成为了可能,而延时应答提高了这种合并的概率

面向字节流

面向字节流会引入粘包问题,在接收缓冲区会把很多数据放到一起,此时应用程序read读取的时候,就不知道读到哪算是一个完整的数据报.

由于TCP是面向字节流的,一次可以读1个字节,也可以读多个字节,这就导致一次读到的数据可能是半个应用层数据报,可能是一个应用层数据报,也有可能是多个应用层数据报.

解决粘包问题的俩种方案

我们可以在应用层约定好应用层协议,明确应用层数据报和应用层数据报之间的边界

1.约定好分隔符

1.约定好每个包的长度

异常情况

1.进程崩溃了

进程结束了,对应的PCB也就没了,对应的文件描述符表就释放了,相当于 socket.close(),此时内核会继续完成四次挥手,仍然是一个正常的断开流程,当然崩溃是立即断开连接,如果进程崩溃发生再四次挥手的过程中,连接会保持半开状态,需要等待超时才能被关闭.

2.主机关机(按照正常流程关机)

主机关机,会先杀进程,然后才正式关机,所以会正常完成四次挥手的流程

3.主机掉电

主机掉电,显然是来不及挥手了.假设是接收方掉电,发送方仍然在继续发送数据,发完数据要等待ACK,ACK等不到再超时重传,重传几次还没有应答,会尝试重置TCP连接.显然这个重置也会失败,放弃连接.
如果是发送方掉电,接收方发现没数据了,接收方会周期性的给发送方发一条消息,确认一下对方是否还正常工作.这个消息我们形象的称为心跳包,心跳是周期性的,如果心跳没了,说明进程没了

4.网线断开

和主机掉电同理

UDP和TCP对比

TCP的优势在于,可靠传输,绝大部分场景都需要可靠传输,UDP的优势在于传输速率快,有些场景对性能要求更高(如同一机房内部服务器之间的通信,网络结构相对简单,网络带宽比较充裕,此时丢包的概率小),此外UDP天然支持广播,IP地址中有一种特殊的地址"广播IP",通过UDP往广播IP上发送数据,此时局域网内所有设备都能收到数据

当然还有另外的传输层协议,如KCP为代表的一系列协议,在可靠性和高效率做出权衡,可以很好的为游戏场景提供服务

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

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

相关文章

基于支持向量机的Digits手写数字识别

基于支持向量机的Digits手写数字识别 描述 支持向量机(Support Vector Machine,简称SVM)模型既可以用于分类也可以用于回归。手写数字识别是一个多分类问题(判断一张手写数字图片是0~9中的哪一个),数据集…

图片英文翻译成中文转换器-中文翻译英文软件

您正在准备一份重要的英文资料或文件,但是您还不是很熟练地掌握英文,需要翻译才能完成您的任务吗?哪个软件能够免费把英文文档翻译成中文?让我们带您了解如何使用我们的翻译软件来免费翻译英文文档为中文。 我们的翻译软件是一款功…

C风格的字符串赋值方式

文章目录(1)C语言中,没有字符串类型但可以用字符数组模拟字符串。(2)C语言中,字符串是以’\0’作结尾字符。(3)C语言中,字符串常量本质上是一个无名的字符数组。C风格的字…

使用Spring JDBC中的JdbcTemplate对数据进行增删改查操作教程~

jdbcTemplate实现添加数据功能: spring框架对jdbc框架进行封装,使用jdbcTemplate方便实现对数据库的操作 数据库准备工作: 在已有数据库中创建新的表: create table t_user (id int,username varchar(20),password varchar(20…

搜索词分析工具-网站关键词挖掘

怎么能找到行业的关键词 以下是如何找到行业关键词的建议: 了解行业:要找到与行业相关的关键词,首先需要了解行业。了解行业以及核心目标,从而更好地理解行业中的主题和词汇。 找到竞争对手网站:搜索竞争对手的网站&…

k8s部署Dashboard

k8s和Dashboard的版本对应关系可以到Dashbord的对应版本里看,比如这里: https://github.com/kubernetes/dashboard/releases/tag/v2.7.0 以下步骤都是在master上执行的。 1. 部署步骤 1. 获取Dashbord的yaml文件 wget https://raw.githubusercontent…

【Git】—— 如何安装Git及简单使用

Git是一个开源的分布式版本控制工具,可以更好地管理你的项目。 一、Linux操作系统 如果用的是Ubuntu系统,只需打开shell界面,输入: sudo apt-get install git-core 按下回车即可完成安装。 二、Windows操作系统 Windows操作系统不…

C语言-数据结构与算法-详细全面的链表知识总结归纳

C语言链式存储结构的详细讲解一.前言(为什么要使用链式存储)一.单链表1.单链表的结点描述2.单链表基本操作(1)初始化单链表(2)采用头插法建立单链表(带头结点)(3).采用尾插法建立单链表(4)按照位序查找结点(4)在链表中间插入结点(5)删除第i个结点二.双链表1.双链表的结点类型描…

和ChatGPT-4聊完后,我觉得一切可能已经来不及了

了然无味,晴空万里!和ChatGPT-4开始了一场坦诚的沟通,它全程都表现出高情商,以及不断尽量安抚我的情绪,而这,恰恰令我脊背发凉。 部分文字截取 ZM:我能不能理解每次对话就是一次你的“生命” G&…

【Android -- 软技能】分享一个学习方法

前言 很多人都想通过学习来提升自己,但是,可能因为两个问题,阻碍了自己的高效提升: 学什么? 怎么学? 本文将从自己的学习实践出发,针对这两个问题,给出自己的一套学习流程。 1…

免费集装箱号识别API免费集装箱信息识别,中国人工智能企业CIMCAI集装箱识别云服务全球4千企业用户,中国人工智能企业智慧港航

免费集装箱号识别API免费集装箱信息识别API,CIMCAI飞瞳引擎™集装箱人工智能平台全球4千企业用户,全球领先的飞瞳引擎™AI集装箱识别云服务,集装箱残损识别箱况检测缺陷检验,小程序拍照检测或支持API接口二次开发,应用…

00后整顿职场,我直呼太卷了....

内卷的来源 内卷最早的“出处”是几张名校学霸的图片。 大学生们刷爆朋友圈的几张“内卷”图片是这样的:有的人骑在自行车上看书,有的人宿舍床上铺满了一摞摞的书,有的人甚至边骑车边端着电脑写论文。这些图片最早在清华北大的学霸之间流传。…

AI工具究竟是帮手还是对手?对此你怎么看,一起来聊聊你的看法吧!

© Ptw-cwl 前言 AI工具既可以是帮手,也可以是对手,这取决于我们如何使用它们。 如果我们正确地利用AI工具,它们可以为我们带来很多好处,例如更快的数据分析、更准确的预测和更高效的决策。然而,如果我们滥用AI工…

嵌入式开发:硬件和软件越来越接近

从前,硬件和软件工程师大多生活在自己的世界里。硬件团队设计了芯片,调试了从铸造厂返回的第一批样本,让软件团队测试他们的代码。随着虚拟平台和其他可执行模型变得越来越普遍,软件团队可以在芯片制造之前开始,有时甚…

贝叶斯优化 | BO-RF贝叶斯优化随机森林多输入单输出回归预测(Matlab完整程序)

贝叶斯优化 | BO-RF贝叶斯优化随机森林多输入单输出回归预测(Matlab完整程序) 目录 贝叶斯优化 | BO-RF贝叶斯优化随机森林多输入单输出回归预测(Matlab完整程序)预测结果基本介绍评价指标程序设计参考资料预测结果 基本介绍 贝叶斯优化 | BO-RF贝叶斯优化随机森林多输入单…

面试题

用 C写一个函数&#xff0c;交换两个整型变量 int a 5, b 10; cout << "Before swapping: a " << a << ", b " << b << endl; swapVars<int>(a, b); cout << "After swapping: a " << a …

半透明反向代理 (基于策略路由)

定义 半透明反向代理一般是指 代理本身对于客户端透明&#xff0c;对于服务端可见。 从客户端视角看&#xff0c;客户端访问的还是服务端&#xff0c;客户端不知道代理的存在。 从服务端视角看&#xff0c;服务端只能看到代理&#xff0c;看不到真实的客户端。 示意图 客户端…

【C语言】switch语句的理解

文章目录一. 基本语法结构二. 几点补充补充一&#xff1a;关于 default 分支补充二&#xff1a;多条匹配执行同一语句补充三&#xff1a;在 case 语句中定义变量的问题三. 几点建议建议一&#xff1a;按执行频率排列 case 语句细节二&#xff1a;简化每种情况对应的操作细节三&…

Node【四】内置模块 【fs模块】

文章目录&#x1f31f;前言&#x1f31f;fs模块&#x1f31f; 使用fs模块&#x1f31f; 异步编程和同步编程&#x1f31f; 异步编程&#x1f31f; 同步编程&#x1f31f;常用操作&#x1f31f; 文件操作&#x1f31f; readFile异步读取文件&#x1f31f; readFileSync同步读取文…

[数据分析与可视化] Python绘制数据地图2-GeoPandas地图可视化

本文主要介绍GeoPandas结合matplotlib实现地图的基础可视化。GeoPandas是一个Python开源项目&#xff0c;旨在提供丰富而简单的地理空间数据处理接口。GeoPandas扩展了Pandas的数据类型&#xff0c;并使用matplotlib进行绘图。GeoPandas官方仓库地址为&#xff1a;GeoPandas。G…