【TCP】流量控制和拥塞控制

图片

前言

TCP(传输控制协议)是互联网协议(IP)网络传输层协议,负责控制数据包的顺序和流量控制,以防止网络拥塞和数据丢失。TCP流量控制和拥塞控制是确保网络有效通信的重要机制。具体分析如下:

流量控制:主要目的是防止发送方发送数据过快,导致接收方无法及时处理而引起数据丢失。它通过滑动窗口机制来实现,即发送方维护一个发送窗口,该窗口大小取决于接收方的接收能力,以确保接收方能够及时处理到达的数据。

拥塞控制:目标是避免因网络中过多的数据而导致的网络拥塞情况,它影响整个网络的性能。拥塞控制通常包括慢启动、拥塞避免、快重传和快恢复算法。这些算法共同工作以适应网络拥塞的变化,并动态调整数据的发送速率。

总的来说,在数据传输过程中,这两种控制机制协同工作,既保证了接收方能够有效地处理数据,又避免了网络资源的过度使用,从而提升了整个网络的传输效率和稳定性。

流量控制

流量控制是计算机网络中的一种机制,用于控制发送方的数据发送速率,以便接收方能够及时处理接收到的数据。其主要目的是防止发送方发送数据过快,导致接收方缓冲区溢出,从而避免数据丢失。

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP通信过程中,发送方和接收方需要通过流量控制来协调数据传输速率。流量控制的必要性在于,接收方的处理能力有限,如果发送方发送数据过快,接收方可能无法及时处理,导致数据丢失或延迟。

TCP使用滑动窗口机制来实现流量控制。

滑动窗口机制的工作原理

  1. 发送方和接收方分别维护一个窗口,表示当前可以发送或接收的数据量。

  2. 发送方根据接收方的窗口大小来调整自己的发送窗口,确保不会超过接收方的处理能力。

  3. 当接收方处理完一部分数据后,会向发送方发送确认报文(ACK),并更新自己的接收窗口大小。

  4. 发送方收到确认报文后,会更新自己的发送窗口,并根据新的窗口大小继续发送数据。

为了避免数据丢失,TCP还采用了以下策略:

  • 使用序号和确认机制,确保数据的有序传输和可靠到达。

  • 使用超时重传机制,当发送方在一定时间内没有收到确认报文时,会重新发送未被确认的数据。

举例子,假定A和B的初始序列号都为0,A每次发送1024字节的数据给B,B的window size = 4096。

对于A来说可以直接发送4个数据包如下:

图片

正常的情况下发送效率得到了提升。

现在来看看丢包的情况下超时重传是怎么处理的:

数据包丢失

图片

假设第一个数据包P1(1~1024)丢包,由于窗口的原因,发送方会继续发送P2(1025,2048),接收端并不会返回P2的确认,返回的数据包的ACK依然是1,这表示:“喂,发数据的,别往后发了,你第 个1 字节开始的数据还没来呢”,后面两个包依然如此,当连续收到三次确认之后,发送方会意识到:“对方还没有接收到数据,这个包需要重传”。

因此,引入窗口的概念后,被发送的数据不能立刻丢弃,需要缓存起来以备将来需要重发。

确认包丢失

对于确认包丢失就更简单了,假设对P1的ACK=1025的确认包丢失,没关系,可以通过下一个确认包来进行确认,接下来收到的ACK=2049,意味着2049只之前的数据都被接收端确认了,也就不需要重传了。

窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。

发送窗口

图片

M为发送窗口大小。

接收窗口

图片

N为返回给发送端窗口大小,O为接收端窗口大小。

流量控制是为了避免发送方发送数据太快,以致TCP接收方不能可靠地接收和处理数据。

TCP的流量控制由滑动窗口来实现的,滑动窗口控制流量取决于接收方的窗口大小。

以下是使用Java实现滑动窗口机制的示例代码:

class SlidingWindow {  
    private int windowSize; // 窗口大小  
    private int windowStart; // 窗口起始位置  
    private Queue<Integer> window; // 窗口中的数据包  
    private int packetCount; // 数据包数量  
  
    public SlidingWindow(int size) {  
        windowSize = size;  
        window = new LinkedList<>();  
        packetCount = 0;  
    }  
  
    public boolean sendPacket(int packet) {  
        if (window.size() < windowSize) {  
            window.add(packet);  
            packetCount++;  
            return true; // 数据包成功发送  
        } else if (window.peek() <= packet) {  
            window.poll(); // 数据包已过时,从窗口中移除  
        } else {  
            return false; // 数据包未能按序到达,等待重传  
        }  
        return false; // 数据包未能按序到达,等待重传  
    }  
}

拥塞控制

