计算机网络-------重传、TCP流量控制、拥塞控制

news2024/11/24 22:48:34

重传、滑动窗口、流量控制、拥塞避免

重传机制

超时重传

发送方在发送数据时会启动一个定时器,当超过指定的时间之后,还没接收到接收方的ACK确认应答报文,就会重传该数据

快重传

当发送方收到接收方三个连续的ack之后说明发送方发送的报文丢失了,此时发送方就重传该丢失报文

SACK

快重传出现的问题:因为出现三个连续相同的ACK确认报文之后会进行重传,但是我们只是重传三个连续ACK的那个报文尼?还是重传三个连续ACK报文之后的所有报文

  • 如果只是重传目前检测出来丢失的报文,假设我们这个丢失报文之后还有报文丢失,那么后面就又会出现三个连续ACK然后再进行重传
  • 如果重传的是丢失报文之后的所有报文,那么对于没丢失的报文,又会出现重复传输现象,浪费资源

所以有了SACK(选择性的ACK)即出现三次相同连续ACK后,会进行快重传,不同的时这三次发送的数据都会被存放在缓冲区中,然后只需要告知发送方我们接收到的数据范围就可以了,最后发送方就可以只发送丢失的数据部分

Duplicate SACK机制

相比于SACK机制来说其实就是能让发送方知道是因为发送放的丢包造成的重传还是因为接收方确认时的ACK报文丢包而产生的重传

Duplicate SACK是建立在SACK(选择性确认)的基础上的,

如果是发送方丢包:发送方收到三个相同的ACK进行快重传后,发送重传报文,如果重传的报文被ACK了说明是因为缺失数据导致重传的,重传的数据刚好补上窗口的范围,然后当丢包的报文是因为网络延迟导致的,后面再到达接收方,那么接收方会回复下一个ACK报文并且携带SACK重复提交报文范围给发送方

接收方ACK报文丢失:

发送方传数据报文丢失或者报文延迟:

滑动窗口:

主要由三个指针来维持

第一个指针之前表示:发送方已经发送并且收到了ack的数据

第一个指针到第二个指针表示:已经发送数据但是还没收到ack的数据

第二个指针到第三个指针表示:在窗口内的还没发送的数据

第三个指针之后的表示,不在窗口内,未发送的数据

流量控制

流量控制的核心

对于流量控制来说其实核心就是通过滑动窗口来完成的,其发送窗口发送的大小需要根据接收方可接受的窗口大小来制定,而接收方的滑动窗口是依赖于操作系统的所给的缓存的。接收方的窗口是基于接收方的实际情况来动态制定的,

  • 比如接收方这台服务器的处理数据能力,即当缓冲区(滑动窗口)中有数据比如接收方本来窗口长度为200,现接收到了100长度的数据,但是此时因为操作系统比较繁忙,所以只能处理40长度数据,那么可用的窗口就只有160了(如果处理的快,那么就还是200)
  • 比如现在服务器资源紧张只用给滑动窗口150的长度作为缓冲区,那么接收窗口的最大长度就只有150了
窗口关闭后可能带来的问题

什么叫窗口关闭:其实就是接收方此时没有能力接收数据了,就放松给发送方自己的滑动窗口可用大小为0,那么接收方就进入等待状态,等待接收方发下一个报文过来通知自己发送方有能力接收报文了,然后后续再进行传输数据

可能出现的问题:当接收方此时有能力接受数据了,此时发送相应的报文给发送方包括,期望收到的序列号(ACK报文),以及当前窗口的接收能力,但是此时这个报文丢包了,此时ACK报文丢包又不会进行超时重传,那么对于接收方来说会一直等待发送方发送数据,而对于发送放来说也一直在等待接收方发送报文来通知自己,就会造成死锁状态(双方都进行死等)

TCP解决窗口关闭的方法:

为了解决这种因为关闭窗口死锁问题,TCP会为每个连接设置一个计时器,当出现关闭窗口的时候(接收方的接收窗口长度为0的时候),就会启动定计时器,如果计时器超时了,发送方就会发送一个窗口探测报文,而对方在确认这个探测性报文的时候,会给出自己现在接收窗口的大小。

  • 如果发送过来的窗口大小还是0那么重置计时器,等到了规定的时间再重新发送探测性报文
  • 如果发送过来的接收窗口不为0,那么开始正常的接发数据

糊涂窗口综合症问题

