TCP协议原理二
文章目录
- 四、滑动窗口
- 二、流量窗口
- 三、拥塞控制
四、滑动窗口
前面我们学习了 确认应答,超时重传,连接管理,这些机制都为我们TCP的可靠性提供了保证,当然在保证TCP的可靠性的同时,传输效率也受到了一定的影响,我们的TCP也将尽可能的提高传输效率,大家注意这里的提高传输效率,实际上是尽量的降低效率的亏损,无论我们如何提高都不可能比UDP这种不考虑可靠性的效率高,我们要做的是尽量让TCP效率高一些。
对于我们基本的确认应答来言,每次发一个数据后都需要收到一个ack后才发下一个数据。
滑动窗口的本质就是批量发送一组数据,然后使用一份时间来等待多个ack,这样就可以大大的提高性能。
窗口大小: 不需要等待,直接可以发送的数据最大的量。
我们在这里并不是等所有的ack到达后,才继续往下发,而是到一个ack就继续往下发一条,操作系统内核为了维护这个滑动窗口,需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答;只有确认应答过的数据,才能从缓冲区删掉。窗口越大,网络的吞吐率就越高。
比如这里我们等待的ack是1001-5000,我们收到了2001这个ack,证明2001之前的数据(1001-2000)已经确定了,我们接下来就可以立即再发一条,也就是5001-6000的数据,此时意味着我们等待的ack的范围就是2001-6000了
上面的情况都是理想状态,那如果出现了丢包了怎么办?
1. ack丢了
如果是ack丢了,我们不做任何处理也没事,为什么? 就需要我们弄清楚ack的含义是什么。
ack代表的是该序号之前的所有数据都确认到达了。
比如我们这里的1001的ack丢失了,但是我们的2001ack顺利到达了,2001到达的含义就是:2001之前的所有数据都确认到达了(1-1000 和 1001-2000都已到达),2001这个ack已经覆盖了上一个丢失的1001ack的信息了。
2. 数据丢了
我们这里的2001-3000丢包了,接下来3001-4000到达接收方之后,接收方给发送端的ack确认序号仍然是2001,表达的意思就是在索要2001开头的数据,我们可以发下下面的几个ack返回的都是2001,这时候发送端就会发现虽然已经发了许多数据了,但是接收端一直在反复索要2001开头的数据,证明2001-3000是没有收到的需要重传了。
等我们重传2001-3000的数据之后,由于2001-8000的数据都已经接收到了,于是接下来接收端索要的数据就是8001了。
快速重传: 就是我们上述丢包后重传的情况,也可以理解为超时重传机制在滑动窗口场景的变形。
有的同学可能会问到,那这样接收端接收的数据不就乱序了吗?
这个不必担心,因为我们TCP有接收缓冲区,会在缓冲区根据序号进行重新排序。
二、流量窗口
简单理解一下,我们流量窗口就是干涉滑动大小的机制。
随着滑动窗口的变大,我们的传输效率也在变高,但能无限增大吗?
- 如果无限大,相当于不等ack,那么可靠性能否保证?
- 窗口太大,会消耗大量的系统资源
- 接收方的处理能力能否跟得上?
我们接收方的处理能力是我们滑动窗口大小的一个很重要的约束条件,我们流量控制要进行的工作就是根据接收方的处理能力,来协调我们发送方的放松速度。
衡量接收方的处理能力是一个非常复杂的问题,可以从多个角度去衡量,比如去计算我们接受方的处理速度,但这种方式太麻烦了,于是我们这里有一个更简单的方法,就是判断接收方缓冲区的剩余大小。
我们接收方每次接收到数据之后,都需要计算一个水桶剩余的容量,然后将这个值通过ack报文返回给发送方,然后发送方就能根据这个值来决定接下来发送的速率大小(窗口大小)是多少了。
16位的窗口大小是否意味着窗口大小最大是64kb了?
并不是,我们的TCP在选项部分引入了一个窗口扩展因子 ,比如当我们窗口大小已经是64kb了但是仍然不够,于是在选项里的扩展因子写了个2,就代表64kb << 2 == 256 kb,这样就可以动态调整窗口大小了。
由于我们接收端的缓冲区剩余容量是一直动态变化的,所以每次返回的ack的窗口大小也是在不断变化的。
- 接收端一旦发现自己的缓冲区快满了,会将窗口大小设置成一个更小的值通知发送端
- 发送端发现会随着接收端ack报文中的窗口大小减小而减慢自己的发送速度
- 如果接收端缓冲区慢了,就会将窗口设置为0,发送方将不再发送数据,会定期发送一个窗口探测数据段,使接收端发送一个新的窗口大小给发送端
三、拥塞控制
拥塞控制和流量控制共同去决定发送方的窗口大小为多大,我们刚刚学习的流量控制考虑的是接收方的处理能力,而我们拥塞控制考虑的是传输过程中各个结点的处理能力。
我们刚刚只考虑了B的处理能力,越没有考虑这些中间结点的因素,决定A发送速度是有这两者最差的一个决定的,也就是典型的木桶效应。
我们中间的结点是错综复杂的,不太好衡量,但是大佬们总是有办法,想出了一个实验的方式来
测试出一个合适的值。
拥塞控制: 本质上就是通过实验的方式,来逐渐找到了一个合适的窗口大小。
慢启动: 我们可以发现0轮时,窗口大小是1(1不是一字节,而是一个单位,具体代表多少不是我们考虑的范围),以非常慢的速度发送数据,如果发现没有丢包,就扩大窗口。第一轮窗口大小为2,扩大了一倍,初始阶段,由于窗口大小比较小,只要每一轮不丢包窗口都扩大一倍(指数增长)。
阈值: 因为指数方式增长的很快,为了不增长那么快,引入了一个慢启动的阈值,当拥塞窗口超过这个阈值的时间,不再按照指数增长,而是按照线性方式增长。
在接下来,如果传输过程中一旦出现了丢包,如果是极少量的丢包仅仅触发超时重传,如果大量丢包,我们就认为网络拥堵,到达了发送速率的极限,此时就将窗口大小一次性缩到很小的值,然后重复上述的指数增长和线性增长的过程,因为我们的拥塞窗口不是固定的值,而是一直动态变化的。
流量控制和拥塞窗口共同决定了发送方实际发送的窗口大小(流量控制和拥塞控制的较小值)
相关文章:

