当前位置: 首页 > news >正文

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有接收缓冲区,会在缓冲区根据序号进行重新排序。

二、流量窗口

简单理解一下,我们流量窗口就是干涉滑动大小的机制。
随着滑动窗口的变大,我们的传输效率也在变高,但能无限增大吗?

  1. 如果无限大,相当于不等ack,那么可靠性能否保证?
  2. 窗口太大,会消耗大量的系统资源
  3. 接收方的处理能力能否跟得上?

我们接收方的处理能力是我们滑动窗口大小的一个很重要的约束条件,我们流量控制要进行的工作就是根据接收方的处理能力,来协调我们发送方的放松速度。
衡量接收方的处理能力是一个非常复杂的问题,可以从多个角度去衡量,比如去计算我们接受方的处理速度,但这种方式太麻烦了,于是我们这里有一个更简单的方法,就是判断接收方缓冲区的剩余大小
在这里插入图片描述
我们接收方每次接收到数据之后,都需要计算一个水桶剩余的容量,然后将这个值通过ack报文返回给发送方,然后发送方就能根据这个值来决定接下来发送的速率大小(窗口大小)是多少了。
在这里插入图片描述
16位的窗口大小是否意味着窗口大小最大是64kb了?
并不是,我们的TCP在选项部分引入了一个窗口扩展因子 ,比如当我们窗口大小已经是64kb了但是仍然不够,于是在选项里的扩展因子写了个2,就代表64kb << 2 == 256 kb,这样就可以动态调整窗口大小了。
在这里插入图片描述
由于我们接收端的缓冲区剩余容量是一直动态变化的,所以每次返回的ack的窗口大小也是在不断变化的。

  1. 接收端一旦发现自己的缓冲区快满了,会将窗口大小设置成一个更小的值通知发送端
  2. 发送端发现会随着接收端ack报文中的窗口大小减小而减慢自己的发送速度
  3. 如果接收端缓冲区慢了,就会将窗口设置为0,发送方将不再发送数据,会定期发送一个窗口探测数据段,使接收端发送一个新的窗口大小给发送端

三、拥塞控制

拥塞控制和流量控制共同去决定发送方的窗口大小为多大,我们刚刚学习的流量控制考虑的是接收方的处理能力,而我们拥塞控制考虑的是传输过程中各个结点的处理能力。
在这里插入图片描述
我们刚刚只考虑了B的处理能力,越没有考虑这些中间结点的因素,决定A发送速度是有这两者最差的一个决定的,也就是典型的木桶效应。
我们中间的结点是错综复杂的,不太好衡量,但是大佬们总是有办法,想出了一个实验的方式来
测试出一个合适的值。
拥塞控制: 本质上就是通过实验的方式,来逐渐找到了一个合适的窗口大小。
在这里插入图片描述
慢启动: 我们可以发现0轮时,窗口大小是1(1不是一字节,而是一个单位,具体代表多少不是我们考虑的范围),以非常慢的速度发送数据,如果发现没有丢包,就扩大窗口。第一轮窗口大小为2,扩大了一倍,初始阶段,由于窗口大小比较小,只要每一轮不丢包窗口都扩大一倍(指数增长)。
阈值: 因为指数方式增长的很快,为了不增长那么快,引入了一个慢启动的阈值,当拥塞窗口超过这个阈值的时间,不再按照指数增长,而是按照线性方式增长。
在接下来,如果传输过程中一旦出现了丢包,如果是极少量的丢包仅仅触发超时重传,如果大量丢包,我们就认为网络拥堵,到达了发送速率的极限,此时就将窗口大小一次性缩到很小的值,然后重复上述的指数增长和线性增长的过程,因为我们的拥塞窗口不是固定的值,而是一直动态变化的。

流量控制和拥塞窗口共同决定了发送方实际发送的窗口大小(流量控制和拥塞控制的较小值)

相关文章:

TCP协议原理二

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

电子科技大学网络协议(TCP/IP作业答案)--网工(五次作业汇总)

