【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.mzph.cn/news/656014.shtml

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

相关文章

微服务-微服务Alibaba-Nacos 源码分析(上)

Nacos&Ribbon&Feign核心微服务架构图 架构原理 1、微服务系统在启动时将自己注册到服务注册中心&#xff0c;同时外发布 Http 接口供其它系统调用(一般都是基于Spring MVC) 2、服务消费者基于 Feign 调用服务提供者对外发布的接口&#xff0c;先对调用的本地接口加上…

【Java程序设计】【C00168】基于SSM的旅游网管理系统(论文+PPT)

基于SSM的旅游网管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游网系统 本系统分为用户前台功能模块和管理员功能模块2个功能模块。 用户前台功能模块&#xff1a;当游客打开系统的网址后&#xff0c;首先…

【Python笔记-设计模式】单例模式

一、说明 单例是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 (一) 解决问题 维护共享资源&#xff08;数据库或文件&#xff09;的访问权限&#xff0c;避免多个实例覆盖同一变量&#xff0c;引发程序崩溃。 …

JavaWeb中的Filter(过滤器)和 Listener(监听器)

提示&#xff1a;这两个东西听起来似乎很难&#xff0c;实际上是非常简单的&#xff0c;按照要求写就行了&#xff0c;一定不要被新名词给吓到了。 JavaWeb中的Filter&#xff08;过滤器&#xff09; 一、Filter&#xff08;过滤器&#xff09;1.如何编写 Filter2.Filter 中的细…

最小二乘圆柱拟合(高斯牛顿法)

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 本期话题&#xff1a;最小二乘圆柱拟合 相关背景资料 点击前往 圆柱拟合输入和输出要求 输入 8到50个点&#xff0c;全部采样自圆柱上。每个点3个坐标&#xff0c;坐…

自动化测试的10大误区!

自动化测试因提高效率&#xff0c;减少重复工作的特性而被广泛采用。然而&#xff0c;随着自动化测试的普及&#xff0c;自动化测试也面临一系列挑战和误解。 这些误区不仅影响了测试的有效性&#xff0c;还会导致一定的项目风险&#xff0c;为了确保自动化测试能够真正提升测…

【EI会议征稿通知】2024年第四届激光,光学和光电子技术国际学术会议(LOPET 2024)

2024年第四届激光&#xff0c;光学和光电子技术国际学术会议(LOPET 2024) 2024 4th International Conference on Laser, Optics and Optoelectronic Technology 2024年第四届激光&#xff0c;光学和光电子技术国际学术会议(LOPET 2024)将于2024年5月17日-19日在中国重庆举行。…

长度最小的子数组[中等]

一、题目 给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其总和大于等于target的长度最小的连续子数组[numsl, numsl1, ..., numsr-1, numsr]&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回0。 示例 1&#xff1a; 输入&#xff…

迷你型洗衣机好用吗?迷你内裤洗衣机排名前十名推荐

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…

Redis学习——高级篇④

Redis学习——高级篇④ Redis7高级之Redis与Mysql数据双写一致性工程案例&#xff08;四&#xff09; 4.1 MySQL主从复制原理4.2 canal 工作原理4.3 mySQL->canal->redis 双写一致性1.环境2.配置Mysql3.配置canal4. Canal客户端&#xff08;Java编写&#xff0…

JavaScript-for循环的执行顺序

1.目标 掌握for执行顺序 2.实现思路 使用for循环输出0-到5 3.代码实现 Document 4.总结 for执行顺序 1.执行 var i 0 变量初始化 条件判断 是否成立 成立 执行循环体 不成立 退出for循环

STL_list

一、有关list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。Ii…

Docker容器引擎(6)

目录 一.什么是consul 解决什么问题&#xff1f; consul的模式&#xff1a; 二.consul 部署 consul服务器&#xff1a; 查看版本&#xff1a; 设置代理&#xff0c;在后台启动 consul 服务端&#xff1a; 进行后台启动&#xff1a; 查看集群信息&#xff1a; 访问页面…

云计算底层技术奥秘、磁盘技术揭秘、虚拟化管理、公有云概述

云计算基础 实验图例 虚拟化平台安装 创建虚拟机 1、创建虚拟机 2cpu&#xff0c;4G内存&#xff08;默认用户名: root 密码: a&#xff09; 2、验证 ecs 是否支持虚拟化 [rootecs ~]# grep -Po "vmx|svm" /proc/cpuinfovmx... ...[rootecs ~]# lsmod |grep kvm…

【算法专题】前缀和(附图解、代码)

&#x1f4d1;前言 本文主要是前缀和的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力一点&…

Orion-14B-Chat-Plugin本地部署的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

WebSocket 整合 记录用法

WebSocket 介绍 WebSocket 是基于tcp的一种新的网络协议,可以让浏览器 和 服务器进行通信,然后区别于http需要三次握手,websocket只用一次握手,就可以创建持久性的连接,并进行双向数据传输 Http和WebSocket的区别 Http是短连接,WebSocket’是长连接Http通信是单向的,基于请求…

互联网加竞赛 基于深度学习的人脸表情识别

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸表情识别 该项目较…

HiveSQL题——排序函数(row_number/rank/dense_rank)

一、窗口函数的知识点 1.1 窗户函数的定义 窗口函数可以拆分为【窗口函数】。窗口函数官网指路&#xff1a; LanguageManual WindowingAndAnalytics - Apache Hive - Apache Software Foundationhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual%20Windowin…

【Algorithms 4】算法(第4版)学习笔记 01 - 1.5 案例研究:union-find算法

文章目录 前言参考目录学习笔记1&#xff1a;动态连通性2&#xff1a;UF 实现 1&#xff1a;快速查找 quick-find2.1&#xff1a;demo 演示 12.2&#xff1a;demo 演示 22.3&#xff1a;quick-find 代码实现3&#xff1a;UF 实现 2&#xff1a;快速合并 quick-union3.1&#xf…