拥塞控制是计算机网络中的一种机制,用于在网络出现拥塞时调整发送方的数据发送速率,以避免网络拥塞恶化。其主要目标是提高网络的吞吐量和公平性,同时减少数据包的延迟和丢失。

拥塞控制是一种端到端和路由器到路由器的控制机制,用于防止过多的数据在网络中造成拥塞,影响网络的性能。

拥塞窗口是控制发送方可以发送多少数据,而不引起网络拥塞的一种机制。它与接收窗口一起,共同决定了发送方的发送速率。与滑动窗口不同,拥塞窗口的大小是由发送方根据网络的拥塞状况动态调整的。

往返时间

往返时间是从发送方发送一个数据包到接收方收到该数据包并返回一个确认包所需的时间。这是一个关键的参数,因为如果网络中的往返时间增加,意味着网络可能正在变得拥塞。

慢启动阈值

当TCP连接开始时,或者当检测到网络拥塞后,发送方会从一个小的窗口开始,然后逐渐增加窗口的大小。这个过程被称为慢启动。慢启动阈值是一个关键的参数,当窗口大小超过这个阈值时,TCP将切换到拥塞避免阶段。

拥塞避免

拥塞避免算法试图预防网络拥塞的发生。当检测到网络拥塞时,该算法会使发送方的窗口大小按线性方式增长,而不是像慢启动阶段那样按指数方式增长。

拥塞控制算法

TCP拥塞控制算法主要包括慢启动、拥塞避免、重传和快速重传、快速恢复和快速启动等。这些算法的目的是确保数据包在网络中的传输不会导致网络拥塞。

慢启动和拥塞避免

如前所述,当TCP连接开始时,或者当检测到网络拥塞后,发送方会从一个小的窗口开始,然后逐渐增加窗口的大小。这个过程就是慢启动。当窗口大小超过慢启动阈值时,TCP将切换到拥塞避免阶段,此时窗口大小按线性方式增长。

重传和快速重传

当数据包在传输过程中丢失时,接收方会发送一个重复的确认包给发送方。发送方在收到重复的确认包后,会重发相应的数据包。快速重传是一种优化策略,它快速重发那些未被确认的数据包,而不是等待更多的重复确认。

图片

快速恢复

快速恢复是一种在检测到网络拥塞后快速降低发送速率的算法。当收到三个重复的确认包时,发送方会缩小窗口大小并重新开始慢启动过程。

图片

快速启动

快速启动是一种新的拥塞控制算法,它的主要目标是减少新连接的延迟。当一个新的连接建立时,发送方可以立即发送最大窗口大小的数据包,然后根据接收到的确认包来调整窗口大小。

拥塞控制算法实现步骤

  • 慢启动阶段:当一个新的TCP连接建立时,发送方会从一个较小的窗口大小开始,然后逐步增加窗口大小。在慢启动阶段,窗口大小是按照指数方式增长的,即每次发送方收到确认后,窗口大小会加倍。当窗口大小达到慢启动阈值时,算法会进入拥塞避免阶段。

  • 拥塞避免阶段:当窗口大小超过慢启动阈值时,拥塞避免算法将控制窗口大小的增长。在这个阶段,窗口大小是按线性方式增长的,即每次发送方收到确认后,窗口大小只增加一个数据包。这种增长方式可以避免网络拥塞的发生。

  • 快速重传和快速恢复阶段:当检测到网络拥塞时,TCP会进入快速重传阶段,并立即重传未得到确认的数据包。如果连续三个重复确认被收到,发送方将进入快速恢复阶段。在这个阶段,发送方会快速减小窗口大小,并重新开始慢启动阶段。

  • 流量控制阶段:流量控制是用来防止接收方因接收数据过快而无法处理的情况。接收方会维护一个接收窗口,用来控制接收速率。当接收窗口为0时,发送方将停止发送数据,直到收到接收方的窗口更新报文段为止。

这些拥塞控制算法的具体实现都是为了更好地平衡网络的性能和稳定性,避免网络拥塞的发生,提高网络的吞吐量和响应速度。

拥塞控制算法对性能的影响