目录 作业1&#xff1a;OSI/RM、TCP/IP编址和底层网络技术 作业2&#xff1a;IP地址规划与路由选择 作业3&#xff1a;ARP、IP、ICMP 作业4&#xff1a;UDP、Routing Protocol 作业五 作业1&#xff1a;OSI/RM、TCP/IP编址和底层网络技术 物理地址属于OSI/RM的哪一层&…...

Kubernetes集群声明式文件YAML

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

为赋能,创共赢~ 〖TFS_CLUB社区〗-〖星荐官计划〗来袭~ 期待各位小伙伴的加入~

文章目录❤️‍&#x1f525; TFS社区介绍❤️‍&#x1f525; 星荐官计划在直播结束之后&#xff0c;有几位小伙伴跟我说&#xff0c;想法是好的&#xff0c;但是会很难搞。试想一下如果真的是很容易做的事情&#xff0c;那岂不是人人都可以做&#xff1f;正因为难做&#xff…...

【华为OD机试模拟题】用 C++ 实现 - 水仙花数(2023.Q1)

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

Windows作为操作系统的典型特征和主要功能

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Windows这个我们熟悉的不能再熟悉的系统。我们每天都在用Windows操作系统&#xff0c;但是其实我们每天直接在打交道的并不是Windows操作系统的内核&#xff0c;而是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角色的相机控制脚本&#xff0c;支持第一人称、第三人称以及两种模式之间的切换&#xff0c;工具已上传至SKFramework框架的Package Manager中&#xff1a; Variables Avatar&…...

SRE中 的SLO,SLI等知识 归纳

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

MS9123是一款单芯片USB投屏器,内部集成了USB2 0控制器和数据收发模块、视频DAC和音视频处理模块,MS9123可以通过USB接口显示或者扩展PC、

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

针孔成像模型零基础入门(三)

2020年爆火的Nerf&#xff08;神经辐射场&#xff09;横空出世&#xff0c;据说只要用手机拍照&#xff0c;然后喂给模型&#xff0c;就可以生成3D模型了&#xff0c;我试过了&#xff0c;确有此事&#xff01; 那我们有想过&#xff0c;为什么可以从二维的图片里面获取物体三…...

你真的了解环形队列吗?(学习数据结构必须掌握的模型)

目录 0.前言 1. 什么是环形队列 2. 如何使用数组结构 / 链表结构 对环形队列封装 3. 代码手撕环形队列各个接口 3.1 代表封装一个环形队列 3.2 环形队列的初始化 3.3 环形队列的插入 3.4环形队列的删除 3.5环形队列的判空 3.6环形队列的判满 3.7环形队列的队头 3.8环…...

《痞子衡嵌入式半月刊》 第 72 期

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

对redis之键值型数据库的理解

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

Linux内核中的软中断、tasklet和工作队列

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

【Java】Spring Boot 2 集成 nacos

官方文档&#xff1a;https://nacos.io/zh-cn/docs/quick-start-spring-boot.html pom 本次Springboot版本 2.2.6.RELEASE&#xff0c;nacos-config 版本 0.2.7&#xff0c;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的新坑呢&#xff1f; 我从智能穿戴转行到芯片软件行业&#xff0c;从事编译器开发&#xff0c;不过是AI编译器。不过基本的传统编译器还是绕不过去啊&#xff0c;所以开始学习LLVM&#xff0c;后面开始学习TVM&#xff0c;MLIR。 LLVM GitHub地址 L…...

全网最经典函数题型【详解】——C语言

文章目录1. 写一个函数可以判断一个数是不是素数。2. 写一个函数判断一年是不是闰年。3. 写一个函数&#xff0c;实现一个整形有序数组的二分查找。4. 写一个函数&#xff0c;每调用一次这个函数&#xff0c;就会将 num 的值增加1。5. 写一个函数&#xff0c;打印乘法口诀表。6…...

emqx桥接配置+常见问题解决+jmeter压测emqx

一&#xff0c;桥接资源配置及规则配置 Emqx桥接配置流程 1&#xff0c;配置资源并测试连接通过 规则引擎——>资源——>新建——>选择MQTT Bridge——>填写参数测试连接 参数描述详见3.1资源配置 2&#xff0c;配置规则 2.1根据实际业务选择合适sql 规则引擎…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...