TCP重传,滑动窗口,流量控制,拥塞控制
TCP重传,滑动窗口,流量控制,拥塞控制
TCP重传机制:
- 超时重传
- 快速重传
- SACK
- D-SACK
通过序列号与确认应答判断是否要重传
超时重传:
超过指定时间没有收到确认应答报文,就会重发该数据
触发超时重传的情况:
- 数据包丢失
- 确认应答丢失
RTT:数据发送时刻到接受到确认的时刻的差值 包的往返时间
RTO:超时重传时间
RTO太长或太短:
- 太长,效率差,重发慢,丢了半天才重发,性能差
- 太短:没有丢就重发,增加网络拥塞,导致更多的超时
超时重传时间RTO的值应该略大于报文往返RTT的值
如果超时重发的数据,再次超时的时候,又需要重传,TCP的策略是超时间隔加倍
也就是每次遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁发送
超时重传缺点:
超时周期长,用快速重传机制来解决
快速重传
不以时间为驱动,而是以数据驱动重传
当收到三个相同的ACK报文,会在定时器过期之前,重传丢失的报文段
缺点:不知道重传一个,还是重传所有的问题
于是有了SACK方法:选择性确认
在TCP头部加一个SACK,可以将已收到的数据的信息发送给发送方
这样就可以知道哪些数据接收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据了
相当于是快速重传知道了该重传一个还是全部
D-SACK
使用SACK来告诉发送方有哪些数据被重复接受了
D-SACK的作用:
- 可以让发送发知道,是发出去的包丢了,还是接收方回应的ACK包丢了
- 可以知道是不是发送方的数据包被网络延迟了
- 可以知道网络中是不是把发送发的数据包给复制了
滑动窗口:
上面的传输方式有一个缺点:数据往返时间越长,通信的效率就越低
窗口就是指无需等待确认应答,而可以继续发送数据的最大值
窗口实质上是一个缓存空间,发送发主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据,如果收到确认应答,此时数据就可以从缓存区清除
确认应答报文丢也没事,可以累计确认,累计应答
窗口大小:
通常是由接收方的窗口大小来决定的
否则接收方可能无法正常接收到数据
发送方的滑动窗口:
有四部分:
- 1 是已发送并收到ACK确认的数据
- 2是已发送但未收到ACK确认的数据
- 3 是未发送但总大小在接受方处理范围内
- 4是未发送但总大小超过接收方处理范围
当发送方把数据全部都发送出去,可用窗口3 为0 在未接到ACK之前无法发送数据
接收方的滑动窗口
三部分:
- 已经成功接受并确认的数据(等待应用进程读取)
- 未收到数据但可以接收的数据
- 未收到数据并不可以接受的数据
接收窗口和发送窗口的大小是相等的吗?
并不完全相等,接受窗口的大小约等于发送窗口的大小的
流量控制:
TCP提供一种机制可以让发送方根据接收方的实际接受能力控制发送的数据量,这就是所谓的流量控制
先发一部分比如80,再发一部分比如120,然后发送方的可用窗口为0了,然后等待80的确认报文,
操作系统缓冲区和滑动窗口的关系:
发送窗口和接受窗口中所存放的字节数,都是放在操作系统内存缓冲区中的,而操作系统的缓冲区,会被操作系统调整
为了避免丢包:TCP规定是不允许同时减少缓存又收缩窗口的,而是采用先收缩窗口,过段时间再减少缓存
当应用程序没有及时读取缓存时,发送窗口和接收窗口
根据流量控制,发送方随着接收方的窗口逐渐减小,直到最后两个窗口减小为0 窗口关闭
数据丢包的发生是因为:当服务器资源紧张的时候,操作系统直接减少了接收缓冲区的大小,这是应用程序无法及时读取缓存数据
TCP是通过让接收方指明 希望从发送方接受的数据大小(窗口的大小)来进行流量控制
如果窗口大小为0时,就会阻止发送方给接收方传递数据,知道窗口变成非0这就是窗口关闭
但是这里存在一个问题:如果接收方向发送方发送的窗口非0的ACK报文,丢失,那么会造成死锁
TCP如何解决窗口关闭时,潜在的死锁现象
TCP,为每一个连接设有一个持续定时器:只要TCP链接一方收到对方的零窗口通知,就启动计时器
这样即使是非0ACK丢失,计时器超时之后依然会发送窗口探测报文,相当于是双保险
糊涂窗口综合症:
如果接收方腾出几个字节并告诉发送方现在有几个字节的窗口,而发送方会义无反顾的发送这几个字节
相当于开公交车送1个人,造成资源的浪费
解决办法:接收方满足不通知小窗口给发送方,发送方开启Nagle算法(延时处理)
拥塞控制
避免「发送方」的数据填满整个网络。
拥塞窗口:发送方维持的一个状态,根据网络拥塞个程度动态变化的
变化规则:
- 只要网络中没有出现拥塞,cwnd就会增大
- 但是如果出现拥塞,cwnd就会减少
如何判断是否出现拥塞 :
只要发送了超时重传就认为出现了拥塞
拥塞控制的四个算法
- 慢启动
- 拥塞避免
- 拥塞发生
- 快速恢复
慢启动:一点一点提高发送的数据包
当发送方每收到一个ACK,拥塞窗口大小+1
20 21 22 23 24
1 2 4 8 16
当拥塞窗口的大小大于慢启动门限的时候使用拥塞避免算法
拥塞避免算法:
每当收到一个 ACK 时,cwnd 增加 1/cwnd
8 9 10 11 12
拥塞避免算法将指数增长变成线性增长
然后慢慢增长之后会出现拥塞,出现丢包,超时重传了
就进入了拥塞发生算法
当发生了「超时重传」,则就会使用拥塞发生算法。
直接开始慢启动,一夜回到解放前,并且更新慢启动门限
发生快速重传的拥塞发生算法:
拥塞窗口大小变为原来一半
进入快速恢复算法
还会维持在比较高的值,后续呈线性增长
相关文章:

TCP重传,滑动窗口,流量控制,拥塞控制
TCP重传,滑动窗口,流量控制,拥塞控制 TCP重传机制: 超时重传快速重传SACKD-SACK 通过序列号与确认应答判断是否要重传 超时重传: 超过指定时间没有收到确认应答报文,就会重发该数据 触发超时重传的情况…...

云手机对出海企业有什么帮助?
近些年,越来越多的企业开始向海外拓展,意图发掘更广阔的市场。在这过程中,云手机作为一个新型工具为很多企业提供了助力,尤其在解决海外市场拓展过程中的诸多挑战方面发挥着作用。 首先,云手机的出现解决了企业在海外拓…...

Android Studio实现简单的自定义钟表
项目目录 一、项目概述二、开发环境三、详细设计3.1、尺寸设置3.2、绘制表盘和指针3.3、动态效果 四、运行演示五、总结展望六、源码获取 一、项目概述 在安卓开发中,当系统自带的View已经无法满足项目需求时,就要自定义View。在Android中是没有与钟表有…...

C语言 举例说明循环嵌套
今天 我们来说循环的嵌套 如果一个循环体内 又包含了另一个循环结构 我们称之为循环的嵌套 我们之前学的 While do-while for 都可以进行相互的嵌套 如下图 在 While 循环语句中再嵌套一个 While 循环语句 do-while 中嵌套 do-while for中嵌套 for 例如 我们做一个九九乘法…...
一、ESP32基础知识
1、乐鑫产品线 系列特点ESP8266无ESP32无ESP32-S2无ESP32-C3无ESP32-S3无ESP32-C2/ESP8684无ESP32-C6无ESP32-H2无 2、开发方式 2.1、ESP-IDF (1)面向专业开发者。乐鑫官方开发框架,专门为ESP32系列芯片设计。支持C/C语言,并提供一套完整的API&#…...

我希望未来10年,人工智能可以帮我解决这4件小事
生活在一线大城市的我,现在几乎整天被大数据、人工智能、机器学习、智慧生活的词汇环绕立体包围着,让我时刻感觉到,再过10年,我们五一假期真的可以摆脱现在擦肩接踵的旅游盛况了。但我其实要求倒是没这么高,我真心希望…...