TCP协议原理二
文章目录四、滑动窗口二、流量窗口三、拥塞控制四、滑动窗口 前面我们学习了 确认应答,超时重传,连接管理,这些机制都为我们TCP的可靠性提供了保证,当然在保证TCP的可靠性的同时,传输效率也受到了一定的影响ÿ…...

电子科技大学网络协议(TCP/IP作业答案)--网工(五次作业汇总)
目录 作业1:OSI/RM、TCP/IP编址和底层网络技术 作业2:IP地址规划与路由选择 作业3:ARP、IP、ICMP 作业4:UDP、Routing Protocol 作业五 作业1:OSI/RM、TCP/IP编址和底层网络技术 物理地址属于OSI/RM的哪一层&…...

Kubernetes集群声明式文件YAML
一、YAML介绍 YAML 的意思是:仍是一种标记语言,但为了强调这种语言以数据做为中心,而不是以标记语言为重点。是一个可读性高,用来表达数据序列的格式。 二、基本语法 1.低版本缩进时不允许使用Tab键,只允许使用空格…...

为赋能,创共赢~ 〖TFS_CLUB社区〗-〖星荐官计划〗来袭~ 期待各位小伙伴的加入~
文章目录❤️🔥 TFS社区介绍❤️🔥 星荐官计划在直播结束之后,有几位小伙伴跟我说,想法是好的,但是会很难搞。试想一下如果真的是很容易做的事情,那岂不是人人都可以做?正因为难做ÿ…...

