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

news/2024/5/8 3:02:07/文章来源:https://blog.csdn.net/qq_62712350/article/details/130025329

目录

滑动窗口

流量控制

拥塞控制

延时应答

捎带应答

面向字节流

异常情况

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.luyixian.cn/news_show_283785.aspx

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

相关文章

【Linux】环境变量进程虚拟地址空间

环境变量&进程虚拟地址空间环境变量一些常见的环境变量-PATH修改环境变量进程虚拟地址空间环境变量 使用ls man pwd cd echo 这些指令时,不需要加./但是要运行我们自己的可执行程序就需要加上,本质上两个都是指令,为什么执行方法不同&am…

python学习之http客户端和服务端

Part1前言python非常简洁,非常适合写小功能以及测试接口。本文主要记录用pyhon实现一个简单的http客户端和服务端。Part2http客户端这里采用request库来实现。示例如下import requests import json url http://127.0.0.1:81/test?key1123&key2456headers {Au…

代码不熟没关系,让AI替你写

程序员早已不是一个陌生的群体,但程序、代码相对普通人而言,看着还是比较深奥难懂,但自从有了ChatGPT,不少对此有兴趣的外行人士,也能轻松写出代码了,比如让ChatGPT写一个贪吃蛇游戏,按它给出的…

【如何使用Arduino控制WS2812B可单独寻址的LED】

【如何使用Arduino控制WS2812B可单独寻址的LED】 1. 概述2. WS2812B 发光二极管的工作原理3. Arduino 和 WS2812B LED 示例3.1 例 13.2 例 24. 使用 WS2812B LED 的交互式 LED 咖啡桌4.1 原理图4.2 源代码在本教程中,我们将学习如何使用 Arduino 控制可单独寻址的 RGB LED 或 …

ROS实践05 订阅方实现Python

文章目录运行环境:思路:1.1 Python代码实现1)工作空间创建和编译2)功能包创建和添加依赖3)新建.py文件4)修改CMakeList5)运行节点运行环境: ubuntu20.04 noetic 宏基暗影骑士笔记本…

Java每日一练(20230409)

目录 1. 多数元素 🌟 2. 反转链表 II 🌟🌟 3. 日期之间的遍历 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 多数元素 给定一个…

使用红黑树封装map和set

目录 一、set和map的底层结构 使用模板区分map和set 使用仿函数来比较大小 二、红黑树中set和map的迭代器 end和begin迭代器 operator迭代器 operator-- 三、set与map中的迭代器和const迭代器 四、迭代器的拷贝构造 五、完整代码 set.h map.h RBTree.h 一、set和ma…

UE4 C++编写自定义动画蓝图节点

UE中自带的动画蓝图节点有限,在实现一些功能时需要通过C编写一些自定义的动画蓝图节点,本文就来讲解其基础实现,自定义节点最终效果如下: 源文件下载:https://download.csdn.net/download/grayrail/87654290 1.流程简…

linux 服务器 docker 安装 mysql 8.0.32 常用命令

我的Docker专栏 https://blog.csdn.net/weixin_45580378/category_12276045.html docker 镜像 https://registry.hub.docker.com/_/mysql/tags 1.版本号可不写 不写就是最新版本 最好写上 docker pull mysql:版本号2.查看镜像是否安装成功 如下图 docker images3.创建文件…

活动送票福利|Jina AI x PyCon US 2023!

作为一家总部位于德国柏林的国际化公司,Jina AI 拥有来自 10 不同国家的团队成员,在中国(北京、深圳)、美国(圣何塞)均设有办公室。全球化基因深植于 Jina AI 团队,我们也非常注重国际化社区的建…

shardingsphere-jdbc 整合 springboot

shardingsphere官网地址 https://shardingsphere.apache.org/document/5.2.0/cn/user-manual/shardingsphere-jdbc/spring-boot-starter/rules/sharding/ 当前我们演示的是水平分表 1、基础环境配置以及依赖管理 1.1 创建数据库表结构 CREATE TABLE address_0 (id bigint(…

linux 服务器 docker 安装 jdk jre java 1.8 环境 常用命令

我的Docker专栏 https://blog.csdn.net/weixin_45580378/category_12276045.html docker jdk 镜像 https://hub.docker.com/_/java/tags 1.下载JDK镜像 注:后面如果不写版本的话 就是最新版 建议写上 docker pull java:8u111-jdk2.查看镜像是否下载成功 docker…

家装产业的数字化,正在成为越来越多人的新共识

一场数字化的浪潮,正在各行各业上演着。家装行业,亦不例外。可以说,家装产业的数字化,正在成为越来越多人的新共识。如何借助数字化的手段改造家装行业,如何乘着数字化的东风实现家装行业的全面转型升级,正…

CF区间DP作业题解

1. Recovering BST 由于互质关系不是传递的,所以尽量挂在树的最下面,刚好构成二叉树 f[i][j][0]f[i][j][0]f[i][j][0] 表示区间 [i,j][i,j][i,j] 以 iii 为根,是否可以构成一棵树。 f[i][j][1]f[i][j][1]f[i][j][1] 表示区间 [i,j][i,j][i,j…

基于非线性权重因子和纵横交叉策略的麻雀搜索算法

目录 1 主要内容 非惯性权重模型 纵横交叉策略模型 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序参考文献《基于Sobol序列和纵横交叉策略的麻雀搜索算法》对麻雀搜索算法进行改进,实现了基于纵横交叉策略和非线性权重因子的麻雀搜索算法 改进SSA算法【…

webpack配置本地TypeScript编译环境和开启本地服务

目录 1.创建一个文件夹 2.初始化一个package.json文件对我们安装包进行记录 3.安装webpack 4.配置webpack.config.js文件 1.创建一个文件夹 2.初始化一个package.json文件对我们安装包进行记录 执行npm init,文件命名为ts_demo,然后一直回车。 3.安装…

ImageIO 支持webp格式

TwelveMonkeys 提供了很多图片格式的支持,其中也包括了webp,但是其仅支持webp格式的读取,不支持webp格式的写出,这样的话如果想把图片转换成webp格式的图片就没办法实现了;下面我们使用 webp-imageio-core 对ImageIO图…

关键词采集工具可以帮助我们做那些方面的工作

针对搜索引擎的关键词采集工具可以帮助我们做那些方面的工作,至少从10个工作场景说明,并列举详细的使用场景 Msray-plus,是一款企业级综合性爬虫/采集软件。 支持亿级数据存储、导入、重复判断等。无需使用复杂的命令,提供本地W…

ROS实践01 C++ Python基本实现

文章目录运行环境:1.1 vscode 环境配置:1)ctrlshiftX 添加扩展插件:2)ctrlshiftB 配置中更换为以下代码1.2 C代码实现1)工作空间创建和编译2)功能包创建和添加依赖3)新建.cpp文件4&a…

新电脑装机——配置硬件、软件安装卸载、注册表、路径——介绍详解

装机工具、配置、路径,介绍详解电脑配置信息电脑历史记录黑色Window Top 加入黑色(微信不能调成黑色背景)edge浏览器的配置(被edge恶心过的必看,有方法解决edge被管理、不能新建标签)设置【地址栏搜索】&am…