拥塞控制算法的目的是提高网络的性能和稳定性,但它们的具体实现和参数选择对性能有显著影响。以下是一些关键的性能影响:

  • 吞吐量与带宽利用率:有效的拥塞控制可以最大化网络的吞吐量,并提高带宽的利用率。这意味着发送方可以更高效地利用可用带宽,减少数据包的丢失和重传,从而提高传输效率。

  • 延迟与抖动:拥塞控制算法可以减少由于网络拥塞导致的延迟和抖动。当网络发生拥塞时,如果没有有效的控制机制,数据包可能会在网络中滞留,导致延迟增大。良好的拥塞控制可以减少这种情况的发生,从而降低延迟和抖动。

  • 公平性:不同的数据流在网络中可能会面临不同的拥塞状况。因此,如何公平地分配网络资源是一个重要的问题。一些拥塞控制算法设计得更加公平,以确保各个数据流都能获得适当的资源份额。

  • 稳定性:良好的拥塞控制有助于提高网络的稳定性。当网络处于拥塞状态时,数据流可能会被中断或延迟。持续的拥塞可能导致网络性能下降,甚至可能导致整个网络的崩溃。有效的拥塞控制可以预防这种情况的发生。

  • 参数选择与调整:不同的网络环境和应用需求可能需要调整拥塞控制算法的参数。例如,窗口大小、慢启动阈值、重传超时时间等参数的选择将直接影响网络的性能。因此,需要根据实际情况进行调整和优化。

以下是一个简单的Java代码示例,用于模拟TCP的拥塞控制过程:


public class TCPCongestionControl {
    private static final int MSS = 1000; // 报文段大小
    private static final int RTT = 100; // 往返时间
    private static final int THRESHOLD = 32 * MSS; // 阈值

    public static void main(String[] args) {
        int congestionWindow = 1; // 初始拥塞窗口大小
        int slowStartThreshold = THRESHOLD; // 慢启动阈值
        int time = 0; // 时间

        while (true) {
            if (time < RTT) {
                // 慢启动阶段
                congestionWindow *= 2;
            } else {
                // 拥塞避免阶段
                congestionWindow += MSS;
            }

            if (congestionWindow >= slowStartThreshold) {
                // 进入拥塞避免阶段
                slowStartThreshold = congestionWindow;
            }

            System.out.println("Time: " + time + ", Congestion Window: " + congestionWindow);
            time += RTT;
        }
    }
}

总结

TCP的流量控制和拥塞控制是确保网络传输稳定性和可靠性的关键机制。

拥塞控制与流量控制的区别在于,流量控制关注的是发送方和接收方之间的数据传输速率,而拥塞控制关注的是整个网络的数据传输速率。

流量控制主要通过滑动窗口机制实现,而拥塞控制则通过慢启动、拥塞避免等算法实现。

它们之间的联系在于,流量控制和拥塞控制都是为了提高网络的性能和可靠性,它们共同作用于TCP协议中,相互补充。

图片

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

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

相关文章

单细胞scRNA-seq测序基础知识笔记

单细胞scRNA-seq测序基础知识笔记 scRNA-seq技术scRNA-seq 分析流程数据预处理聚类标准化数据筛选有用的数据数据降维聚类 Clustering 注释细胞类型 scRNA数据分析结尾 该笔记来源于 B站up 江湾青年 scRNA-seq技术 首先是如何测序&#xff0c;上图瓶中有很多细胞&#xff0c;…

AD24-原理图与PCB交互设置及PCB常用快捷键汇总

一、原理图与PCB交互设置 1、在原理图页&#xff0c;工具-交叉选择模式 2、设置完成后。在原理图页选择器件&#xff0c;然后再PCB页也会相应被选中 3、一般将网络与Pin脚的勾去掉 4、整齐排列 5、TC&#xff1a;查找网络、器件、Pin脚 二、PCB常用快捷键汇总

高效远控管理 向日葵企业版统计报表与自动分组解析

高效远控管理&#xff01;向日葵企业版统计报表与自动分组解析企业之所以引入商用远程控制方案&#xff0c;一个很大的因素就是因为需要对高频率、多设备的远程控制需求以及IT设备本身进行高效管理&#xff0c;因此一款优质的商用远程控制方案势必需要在这些方面搭载足够完善的…

idea查看日志的辅助插件 --- Grep Console (高亮、取消高亮)

&#x1f680; 分享一款很有用的插件&#xff1a;Grep Console &#x1f680; 我们在查看日志的时候可能会有遗漏&#xff0c;使用这款插件可以让特定的关键词高亮&#xff0c;可以达到不遗漏的效果&#xff01; 如果你是一个开发者或者对日志文件分析感兴趣&#xff0c;不要…

MySQL原理(四)索引(3)索引失效与索引区分度

一、索引失效&#xff1a; 首先未使用索引列作为查询条件索引是肯定会生效的&#xff0c;还有其他的情况&#xff0c;索引列做为了查询条件也失效了&#xff1a; ALTER TABLE staffs ADD INDEX idx_staffs_nameAgePos(NAME, age, pos); 1、select 语句、order by语句&#xf…

x2openEuler 升级实操(centos7.8 to openEuler 20.03)

通过 x2openEuler 工具&#xff0c;将 centos 7.8 迁移至 OpenEuler 上&#xff0c;实际感受迁移过程。x2openEuler https://docs.openeuler.org/zh/docs/20.03_LTS_SP1/docs/x2openEuler/x2openEuler.html 环境准备 下载 x2openEuler 安装包 wget https://repo.oepkgs.net/o…