是什么:其实就是接收方此时缓冲区滑动窗口中只有几个字节的空闲容量就将器窗口大小告知给发送方,然后发送方根据其窗口大小就直接传输数据,导致每次传输的有效数据只有几个字节,这是比较浪费资源的因为,对于有效数据的传输还需要给他加上一系列的头部,比如TCP、IP头部,最终只是传输几个字节,自然就比较浪费资源

造成的原因主要有如下两个:

  • 1、接收方通知发送方一个比较小的窗口
  • 2、发送方发送一个比较小的数据

根据造成的原因,解决方法如下(两个组合起来才能解决)

  • 1、让接收方不要通知一个小窗口给对方
    • 当接收方的窗口大小,小于(最大报文长度MSS,缓冲区大小的一半)时,就告知给发送方一个长度为0的接收窗口,等此时接收方的接收窗口大小大于最大报文长度或者大于缓冲区大小的一半时才告知发送方发送数据过来
  • 2、发送方避免发送效数据
    • 发送方主要采用Nagle算法:当满足下面两个条件是才进行发送数据给接收方
      • 条件一、发送方窗口大小和数据大小都大于MSS最大报文长度时
      • 条件二:收到之前数据的ack确认报文

综上TCP中解决糊涂窗口综合症是通过:接收方不发送小窗口+发送方使用Nagle算法来解决

拥塞控制

为什么要有拥塞控制

流量控制只是避免发送发的数据填满接收放的缓存,即考虑的只是个体,但是计算机网络是处于一个共享的环境中。因此也有可能因为其他主机的通信使得网络拥堵。(可以理解为车辆和公共交通)

网络拥堵时如果只是考流量控制来调节,那么势必频繁出现超时重传、大量丢包象限,会造成网络越来越拥堵,因此需要拥塞控制来进行协调

我的理解是流量控制偏向于控制个体,而拥塞控制则偏向于宏观调控

整体调控图(重要)

注意这里的窗口大小指的是MSS即最大报文长度

只要看懂这个图其实就理解了拥塞控制的核心了

TCP刚建立连接后

  • 进行慢启动算法:即每收到一个ACK,拥塞窗口cwnd就+1,因此拥塞窗口cwnd会成指数形式增加
  • 当cwnd>=慢启动门限ssthresh时切换为拥塞避免算法,即拥塞窗口大下增速将为每次增加1,成线性增长
  • 然后如果过程中出现了超时重传,那么说明网络出现了拥塞,那么执行如下操作
    • 将慢启动门限ssthresh设置为当前拥塞窗口cwnd的一半
    • 然后将拥塞窗口cwnd置为1
    • 最后使用慢启动算法控制拥塞窗口cwnd
  • 接着如果过程中出现了三个连续的ACK,执行快恢复算法:
    • 首先将慢启动门限ssthresh设置为当前窗口的一般
    • 并且将拥塞窗口cwnd也设置为原来拥塞窗口的一半+3(收到几个重复的ACK就加几)
    • 让后当收到了新的ACK的时候说明丢包数据重传接收成功,那么重新将当前窗口设置为刚才设置的慢开始门限大小,
    • 最后执行拥塞避免算法

其中自己额外的理解:

对于慢启动来说:其实就是连接刚开始时为了较为快速的增加调整拥塞窗口大小的作用,因为连接刚建立其实可以认为网络比较通畅

然后打到一个阈值(慢启动门限)后就将原来指数级增长进行降速使用拥塞避免来进行线性增长,去试探当前网络的极限(慢慢试探的感觉)
然后如果网络中出现了较为严重的拥塞阻塞,比如出现了超时重传而发送方收到了三个重复的ACK,那么就直接大幅度按调整拥塞窗口大小

而如果收到的是三个连续的ACK那么就说明虽然出现了丢包现象,当时还能收到重复的ACK,可以说明其实网络并不是特别拥堵,所以使用快恢复算法进行调节

而对于快恢复中每收到一个重复的ACK,拥塞窗口大小就+1,我的理解是因为,重复的ACK已经收到了,相当于这条信息已经从网络中移除了,那么就再增加窗口大下,然后当收到新的ACK后那么就开始正常的拥塞避免来进行控制

慢开始

慢启动其实就是TCP在刚建立连接之后,首先有个慢启动过程,其实就是一点一点的提高发送数据包的数量

核心规则:就是每收到一个ack就增加一个发送请求,拥塞窗口cwnd就+1

比如:

第一批请求个数为1

第二批请求个数为2:(因为收到第一批的ACK,然后每收到一个ACK拥塞窗口+1)

第三批请求个数为4:。。。。。

拥塞窗口大小成指数形式增加

指数形式增加增速很快,如果一直下去很快就会造成网络拥堵,所以当拥塞窗口cwnd>=慢启动门限ssthresh时就切换为拥塞避免算法