【华为OD机试模拟题】用 C++ 实现 - 水仙花数(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 获得完美走位(2023.Q1) 文章目录 最近更新的博客使用说明水仙花数题目输入输出描述示例一输入输出说明示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。…...

Windows作为操作系统的典型特征和主要功能
我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Windows这个我们熟悉的不能再熟悉的系统。我们每天都在用Windows操作系统,但是其实我们每天直接在打交道的并不是Windows操作系统的内核,而是Windows操作系统的…...

【Linux】-- 多线程安全
目录 进程互斥 计算 -> 时序问题 加锁保护 pthread_mutex_lock pthread_mutex_unlock 使用init与destory pthread_mutex_init phtread_mutex_destory 锁的实现原理 图 可重入VS线程安全 死锁 Linux线程同步 条件变量 系统调用 进程互斥 进程线程间的互斥相关…...

Unity Avatar Camera Controller 第一、第三人称相机控制
文章目录简介Variables实现Target PositionTarget RotationOthers简介 本文介绍如何实现用于Avatar角色的相机控制脚本,支持第一人称、第三人称以及两种模式之间的切换,工具已上传至SKFramework框架的Package Manager中: Variables Avatar&…...

SRE中 的SLO,SLI等知识 归纳
SLA Service Level Agreement 服务质量/水平协议SLO Service Level Objective 服务质量/水平目标SLI Services Level Indicator 服务质量/水平指标下面用人、事、物的逻辑进行阐释。人和事用从上到下,从左到右的顺序。客户 - 每 1 个客户在使用产品服务时&…...

MS9123是一款单芯片USB投屏器,内部集成了USB2 0控制器和数据收发模块、视频DAC和音视频处理模块,MS9123可以通过USB接口显示或者扩展PC、
MS9123是一款单芯片USB投屏器,内部集成了USB2.0控制器和数据收发模块、视频DAC和音视频处理模块,MS9123可以通过USB接口显示或者扩展PC、智能手机、平板电脑的显示信息到更大尺寸的显示设备上,支持CVBS、S-Video视频接口。 主要功能特征 C…...

针孔成像模型零基础入门(三)
2020年爆火的Nerf(神经辐射场)横空出世,据说只要用手机拍照,然后喂给模型,就可以生成3D模型了,我试过了,确有此事! 那我们有想过,为什么可以从二维的图片里面获取物体三…...

你真的了解环形队列吗?(学习数据结构必须掌握的模型)
目录 0.前言 1. 什么是环形队列 2. 如何使用数组结构 / 链表结构 对环形队列封装 3. 代码手撕环形队列各个接口 3.1 代表封装一个环形队列 3.2 环形队列的初始化 3.3 环形队列的插入 3.4环形队列的删除 3.5环形队列的判空 3.6环形队列的判满 3.7环形队列的队头 3.8环…...

《痞子衡嵌入式半月刊》 第 72 期
痞子衡嵌入式半月刊: 第 72 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,…...

对redis之键值型数据库的理解
键值数据库,首先就要考虑里面可以存什么样的数据,对数据可以做什么样的操作,也就是数据模型和操作接口。它们看似简单,实际上却是我们理解 Redis 经常被用于缓存、秒杀、分布式锁等场景的重要基础。理解了数据模型,你就…...

Linux内核中的软中断、tasklet和工作队列
软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,…...

【Java】Spring Boot 2 集成 nacos
官方文档:https://nacos.io/zh-cn/docs/quick-start-spring-boot.html pom 本次Springboot版本 2.2.6.RELEASE,nacos-config 版本 0.2.7,nacos-discovery版本 0.2.7 parent <parent><groupId>org.springframework.boot</gr…...

JavaSE学习笔记day14
二、Set Set集合是Collection集合的子接口,该集合中不能有重复元素!! Set集合提供的方法签名,与父接口Collection的方法完全一致!! 即没有关于下标操作的方法 Set接口,它有两个常用的子实现类HashSet,TreeSet 三、HashSet HashSet实现了Set接口,底层是hash表(实际上底层是HashM…...

LLVM高级架构介绍
LLVM 为什么要开一个LLVM的新坑呢? 我从智能穿戴转行到芯片软件行业,从事编译器开发,不过是AI编译器。不过基本的传统编译器还是绕不过去啊,所以开始学习LLVM,后面开始学习TVM,MLIR。 LLVM GitHub地址 L…...

全网最经典函数题型【详解】——C语言
文章目录1. 写一个函数可以判断一个数是不是素数。2. 写一个函数判断一年是不是闰年。3. 写一个函数,实现一个整形有序数组的二分查找。4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1。5. 写一个函数,打印乘法口诀表。6…...

emqx桥接配置+常见问题解决+jmeter压测emqx
一,桥接资源配置及规则配置 Emqx桥接配置流程 1,配置资源并测试连接通过 规则引擎——>资源——>新建——>选择MQTT Bridge——>填写参数测试连接 参数描述详见3.1资源配置 2,配置规则 2.1根据实际业务选择合适sql 规则引擎…...

improve-1
类型及检测方式 1. JS内置类型 JavaScript 的数据类型有下图所示 其中,前 7 种类型为基础类型,最后 1 种(Object)为引用类型,也是你需要重点关注的,因为它在日常工作中是使用得最频繁,也是需要…...

华为OD机试用Python实现 -【云短信平台优惠活动】(2023-Q1 新题)
华为OD机试题 华为OD机试300题大纲云短信平台优惠活动题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明Python 代码实现代码编写思路华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看…...

Facebook广告投放运营中的关键成功因素是什么?
在当今数字化的时代,广告投放已经成为了各种企业获取市场份额和增加品牌曝光的重要手段之一。Facebook作为全球最大的社交媒体平台之一,其广告投放运营的成功,将直接影响企业的品牌推广和市场营销效果。本文将探讨Facebook广告投放运营中的关…...

2023年1月综合预订类APP用户洞察——旅游市场复苏明显,三年需求春节集中释放
2023年1月,随着国家对新型冠状病毒感染实施“乙类乙管”,不再对入境人员和货物等采取检疫传染病管理措施,并且取消入境后全员核酸检测和集中隔离,横亘在旅游者与旅游目的地之间的隔阂从此彻底消失。2023年1月恰逢春节假期…...

基于stm32计算器设计
这里写目录标题 完整de代码可q我获取1 系统功能设计2 系统硬件系统分析设计2.1 STM32单片机核心电路设计2.2 LCD1602液晶显示模块电路设计2.3 4X4矩阵键盘模块设计3 STM32单片机系统软件设计3.1 编程语言选择3.2 Keil程序开发环境3.3 FlyMcu程序烧录软件介绍3.4 CH340串口程序烧…...

基于SpringCloud的可靠消息最终一致性02:项目骨架代码(上)
在上一节中咱们已经把分布式事务问题交代了一遍,包括两大定理、五大解决方案和一个成熟的开源框架,而咱们最终的目标是用Spring Cloud实现一个实际创业项目的可靠消息最终一致性的分布式事务方案。 先交代一下项目背景。 前几年,社会上慢慢兴起一种称为C2C同城快递的业务,也…...

RockerMQ集群部署
目录一、Broker集群模式1、单Master:2、多Master多Slave模式异步复制3、多Master多Slave模式同步双写二、集群搭建实践1、集群架构2、克隆生成rocketmqos13、修改rocketmqos1配置文件4、克隆生成rocketmqOS25、修改rocketmqOS2配置文件6、启动服务器7、测试一、Brok…...

unicloud的aggregate聚合查询时间戳转日期
我特么不知道看了这个帖子几百遍才看明白到-----》unicloud数据库中,聚合操作如何操作时间戳? - DCloud问答 自己淋过雨老想着为别人撑伞,可怜我这35岁的老人家,给我去点关注!!!!&a…...

Vue2.0开发之——使用ref引用组件实例(41)
一 概述 在本组件内部修改count的值在父组件内修改子组件的count值 二 在本组件内部修改count的值 2.1 Left.vue 布局代码 <template><div class"left-container"><h3 >Left 组件---{{count}}</h3><button click"count 1"&…...

极狐GitLab仓库瘦身
参考文章: [分享] 极狐GitLab仓库瘦身 - 官方技术分享 - 极狐GitLab 论坛 一、瘦身概述 Git仓库随着时间推移会变得越来越大,比如很多比较大的文件加入Git仓库时,可能引起以下问题: 下载仓库越来越慢,因为每个人都…...