tcp 的重传,流量控制,拥塞控制

      • tcp 的重传
        • 解决了什么问题
        • tcp的几种重传机制分别解决什么问题?
          • 方案 1: 超时重传
          • 方案2: 快速重传
          • 选择性确认(sack)
          • d-sack(重复接收)
        • 滑动窗口:
          • 累计应答
      • 流量控制
          • 解决什么问题?
          • 如何做的?
          • 问题1: 那如果第一次发送的数据都大于缓冲区的大小怎么办?
          • 问题2: 如果剩余大小为0会发生什么?
            • 问题: 如果返回的ack丢失了会发生什么?
            • 如何解决死锁的问题?
          • 问题3: tcp 的报文头有 40 字节,如果收到的窗口大小是 1 字节会发生什么?
            • 如何解决?
      • 拥塞控制
          • 解决什么问题?
        • 如何做?
          • 慢启动状态(试探网络压力的上限)
          • 阻塞避免(超过门限)
          • 阻塞发生

tcp 的重传

解决了什么问题

tcp 作为可靠的传输层协议,要确保每一个包都能被接收端收到.
如果有数据包在传输中丢失了怎么办?

如果有数据包丢失就需要重传数据包.
但是如何判断一个数据包是否丢失了呢?

tcp的几种重传机制分别解决什么问题?

如何设计一个重传机制?

方案 1: 超时重传
  1. 每传输一个包等待接收方返回 ack.
  2. 设置一个超时时间,超过超时时间还没有收到返回的,就任务丢包了要重传

问题1: 效率太慢了,每次都要等接收方返回 ack 才传输下一个

问题2: 超时时间太长与太短的问题
太长: 等待的时间就,传输效率低
太短: 太容易过期,包的重传率上升,无端消耗网络带宽

所以超时时间是一个动态的值,与网络的延时有关

方案2: 快速重传

要解决的问题: 超时重传的效率低,可以在超时重传的基础上进行升级:

升级:
接收方每次收到数据返回 ack 的时候带上下一个的编号
发送方如果连续收到 3 次相同的 编号,则判断为改数据丢包
就需要重传该数据

优点: 不需要等到每个包收到 ack 再传输下一个,提高了网络传输的效率

问题: 不知道具体哪些数据丢包了,也就是不知道传一个包还是传后面所有的包
传一个包: 假设发送了 1,2,3,4,5,6,7 包, 1 包接受到了,2,3,4 都没有收到,那么一个个重传就需要重传 3 次,效率太低
传后面所有的包:假设发送了 1,2,3,4,5,6,7 包, 1 包接受到了,只有2没有收到,那么 3,4,5,6,7 包就重复传输了,增加了网络的压力

选择性确认(sack)

要解决的问题: 快速恢复中到底传哪些包的问题(哪些包丢失的问题)
升级:
我们在 ack 的后面再加上一个已经接受到的包的编号(sack),这样发送方接收到ack 信息就知道哪些包已经收到了哪些包没有收到,就可以针对没有收到的包重传,不需要重传所有,与一个个重传

判断是否要重传的原理与快速重传相同

问题: 有的包可能并没有丢失,而是因为网络延时阻塞了,当我们重传之后,接收方又收到了网络中阻塞的包,就会收到重复的数据

d-sack(重复接收)

解决的问题: 哪些包是因为网络延时的问题重传(重复接受)/哪些包被复制了.
小于 ack 编号的 sack 就是重复接收的包,这些包是由于网络延迟太高/包在网络中被复制了导致的重复接收.

滑动窗口:

滑动窗口简单理解就是为了解决每一个包传输要接受到 ack 后再传下一个的效率太慢的问题,如果中途的 ack 丢包了,岂不是要重传,导致性能浪费.

基本原理:
发送方与接收方都有一个缓存区(窗口)
发送方的缓冲区: 存放已发送但没有收到 ack 的数据
接收方的缓冲区: 存放准备接受的数据(没收到)

这样就可以同时发送多个包了

累计应答