使用jdbc方式操作ClickHouse
1、创建测试表,和插入测试数据 create table t_order01(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert into t_order01 values …...

百面算法工程师 | 支持向量机——SVM
文章目录 15.1 SVM15.2 SVM原理15.3 SVM解决问题的类型15.4 核函数的作用以及特点15.5 核函数的表达式15.6 SVM为什么引入对偶问题15.7 SVM使用SGD及步骤15.8 为什么SVM对缺失数据敏感15.9 SVM怎么防止过拟合 欢迎大家订阅我的专栏一起学习共同进步 祝大家早日拿到offer&#x…...

关于YOLO8学习(一)环境搭建,官方检测模型部署到手机
一,环境的搭建 环境 win10 python 3.11 cmake pytorch pycharm 过程 首先安装好一个pycharm,这里就不一一叙述了。 其次,选择好一个python版本,是关键所在。有些YOLO的版本,并不支持很高的python版本,博主选用的是python3.11版本。经过实际的测试,这个版本比较合适。…...

3.10设计模式——Template Method 模版方法模式(行为型)
意图 定义一个操作中的算法骨架,而将一些步骤延迟到子类中,Template Method 使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 结构 AbstractClass(抽象类)定义抽象的原语操作,具体的子类将重定…...

SQL 基础 | UNION 用法介绍
在SQL中,UNION操作符用于合并两个或多个SELECT语句的结果集,形成一个新的结果集。 使用UNION时,合并的结果集列数必须相同,并且列的数据类型也需要兼容。 默认情况下,UNION会去除重复的行,只保留唯一的行。…...

学习如何使用PyQt5实现notebook功能
百度搜索“pyqt5中notebook控件”,AI自动生成相应例子的代码。在 PyQt5 中,QTabWidget 类被用作 Notebook 控件。以下是一个简单的示例,展示如何创建一个带有两个标签的 Notebook 控件,并在每个标签中放置一些文本。 import sys f…...
Python氮氧甲烷乙烷乙烯丙烯气体和固体热力学模型计算
🎯要点 🎯固体和粒子:计算二态系统、简谐振子和爱因斯坦固体的内能和比热,比较爱因斯坦固体和德拜固体。模拟多个粒子的一维和二维随机游走,在数值上确认方差的线性趋势,模拟多个粒子的梯度下降࿰…...
2024-04-30 区块链-以太坊-相关文档
摘要: 2024-04-30 区块链-以太坊-文档 以太坊-相关文档: https://github.com/ethereum/go-ethereum https://geth.ethereum.org/ https://geth.ethereum.org/docs https://ethereum.org/zh/ 以太坊开发文档 | ethereum.org 以太坊开发文档_w3cschool 以太坊开发文档 基础主题 …...
你用过最好用的AI工具有哪些?
你用过最好用的AI工具有哪些? 人工智能(AI)工具正在逐渐成为我们日常生活中不可或缺的助手,它们通过提供智能化服务,极大地提升了我们的工作效率和生活质量。以下是一些广泛使用的AI工具和应用,以及它们所…...

Amine-PEG-Amine,956496-54-1在生物成像、生物传感器等领域具有广泛的应用
【试剂详情】 英文名称 Amine-PEG-Amine,NH2-PEG-NH2 中文名称 氨基-聚乙二醇-氨基,氨基PEG氨基, 双端氨基聚乙二醇 CAS号 956496-54-1 外观性状 由分子量决定,液体或者固体 分子量 0.4k,0.6k,1k&…...
为什么深度学习中减小泛化误差称为“正则化(Regularization)”
深度学习的一个重要方面是正则化(Regularization),Ian Goodfellow在《Deep Learning 》称正则化(Regularization)就是减小泛化误差。那么,为什么减小泛化误差称为正则化呢? 首先看正则化——Re…...

【Linux网络编程】2.套接字、网络字节序、IP地址转换函数
目录 网络套接字 网络字节序 网络字节序和主机字节序的转换 IP地址转换函数 inet_pton 参数af 参数src 参数dst 返回值 inet_ntop 参数af 参数src 参数dst 参数size 返回值 网络套接字 socket,一个文件描述符指向一个套接字,该套接字内部…...

代码签名证书的工作原理和申请流程
随着软件分发渠道的多样化和黑客攻击手段的不断升级,确保软件的真实性和完整性变得尤为重要。这正是代码签名证书(Code Signing Certificate)发挥关键作用的领域。本文将深入探讨代码签名证书的基础概念、工作原理、重要性以及申请和使用流程…...
Python中的yield
文章目录 1. Python中的yield1.1 一个简单的示例1.2 示例的每一步含义 2. yield 和return的区别2.1 一个简单的示例2.2 示例中每一步的含义 3. yield中的send()方法3.1 一个简单的示例3.2 示例中每一步的含义 4. yield中的throw()方法4.1 一个简单的示例4.2 示例中每一步的含义…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...