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

news2024/12/26 17:29:28

      • 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.coloradmin.cn/o/2265943.html

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

相关文章

Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用VA-I-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集VA-I-FGSM介绍相关定义算法流程 VAI-FGSM代码实现VAI-FGSM算法实现攻击效果 代码汇总vaifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对…

20241225在ubuntu20.04.5下监控SSD

20241225在ubuntu20.04.5下监控SSD 2024/12/25 20:29 参考资料: 百度:ubuntu查看ssd寿命 方法 1:使用「磁盘」工具监测 SSD 健康状态 sudo apt install gnome-disk-utility 方法 2:使用 smartctl 工具检查 SSD 健康状态 Ubuntu 和…

mvn install:install-file jar 打入本地仓库

安装指定文件到本地仓库命令:mvn http://install:install-file -DgroupId : 设置上传到仓库的包名 -DartifactId : 设置该包所属的模块名 -Dversion1.0.0 : 设置该包的版本号 -Dpackagingjar : 设置该包的类型(很显然jar包) -Dfile : 设置该jar包文件所在的路径…

CentOS下,离线安装vscode的步骤;

前置条件: 1.CentOS7; 步骤: 1.下载vscode指定版本,例如; 例如 code-1.83.1-1696982959.el7.x86_64.rpm 2.使用下面命令: sudo rpm -ivh code-1.83.1-1696982959.el7.x86_64.rpm 其他: 卸载vscode的命…

【CSS in Depth 2 精译_087】14.4:CSS 中的浮动特效以及在文字环绕中的应用 + 14.5:本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 14 章 蒙版、形状与剪切】 ✔️ 14.1 滤镜 14.1.1 滤镜的类型14.1.2 背景滤镜 14.2 蒙版 14.2.1 带渐变效果的蒙版特效14.2.2 基于亮度来定义蒙版14.2.3 其他蒙版属…

2025考研加油!Jing也加油哦!

一恍惚,离自己考研初试过去都两年了!研究生生活也过去一大半!借此机会也总结一下研究生这一段生活——研究生生活(上) About I 昨天实验室聚餐,作为老生欢迎新生,啊啊啊,真的没想到…

Flink调优----资源配置调优与状态及Checkpoint调优

目录 第 1 章 资源配置调优 1.1 内存设置 1.1.1 TaskManager 内存模型 1、内存模型详解 2、案例分析 1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源 1.2.1 使用 DefaultResourceCalculator 策略 1.2.2 使用 DominantResourceCalculator 策略 1.2.3 使用 DominantRes…

9. zynq应用开发--makefile编译

3. 使用SDK工具 如果只做 Linux 应用开发,只需要一个 sdk.sh 文件即可,可以脱离 Petalinux 和 Vitis,也可以编译其三方的应用,可以说一劳永逸。 配置根文件系统 petalinux-config -c rootfs 编译SDK petalinux-build --sdk Linu…

【ORB-SLAM3:相机针孔模型和相机K8模型】

在ORB-SLAM3中,相机的建模是 SLAM 系统的核心之一,因为它直接影响到如何处理和利用图像数据进行定位和地图构建。ORB-SLAM3 支持不同的相机模型,其中包括针孔模型和鱼眼模型(K8 模型)。下面分别介绍这两种模型。 相机…

element-plus在Vue3中开发相关知识

报错&#xff1a;error.mjs:20 ElementPlusError: [ElForm] model is required for resetFields to work. 原因&#xff1a;el-form使用v-model没有把内容绑定上&#xff0c;需要使用 :model 才可以校验 将&#xff1a; <el-form label-width"auto" class"…

HarmonyOS NEXT 实战之元服务:静态案例效果--- 日出日落

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

使用Vue的props进行组件传递校验时出现 Extraneous non-props attributes的解决方案

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;WebStorm 目录 出现错误的情况 报错&#xff1a; 代码&#xff1a; 报错截图 原因分析 解决方案 方法一 方法二 出现错误的情况 以下是我遇到该错误时遇到的报错和代码&…

基础运维学习计划-base版

目录 需要学习的内容&#xff1f; liunx基础 sql/mysql基础 tcp/ip协议基础 http基础 dns基础 网络基础&#xff1a;交换&路由概念&原理 常见网络协议 月学习计划 12.26 日 &#xff08;bilibili自己找视频看看&#xff0c;资源很多&#xff09; 12.27日 1…

亚信安全与方天股份达成战略合作,双向奔赴助力数字化转型

近日&#xff0c;亚信安全科技股份有限公司&#xff08;以下简称“亚信安全”&#xff09;正式与青岛方天科技股份有限公司&#xff08;以下简称“方天股份”&#xff09;签订合作框架协议。双方强强携手&#xff0c;在网络安全运营平台共建、信息化项目安全支撑、政企市场拓展…

117.【C语言】数据结构之排序(选择排序)

目录 1.知识回顾 2.分析 设想的思路 代码 执行结果 ​编辑 错误排查和修复 详细分析出错点 执行结果 3.正确的思路 4.其他问题 1.知识回顾 参见42.5【C语言】选择排序代码 点我跳转 2.分析 知识回顾里所提到的文章的选择排序一次循环只比一个数字,和本文接下来要…

画展在线上通过虚拟展厅展览,如何实现?有何好处?

画展在线上通过虚拟展厅展览的实现方式及好处可以归纳如下&#xff1a; 一、实现方式 1、技术基础&#xff1a; 虚拟现实&#xff08;VR&#xff09;技术&#xff1a;利用VR技术&#xff0c;观众可以佩戴VR设备身临其境地参观展厅&#xff0c;与展品进行直观互动。 三维建模…

WordPress Tutor LMS插件 SQL注入漏洞复现(CVE-2024-10400)

0x01 产品简介 WordPress Tutor LMS插件是一款功能丰富且强大的学习管理系统(LMS)插件,它专为WordPress平台设计,旨在帮助用户轻松创建、管理和销售在线课程。功能强大且易于使用的学习管理系统插件。它提供了完整的在线课程市场解决方案,帮助用户轻松创建、管理和销售在…

Spring源码_05_IOC容器启动细节

前面几章&#xff0c;大致讲了Spring的IOC容器的大致过程和原理&#xff0c;以及重要的容器和beanFactory的继承关系&#xff0c;为后续这些细节挖掘提供一点理解基础。掌握总体脉络是必要的&#xff0c;接下来的每一章都是从总体脉络中&#xff0c; 去研究之前没看的一些重要…

主流AI视频生成工具|Sora零基础入门指南

Sora是什么&#xff1f; Sora 是 OpenAI 推出的新一代 AI 视频生成工具。它能让用户通过简单的文本描述或图片提示&#xff0c;快速生成高质量的视频内容。无论是广告短片、创意视频&#xff0c;还是实验性艺术作品&#xff0c;Sora 都能帮助创作者以极低的门槛实现自己的想法。…

VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)

网址连接&#xff1a;http://118.25.110.213:5200/#/login 账号/密码&#xff1a;renxiaoyong 1、VUE3部署本地。 1.1本地安装部署node.js 1.2安装vue脚手架 npm install -g vue/cli # 或者 yarn global add vue/cli1.3创建本地项目 vue create my-vue-project1.4安装依赖和插…