假设发送了 1,2,3,4,5,6,7 都 包, 前面 6 个包都没有收到,但是后面有一个 ack 7 证明包 1~6 都已经收到了,只是前面的 ack 丢包了. 就不需要重传了

解决的问题: ack 丢包重传的性能浪费.

流量控制

解决什么问题?
  • 解决接收端对包的处理能力有限,超过限度会丢包重传,加大网络压力的问题

流量控制: 就是让**「发送方」根据「接收方」的实际接收能力控制发送的数据量**

如何做的?

接收端有一个缓冲区,发送端发送的数据先会读到缓冲区中,然后再做处理

逻辑:
每次接受端发送 ack的时候都带上缓冲区的剩余大小,那么发送端读取到剩余大小,发送数据的数量就不会超过这个大小

问题1: 那如果第一次发送的数据都大于缓冲区的大小怎么办?

拥塞控制原理中数据传输开始是慢启动的,只发送 1mss 的大小,所以不会超

问题2: 如果剩余大小为0会发生什么?

按照上面的逻辑,如果剩余大小为 0,那么就不会发送数据,而是等接收方处理数据然后返回一个窗口大于 0 的 ack,这样就可以继续传输数据了

问题: 如果返回的ack丢失了会发生什么?

发送方不知道接收方可以发送数据了,而接受方也不知道发送方没收到 ack,就 造成了一种死锁的状态,没有数据和传输,卡死了.

如何解决死锁的问题?

当发送方收到的ack 的窗口大小为 0 时:
每过一段时间(启动计时器)问一下(发送探测报文)发送端是否可以接受数据了,而不是坐以待毙.

问题3: tcp 的报文头有 40 字节,如果收到的窗口大小是 1 字节会发生什么?

小窗口问题(糊涂窗口综合症)
当窗口较小时数据的有效传输就会非常低(当只有 41 字节的窗口,一次发送有效传输的数据只有一字节)这好比一列高铁只载了1 个人.并且接收端还要解析报文头,报文越多,效率越低.

如何解决?
  1. 小窗口时先返回 ack 的窗口为0,等窗口变大(当「窗口大小」小于 min( MSS,缓存空间/2),也就是小于 MSS 与 1/2 缓存大小中的最小值时,就会向发送方通告窗口为 0,也就阻止了发送方再发数据过来。)了再返回大的窗口

  2. 发送方保证可以发送的数据>=mss,如果小于则等待(接收方处理数据并返回 ask )大于的时候再发送.

拥塞控制

解决什么问题?

流量控制只是根据接收方的能力决定发送数据的速度,但是网络带宽是有限的,如果发送的数据超过了带宽的上限,就会出现大量的丢包与重传,而重传又会增加额外的网络负担,导致更多的丢包

所以当网络压力大时需要发送方自动的降低数据发送的效率,避免丢包重传导致的网络压力激增.

如何做?

核心思想是如何判断当前的网络压力状况?
判断的依据是丢包与超时(如果路由器的发送队列满了(压力大)再收到包就会丢掉)

  • 丢包是收到ack 中有缺少的包
  • 超时是收不到返回的 ack
慢启动状态(试探网络压力的上限)
  • 启动时的状态,先从 1mss 开始发送,指数级递增(1,2,4,8…)

  • 问题: 网络带宽是有限的,如果一直不断的增加一定会讲网络打爆

  • 解决方案: 设置门限,当超过门限就不再指数级递增

  • 问题: 门限是多少,由什么决定?

  • 一般来说大小是 65535 字节。

阻塞避免(超过门限)
  • 超过门限增加的速度就会变慢

  • 问题:多慢?

  • 每当收到一个 ACK 时,cwnd 增加 1/cwnd.

阻塞发生

需要判断当前网络情况:

  1. 丢包: 重复收到三个相同的 ack 表示有丢包的情况(阻塞不严重)

    • 快速恢复(重传丢的包)
    • 设置新门限=当前速度的一半
    • 减速:速度降为当前速度的一半
    • 进入阻塞避免阶段
  2. 超时: 超过过期时间没有收到 ack (阻塞很严重,已经收不到数据了)

    • 减速: 将速度降到1mss, 进入慢启动阶段
    • 重传超时的包.