一般的慢启动门限大小一般时65535个字节(2^16)

拥塞避免算法

当拥塞窗口cwnd 超过慢启动门限ssthresh就会进入拥塞避免算法。
一般来说ssthresh的大小 65535字节。
那么进入拥塞避免算法后,它的规则是:每当收到一个ack时,cwnd增加1/cwnd.
接上前面的慢启动的栗子,现假定ssthresh为8

  • 当8个ack应答确认到来时,每个确认增加1/8,8个ack确认cwnd一共增加1,于是这一次能够
    发送9个mss大小的数据,变成了线性增长。
拥塞发生

当网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种

  • 超时重传
  • 快速重传

这两种使用的拥塞发送算法是不同的,接下来分别来说说。

  • 发生超时重传的拥塞发生算法:当发生了超时重传,则就会使用拥塞发生算法。ssthresh和cwnd的值会发生变化:
    • ssthresh设为cwnd/2
    • cwnd重置为1(是恢复为cwnd初始化值,我这里假定cwnd初始化值1)

  • 发生快速重传的拥塞发生算法
    还有更好的方式,当接收方发现丢了一个中间包的时候,发送三次前一个包的ack,于是发送端就会快速地重传,不必等待超时再重传。
    Tcp认为这种情况不严重,因为大部分没丢,只丢了一小部分,则sthresh和cmnd ssthresh和cwnd变化如
    • cwnd-cwnd/2,也就是设置为原来的一半;
    • ssthresh=cwnd
    • 进入快速恢复算法

快恢复:
    • 首先将慢启动门限ssthresh设置为当前窗口的一半
    • 并且将拥塞窗口cwnd也设置为原来拥塞窗口的一半+3(收到几个重复的ACK就加几)
    • 让后当收到了新的ACK的时候说明丢包数据重传接收成功,那么重新将当前窗口设置为刚才设置的慢开始门限大小,
    • 最后执行拥塞避免算法

 目前已更新系列:

当前:计算机网络-------重传、TCP流量控制、拥塞控制

实习期间git的分枝管理以及最常用的命令-CSDN博客

Redis高级-----持久化AOF、RDB原理

Redis高级---面试总结5种数据结构的底层实现

Redis高级----主从、哨兵、分片、脑裂原理-CSDN博客

Redis高级---面试总结内存过期策略及其淘汰策略

计算机网络--面试知识总结一

计算机网络-----面试知识总结二

计算机网络--面试总结三(Http与Https)

计算机网络--面试总结四(HTTP、RPC、WebSocket、SSE)-CSDN博客

知识积累之ThreadLocal---InheritableThreadLocal总结

并发编程之----线程池ThreadPoolExecutor,Excutors的使用及其工作原理

