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/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

命令行之巅:Linux Shell编程的至高艺术(中)

文章一览 前言一、输入/输出及重定向命令1.1 输入/输出命令1.1.1 read命令1.1.2 echo命令 1.2 输入/输出重定向1.3 重定向深入讲解1.4 Here Document1.4.1 /dev/null 文件 二、shell特殊字符和命令语法2.1 引号2.1.1 双引号2.1.2 单引号2.1.3 倒引号 2.2 注释、管道线和后台命令…

一文理解机器学习中二分类任务的评价指标 AUPRC 和 AUROC

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 在机器学习的二分类任务中,评估模型性能是至关重要的一步。两种常用的评价指标是 Precision-Recall Curve 下的面积 (AUPRC) 和 Receiver Operating Characteristic Curve 下的面积 (AUROC)…

Visual Studio Code(VS Code)配置C/C++环境

一、Visual Studio Code安装 Visual Studio Code,下文中简称为VS Code的详细安装方法请参考VSCode安装教程(超详细)-CSDN博客 二、MinGW编译器下载与配置 1、MinGW介绍 MinGW(Minimalist GNU for Windows)是一款用于Windows 平台的轻…

少儿编程在线培训系统:客户服务与学习支持

2.1 VUE技术 VUE它是由HTML代码,配上嵌入在HTML代码里面的Java代码组成的应用于服务器端的语言,使用VUE进行开发能够更加容易区分网页逻辑以及网页设计内容,让程序员开发思路更加清晰化,VUE在设计组件时,它是可以重用的…

uniapp Native.js原生arr插件服务发送广播到uniapp页面中

前言 最近搞了个设备,需求是读取m1卡,厂家给了个安卓原生demo,接入arr插件如下,接入后发现还是少了一部分代码,设备服务调起后触发刷卡无法发送到uniapp里。 中间是一些踩坑记录,最后面是解决办法&#xf…

C项目 天天酷跑(下篇)

上篇再博客里面有&#xff0c;接下来我们实现我们剩下要实现的功能 文章目录 碰撞检测 血条的实现 积分计数器 前言 我们现在要继续优化我们的程序才可以使这个程序更加的全面 碰撞的检测 定义全局变量 实现全局变量 void checkHit() {for (int i 0; i < OBSTACLE_C…

HarmonyOS NEXT 实战之元服务:静态案例效果--航空出行

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

福特汽车物流仓储系统WMS:开源了,可直接下载

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。欢迎大家到本文底部评论区留言。 近日&#xff0c;福特汽车公司推出了其广受好评的仓库管理系统GreaterWMS&#xff08;更大仓库管理系统&#xff09;的开源版本&#xff0c;意味着各行…

STM32完全学习——FLASH上FATFS文件管理系统

一、需要移植的接口 我们通过看官网的手册&#xff0c;可以看到我们只要完成下面函数的实现&#xff0c;就可以完成移植。我们这里只移植前5个函数&#xff0c;获取时间的函数我们不在这里移植。 二、移植接口函数 DSTATUS disk_status (BYTE pdrv /* Physical drive nmuber…

pyqt5冻结+分页表

逻辑代码 # -*- coding: utf-8 -*- import sys,time,copy from PyQt5.QtWidgets import QWidget,QApplication, QDesktopWidget,QTableWidgetItem from QhTableWidgetQGN import Ui_QhTableWidgetQGN from PyQt5.QtCore import Qt from PyQt5 import QtCore, QtGui, QtWidgets…

Windows 使用 非安装版MySQL 8

1.下载MySQL 8 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.40-winx64.zip 2.创建my.ini 下载解压后&#xff0c;发现根目录没有my.ini文件&#xff0c;需手动创建 my.ini # For advice on how to change settings please see # http://dev.mysql.com/doc/refma…

海外招聘丨 苏黎世联邦理工学院—机器学习在社会和政治科学中的应用博士后

雇主简介 苏黎世联邦理工学院是世界领先的科技大学之一。我们以优质的教育、尖端的基础研究和将新知识直接转化为社会而闻名。来自 120 多个国家的 30,000 多名学生认为我们的大学是一个鼓励独立思考和激励卓越的环境的地方。 我们位于欧洲中心&#xff0c;但与世界各地建立联…

微信小程序中遇到过的问题

记录微信小程序中遇到的问题&#xff08;持续更新ing&#xff09; 问题描述&#xff1a;1. WXML中无法直接调用JavaScript方法。2. css中无法直接引用背景图片。3. 关于右上角胶囊按钮。4. 数据绑定问题。5. 事件处理问题。 问题描述&#xff1a; 1. WXML中无法直接调用JavaSc…

idea 8年使用整理

文章目录 前言idea 8年使用整理1. 覆盖application配置2. 启动的时候设置编辑空间大小&#xff0c;并忽略最大空间3. 查询类的关系4. 查看这个方法的引用关系5. 查看方法的调用关系5.1. 查看被调用关系5.2. 查看调用关系 6. 方法分隔线7. 选择快捷键类型8. 代码预览插件9. JReb…

RAGFLOW使用笔记【更新ing】

0.引言 本文记录使用RAGFLOW的一些问题以及解决办法&#xff0c;它以笔记的形式存在&#xff0c;方便我以后回顾自己的学习工作。 1.RAGFLOW上传文件大小默认是128M,如何修改上传文件大小&#xff1f; 更新ragflow/docker/.env中的MAX_CONTENT_LENGTH 环境变量 然后同步更新…

ubuntu22.04安装PaddleX3

PaddleOCR 安装过程可以参考PaddleX本地安装教程 我的电脑环境配置&#xff1a; ubuntu22.04 cuda11.8&#xff08;之前安装的是12.4没有匹配的paddle-gpu;这里改成11.8&#xff09; 一、安装基础环境 1、 conda create -n ppx1 python3.10 2、 conda activate ppx1 3、…

Android 之 Activity 的启动模式(launchMode)

一、Activity 启动模式 在实际项目中&#xff0c;应该根据项目的实际需要来为每个 Activity 指定恰当的启动模式 launchMode。启动模式一共有四种&#xff0c;分别是 standard、singleTop、singleTask 和 singleInstance。可以在 AndroidManifest.xml 中通过给 <activity&g…

软件老化分析

软件老化 课程&#xff1a;软件质量分析 作业 解答 Python代码如下&#xff1a; n int(input("类别数&#xff1a;")) theta list(map(float, input("各个类别的权重&#xff1a;").split())) m list(map(int, input("各个类别的度量元数量&…

Jenkins 构建流水线

在 Linux 系统上安装 Jenkins 服务&#xff0c;以及配置自动化构建项目 前置准备环境&#xff1a;docker、docker-compose、jdk、maven 一、环境搭建 1. Jenkins 安装 &#xff08;1&#xff09;拉取镜像 # 安装镜像包&#xff0c;默认安装最新版本 docker pull jenkins/jen…

5G学习笔记之Non-Public Network

目录 0. NPN系列 1. 概述 2. SNPN 2.1 SNPN概述 2.2 SNPN架构 2.3 SNPN部署 2.3.1 完全独立 2.3.2 共享PLMN基站 2.3.3 共享PLMN基站和PLMN频谱 3. PNI-NPN 3.1 PNI-NPN概述 3.2 PNI-NPN部署 3.2.1 UPF独立 3.2.2 完全共享 0. NPN系列 1. NPN概述 2. NPN R18 3. 【SNPN系列】S…