当前位置: 首页 > 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 规则引擎…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...