声明:这里的知识总结是参考学习:详细学习可参考4.2 TCP 重传、滑动窗口、流量控制、拥塞控制 | 小林coding (xiaolincoding.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝牙模块(BT04/HC05)

目录 一、介绍 二、模块原理 1.原理图与外形尺寸 2.引脚描述 3.蓝牙模块基础AT指令介绍 三、程序设计 usart3.h文件 usart3.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 BT04A是一款蓝牙低功耗(Bluetooth Low Energy, BLE)模块&…

华为OD机试 - 奖牌榜排名(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

Python面向对象编程:属性和方法②

文章目录 一、什么是属性和方法1.1 属性1.2 方法 二、定义和使用属性2.1 定义实例属性2.2 访问和修改实例属性2.3 定义类属性2.4 访问和修改类属性 三、定义和使用方法3.1 定义实例方法3.2 调用实例方法3.3 定义类方法3.4 调用类方法3.5 定义静态方法3.6 调用静态方法 四、综合…

ChatGPT背景下,高职人工智能技术应用专业的人才培养

一、引言 ChatGPT,即聊天生成预训练变换器,由美国OpenAI公司开发,自2022年11月首次亮相以来,已成为人工智能领域的一个标志性成就。这款聊天机器人利用先进的人工智能技术,处理自然语言,能够精准把握用户的…

【实战教程】SpringBoot全面指南:快速上手到项目实战(SpringBoot)

文章目录 【实战教程】SpringBoot全面指南:快速上手到项目实战(SpringBoot)1. SpringBoot介绍1.1 SpringBoot简介1.2系统要求1.3 SpringBoot和SpringMVC区别1.4 SpringBoot和SpringCloud区别 2.快速入门3. Web开发3.1 静态资源访问3.2 渲染Web页面3.3 YML与Properti…

ctf.bugku - 本地管理员

题目来源:本地管理员 - Bugku CTF 访问页面 页面的最后返回一个字符串; 结尾 应该是base64 编码; 解码得到 test123 同时,提示信息还有 IP禁止访问,本地管理员登陆; 所以,请求头添加&#x…

“欢迎”相关英语表达柯桥成人商务英语口语学习到蓝天广场

1.某地的欢迎标语 说到欢迎,小编想起了江苏的欢迎标语。 这则标语把“江苏欢迎您”,翻译成了“Jiangsu welcomes you”。 不少小伙伴都觉得这样翻译不对,“欢迎您来某某地方”,应该翻译成“Welcome to XX”。 但其实,一…

超声波气象监测站的工作原理

TH-CQX5超声波气象监测站,顾名思义,是一种通过超声波技术实现气象数据监测的设备。这种监测站的设计理念充分利用了超声波在空气中传播的特性,能够高效、准确地测量风速、风向、温度、湿度等气象要素。超声波气象监测站的构造简洁而高效&…

华为OD机试 - 银行插队 - 队列(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…

前端vue-安装pinia,它和vuex的区别

创建一个store的目录,任意一个js文件,再导入pinia,再定义

想走?可以!先买票——迭代器模式

文章目录 想走?可以!先买票——迭代器模式乘车买票,不管你是谁!迭代器模式迭代器实现Java的迭代器实现迭代高手 想走?可以!先买票——迭代器模式 乘车买票,不管你是谁! 时间&#…

【2024版】最新kali linux入门及常用简单工具介绍(非常详细)零基础入门到精通,收藏这一篇就够了_kalilinux

一、介绍 kali Linux Kali Linux 是一个基于 Debian 的 Linux 发行版,主要用于数字取证和渗透测试。它预装了大量的安全审计和渗透测试工具,被广泛应用于网络安全领域。 (一)特点 工具丰富:集成了数百种用于渗透测试…

越差越好?为什么简单反而赢了,这背后究竟有什么秘诀?

你有没有发现,软件界里那些最成功的产品,往往并不是最复杂、最强大的?我们用的很多东西,看起来功能普通,甚至有些粗糙,但就是这样简陋的设计,反而成了市场上的赢家。 也许你玩过Flappy Bird这个游戏:它的设计非常简单,玩家只需要点击屏幕让小鸟飞行,避开管道障碍。游…

知名开发工具RubyMine全新发布v2024.2——增加浏览器保护的代码洞察

RubyMine 是一个为Ruby 和 Rails开发者准备的 IDE,其带有所有开发者必须的功能,并将之紧密集成于便捷的开发环境中。 立即获取RubyMine v2024.2正式版 具体更新详情如下: Rails 对Kamal配置文件的补全 RubyMine现在为 Kamal 配置文件提供…

代码随想录算法训练营Day28 | 39. 组合总和、40.组合总和Ⅱ、131.分割回文串

目录 39. 组合总和 40.组合总和Ⅱ 131.分割回文串 39. 组合总和 题目 39. 组合总和 - 力扣(LeetCode) 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不…

Pytorch实现CNN实验

一、实验要求 用 python 的 Pytorch模块实现卷积神经网络。网络结构为一个输入层、两个卷积层、一个全连接层、一个输出层。 二、实验目的 实现一个包含卷积层、池化层和全连接层的卷积神经网了解如何在训练数据集上使用反向传播算法和Adam优化算法训练神经网络。加深对卷积…

国外电商系统开发-运维系统文件上传-高级上传

如果您要上传文件到10台服务器中,有3台服务器的路径不是一样的,那么在这种情况下您就可以使用本功能,单独执行不一样的路径 点击【高级】上传

雷池+frp 批量设置proxy_protocol实现真实IP透传

需求 内网部署safeline,通过frp让外网访问内部web网站服务,让safeline记录真实外网攻击IP safeline 跟 frp都部署在同一台服务器:192.168.2.103 frp client 配置 frpc只需要在https上添加transport.proxyProtocolVersion "v2"即…

【星汇极客】STM32 HAL库+CubeMX开发之用户代码规范(持续更新)

前言 本人是一名嵌入式学习者,在大学期间也参加了不少的竞赛并获奖,包括:江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

ComfyUI 实战教程:古人画像变真人

最近看到一种古画变真人的效果,就是将书上的古人画像重绘为真人,效果炸裂,不敢独享,特别分享给大家。 效果演示 废话不多说,还是先看效果。大家可以猜猜它们都是谁~ 使用方法 这个方法在 Stable Diffusi…