参考:
https://www…com/network/3_tcp/tcp_feature.html#%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3
https://zhuanlan.zhihu.com/p/37379780
https://juanha.github.io/2018/05/05/tcp/

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis+注解实现限流机制(IP、自定义等)

简介 在项目的使用过程中,限流的场景是很多的,尤其是要提供接口给外部使用的时候,但是自己去封装的话,相对比较耗时。 本方式可以使用默认(方法),ip、自定义参数进行限流,根据时间…

010 Qt_输入类控件(LineEdit、TextEdit、ComboBox、SpinBox、DateTimeEdit、Dial、Slider)

文章目录 前言一、QLineEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一:用户登录界面5.示例二:验证两次输入的密码是否一致显示密码 二、TextEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一:获取多行输入框的内容5.示例二&#x…

RabbitMQ 的7种工作模式

RabbitMQ 共提供了7种⼯作模式,进⾏消息传递,. 官⽅⽂档:RabbitMQ Tutorials | RabbitMQ 1.Simple(简单模式) P:⽣产者,也就是要发送消息的程序 C:消费者,消息的接收者 Queue:消息队列,图中⻩⾊背景部分.类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从其中取出消息…

WebAPI编程(第一天,第二天)

WebAPI编程(第一天,第二天) day01 - Web APIs 1.1. Web API介绍 1.1.1 API的概念1.1.2 Web API的概念1.1.3 API 和 Web API 总结 1.2. DOM 介绍 1.2.1 什么是DOM1.2.2. DOM树 1.3. 获取元素 1.3.1. 根据ID获取1.3.2. 根据标签名获取元素1.3.…

java如何使用poi-tl在word模板里渲染多张图片

1、poi-tl官网地址 http://deepoove.com/poi-tl/ 2、引入poi-tl的依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>3、定义word模板 释义&#xf…

web三、 window对象,延时器,定时器,时间戳,location对象(地址),本地存储-localStorage,数组去重new Set

一、window对象 window对象 是一个全局对象&#xff0c;也可以说是JavaScript中的 顶级对象 像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都是window的 所有通过 var定义 在全局作用域中的 变量 、 函数 都会变成window对象的属…

利用Spring Cloud Gateway Predicate优化微服务路由策略

利用Spring Cloud Gateway Predicate优化微服务路由策略 一、Predicate简介 Spring Cloud Gateway 是 Spring 生态系统中用于构建 API 网关的框架&#xff0c;它基于 Project Reactor 和 Netty 构建&#xff0c;旨在提供一种高效且灵活的方式来处理 HTTP 请求和响应。 Spring …

C#代码实现把中文录音文件(.mp3 .wav)转为文本文字内容

我们有一个中文录音文件.mp3格式或者是.wav格式&#xff0c;如果我们想要提取录音文件中的文字内容&#xff0c;我们可以采用以下方法&#xff0c;不需要使用Azure Speech API 密钥注册通过离线的方式实现。 1.首先我们先在NuGet中下载两个包 NAudio 2.2.1、Whisper.net 1.7.3…

CASA(Carnegie-Ames-Stanford Approach) 模型原理及实践

植被作为陆地生态系统的重要组成部分对于生态环境功能的维持具有关键作用。植被净初级生产力&#xff08;Net Primary Productivity, NPP&#xff09;是指单位面积上绿色植被在单位时间内由光合作用生产的有机质总量扣除自养呼吸的剩余部分。植被NPP是表征陆地生态系统功能及可…

申请腾讯混元的API Key并且使用LobeChat调用混元AI

申请腾讯混元的API Key并且使用LobeChat调用混元AI 之前星哥写了一篇文章《手把手教拥有你自己的大模型ChatGPT和Gemini等应用-开源lobe-chat》搭建的开源项目&#xff0c;今天这篇文章教大家如何添加腾讯云的混元模型&#xff0c;并且使用LobeChat调用腾讯混元AI。 申请腾讯混…