Nicn的刷题日常之带空格直角三角形图案

1.题目描述 描述 KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“*”组成的带空格直角三角形图案。 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示直角三角形直角边的长度&am…

Linux 指令

Linux 指令 1 登入/登出1.1 关机1.2 重启1.3 切用户 2 文件和目录管理2.1 目录操作2.2 文件操作2.3 文件内容操作2.4 归档及压缩 3 文本编辑器 vim3.1 命令模式3.2 输入模式3.3 末行模式 4 用户和组管理4.1 用户和组帐号概述4.1.1 用户帐号4.1.2 UID和GID 4.2 用户管理 5 组管理…

算法:箱子之形摆放

一、算法描述及解析 要求将一批箱子按从上到下以‘之’字形的顺序摆放在宽度为 n 的空地上&#xff0c;输出箱子的摆放位置&#xff0c; 例如&#xff1a;箱子ABCDEFG&#xff0c;空地宽为3。 如输入&#xff1a; ABCDEFG 3 输出&#xff1a; AFG BE CD 注&#xff1a;最后一行…

leetcode 28.找出字符串中第一个匹配项的下标(python版)

需求 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。 如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入&#xff1a;haystack…

2023年OceanBase开发者大会:核心内容与学习收获(附大会核心PPT下载)

本次大会邀请了众多业界领袖、技术大咖和开发者&#xff0c;共同探讨数据库领域的技术发展趋势和未来机会&#xff0c;与开发者共同探讨单机分布式、云原生、HTAP 等数据库前沿趋势&#xff0c;分享全新的产品 roadmap&#xff0c;交流场景探索和最佳实践。 一、大会核心内容 …

v-if及v-for、computed计算属性的使用

v-if 概念及使用 v-if是Vue.js中的一个指令&#xff0c;用于根据表达式的真假值条件性地渲染一块内容。如果表达式的值返回真&#xff0c;则Vue会渲染这块内容&#xff1b;如果返回假&#xff0c;则不渲染。 基本用法: <p v-if"isVisible">看到我了吗&#…

【vim 学习系列文章 3.2 -- vim 删除 空格】

文章目录 vim 删除行尾空格 vim 删除行尾空格 在代码开发的过程中&#xff0c;经常会遇到行尾有空格的现象&#xff0c;如下&#xff1a; 我们可以在 .vimrc 中通过map 命令来映射删除行尾空格的快捷键&#xff0c;如下&#xff1a; map d<space> :%s/\s*$//g <cr…

3分钟彻底搞懂Web UI自动化测试之【POM设计模式】

为什么要用POM设计模式 前期&#xff0c;我们学会了使用PythonSelenium编写Web UI自动化测试线性脚本 线性脚本&#xff08;以快递100网站登录举例&#xff09;&#xff1a; import timefrom selenium import webdriver from selenium.webdriver.common.by import Bydriver …

尚硅谷Ajax笔记

一天拿下 介绍二级目录三级目录 b站链接 介绍 ajax优缺点 http node.js下载配置好环境 express框架 切换到项目文件夹&#xff0c;执行下面两条命令 有报错,退出用管理员身份打开 或者再命令提示符用管理员身份打开 npm init --yes npm i express请求 <script>//引…

【Docker】使用VS创建、运行、打包、部署.net core 6.0 webapi

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

《Pandas 简易速速上手小册》第6章:Pandas 时间序列分析(2024 最新版)

文章目录 6.1 时间序列数据基础6.1.1 基础知识6.1.2 重点案例&#xff1a;股票市场分析6.1.3 拓展案例一&#xff1a;温度变化分析6.1.4 拓展案例二&#xff1a;电商平台日销售额分析 6.2 日期与时间功能6.2.1 基础知识6.2.2 重点案例&#xff1a;活动日志分析6.2.3 拓展案例一…

022 do while循环

什么是do while循环 int i 0; do {System.out.println(i);i; } while (i < 100); 具体使用场景 int i; Scanner scanner new Scanner(System.in); do {System.out.print("请输入一个整数&#xff0c;如果为负数则结束循环&#xff1a;");i scanner.nextInt(…

基于极大似然法和最小二乘法系统参数辨识matlab仿真,包含GUI界面

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 1.极大似然法系统参数辨识 2. 最小二乘法系统参数辨识 5.完整程序 1.程序功能描述 分别对比基于极大似然法的系统参数辨识以及基于最小二乘法的系统参数辨识&#xff0c;输出起参数辨识收敛…

Scrum敏捷研发管理全流程/scrum管理工具

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c;提质增效、缩短周期、加速创新…
最新文章