alertmanager告警持久化方案:alertsnitch

Prometheus告警记录持久化 Prometheus将基于告警规则生成的告警存储为时间序列&#xff0c;不会将Alertmanager的告警信息持久化存储&#xff0c; 那么针对历史告警的检索、统计等需求就无法实现。因此需要一种持久化机制用于存储历史告警信息&#xff0c; 本文主要探究基于al…

springboot481基于springboot社区老人健康信息管理系统(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统社区老人健康信息管理系统信息管理难度大&#xff0c;容错…

109.【C语言】数据结构之求二叉树的高度

目录 1.知识回顾&#xff1a;高度&#xff08;也称深度&#xff09; 2.分析 设计代码框架 返回左右子树高度较大的那个的写法一:if语句 返回左右子树高度较大的那个的写法二:三目操作符 3.代码 4.反思 问题 出问题的代码 改进后的代码 执行结果 1.知识回顾&#xf…

重温设计模式--享元模式

文章目录 享元模式&#xff08;Flyweight Pattern&#xff09;概述享元模式的结构C 代码示例1应用场景C示例代码2 享元模式&#xff08;Flyweight Pattern&#xff09;概述 定义&#xff1a; 运用共享技术有效地支持大量细粒度的对象。 享元模式是一种结构型设计模式&#xff0…

Pytorch | 从零构建EfficientNet对CIFAR10进行分类

Pytorch | 从零构建EfficientNet对CIFAR10进行分类 CIFAR10数据集EfficientNet设计理念网络结构性能特点应用领域发展和改进 EfficientNet结构代码详解结构代码代码详解MBConv 类初始化方法前向传播 forward 方法 EfficientNet 类初始化方法前向传播 forward 方法 训练过程和测…

【教程】第十一章 子任务 工时——化繁为简

小伙伴们&#xff0c;终于迎来了新章节&#xff01;随着业务的扩展&#xff0c;任务越来越多&#xff0c;越来越复杂&#xff0c;我们逐渐意识到&#xff0c;简单的任务管理已经不够用了。现在&#xff0c;我们需要对任务进行更细致的管理&#xff0c;分解成多个层级&#xff0…

git clone必须使用sudo否则失败 git推送错误想再次编辑和推送

git clone必须使用sudo否则失败 我的问题比较特别用env | grep -i proxy发现没问题所幸直接删掉~/.ssh下的秘钥&#xff0c;重新弄 搭建SSH秘钥方法: &#xff08;一&#xff09;配置git 操作&#xff1a;linux镜像--桌面--右键--打开终端。 > git config --global user.n…

Docker搭建kafka环境

系统&#xff1a;MacOS Sonoma 14.1 Docker版本&#xff1a;Docker version 27.3.1, build ce12230 Docker desktop版本&#xff1a;Docker Desktop 4.36.0 (175267) 1.拉取镜像 先打开Docker Desktop&#xff0c;然后在终端执行命令 docker pull lensesio/fast-data-dev …

Java复习|图形用户界面AWT、Swing----银行客户管理系统【校课版】【1】

校课总结&#xff0c;部分&#xff0c;未完待续...... 背景了解 Java的AWT和Swing的现状 AWT&#xff08;Abstract Window Toolkit&#xff09; AWT是Java中最早期的图形用户界面&#xff08;GUI&#xff09;工具包&#xff0c;它直接与操作系统提供的图形函数进行交互&a…

cudnn版本gpu架构

nvcc --help 可以看 --gpu-architecture 写到的支持的架构 NVIDIA 的 GPU 架构是按代次发布的&#xff0c;以下是这些架构的对应说明&#xff1a; NVIDIA Hopper: 这是 NVIDIA 于 2022 年推出的架构之一&#xff0c;面向高性能计算&#xff08;HPC&#xff09;和人工智能&…