TCP的拥塞控制、提高网络利用率的方法【TCP原理(笔记四)】

news2024/12/23 13:49:10

文章目录

    • 拥塞控制
      • 慢启动
    • 提高网络利用率的规范
      • Nagle算法
      • 延迟确认应答
      • 捎带应答

拥塞控制

有了TCP的窗口控制,收发主机之间即使不再以一个数据段为单位发送确认应答,也能够连续发送大量数据包。然而,如果在通信刚开始时就发送大量数据,也可能会引发其他问题。

一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络的瘫痪。TCP拥塞控制的主要目标是在网络中保持合理的数据流量,以避免过度拥塞引发的丢包、延迟和传输性能下降。

以下是TCP拥塞控制中常用的算法和技术:

  • 慢启动(Slow Start):在TCP连接刚建立时,发送方将初始拥塞窗口设置为一个较小的值,然后随着时间的推移逐渐增加拥塞窗口的大小。这种方式可以避免在网络中突然注入大量数据引起的拥塞。
  • 拥塞避免(Congestion Avoidance):一旦慢启动阶段结束,TCP发送方会进入拥塞避免阶段。在该阶段,发送方根据网络的反馈信息来调整拥塞窗口的大小,使得数据的发送速率适应当前网络的拥塞程度。
  • 快重传(Fast Retransmit):当TCP发送方接收到重复的确认信息(ACK)时,它会推断某个数据包可能丢失,并立即进行重传,而不必等待超时重传定时器到期。
  • 快恢复(Fast Recovery):在快重传的基础上,TCP发送方进入快恢复状态,继续发送数据,而不是回退到慢启动阶段。这可以减少连接的停顿时间,并加速恢复。
  • 拥塞检测(Congestion Detection):TCP发送方通过监视网络的延迟和丢包情况来检测网络的拥塞程度。当发送方认为网络出现拥塞时,它会相应地调整发送速率,以减少对网络负载的贡献。

这些算法和技术共同组成了TCP拥塞控制的基本原理,通过动态地调整数据的发送速率和窗口大小,TCP可以在网络中实现拥塞的自我调节,从而确保网络的稳定性和公平性。

慢启动

在这里插入图片描述
首先,为了在发送端调节所要发送数据的量,定义了一个叫做“拥塞窗口”的概念。于是在慢启动的时候,将这个拥塞窗口的大小设置为1个数据段(1MSS)(连接建立以后即刻从1MSS开始进行慢启动的话,通过卫星通信等手段提高通信吞吐量所耗的时间会比较长。为此,有时也会将慢启动的初始值设置大于1MSS的值。具体来说,MSS的值小于1095字节时最大为4MSS,小于2190字节时最大为4390字节,超过2190字节时最大值大于2MSS。以太网的标准MSS值为1460字节,因此慢启动的初始值从4380字节(3MSS)开始就可以。) 发送数据,之后每收到一次确认应答(ACK),拥塞窗口的值就加1。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小做比较,然后按照它们当中较小那个值,发送比其还要小的数据量。

如果重发采用超时机制,那么拥塞窗口的初始值可以设置为1以后再进行慢启动修正。有了上述这些机制,就可以有效地减少通信开始时连续发包(连续发包的情况也叫“爆发”(Burst)。慢启动正是减少爆发等网络拥堵情况的一种机制。) 导致的网络拥堵,还可以避免网络拥塞情况的发生。

不过,随着包的每次往返,拥塞窗口也会以1、2、4等指数函数的增长,拥堵状况激增甚至导致网络拥塞的发生。为了防止这些,引入了慢启动阀值的概念。只要拥塞窗口的值超出这个阀值,在每收到一次确认应答时,只允许以下面这种比例放大拥塞窗口:

在这里插入图片描述
拥塞窗口越大,确认应答的数目也会增加。不过随着每收到一个确认应答,其涨幅也会逐渐减少,甚至小过比一个数据段还要小的字节数。因此,拥塞窗口的大小会呈直线上升的趋势。

TCP的通信开始时,并没有设置相应的慢启动阀值(与窗口的最大值相同。) 。而是在超时重发时,才会设置为当时拥塞窗口一半的大小。

由重复确认应答而触发的高速重发与超时重发机制的处理多少有些不同。因为前者要求至少3次的确认应答数据段到达对方主机后才会触发,相比后者网络的拥堵要轻一些。

而由重复确认应答进行高速重发控制时,慢启动阀值的大小被设置为当时窗口大小的一半(严格来说,是设置为“实际已发送但未收到确认应答的数据量”的一半。) 。然后将窗口的大小设置为该慢启动阀值+3个数据段的大小。

有了这样一种控制,TCP的拥塞窗口如上图所示发生变化。由于窗口的大小会直接影响数据被转发时的吞吐量,所以一般情况下,窗口越大,越会形成高吞吐量的通信。

当TCP通信开始以后,网络吞吐量会逐渐上升,但是随着网络拥堵的发生吞吐量也会急速下降。于是会再次进入吞吐量慢慢上升的过程。因此所谓TCP的吞吐量的特点就好像是在逐步占领网络带宽的感觉。

提高网络利用率的规范

Nagle算法

Nagle算法是一种用于优化网络通信的算法,主要用于减少小数据包的传输次数,提高网络传输的效率。

在计算机网络中,当应用程序通过网络发送数据时,通常会将数据划分为小的数据包进行传输。每个数据包都需要经过一定的时间和网络资源来传输。当需要传输大量小数据包时,传输每个数据包都会引入一定的延迟和开销,这可能会导致网络性能下降。

Nagle算法的目标是通过减少小数据包的传输次数来提高网络传输效率。该算法的原理是,在发送数据包之前,首先将数据缓存起来,等待一小段时间,看是否有更多的数据需要发送。如果在该时间段内没有更多数据到达,那么Nagle算法会将缓存的数据一次性发送出去;如果在该时间段内有更多数据到达,Nagle算法会将这些数据合并为一个大的数据包一起发送。

Nagle算法通过减少传输的数据包数量来减少网络开销,提高传输效率。它特别适用于一些需要频繁发送小数据包的应用场景,如Telnet、SSH等交互式应用,以及一些低带宽的网络环境。

需要注意的是,Nagle算法会引入一定的延迟,因为它需要等待一小段时间来检查是否有更多的数据到达。在某些实时性要求较高的应用场景下,可以通过禁用Nagle算法来减少延迟,但这可能会导致网络效率下降。

延迟确认应答

延迟确认应答(Delayed Acknowledgment)是一种优化TCP传输性能的机制,通过延迟发送ACK确认报文来减少网络中的报文流量和减少发送方的开销。

在TCP通信中,接收方通常需要向发送方发送ACK确认报文来确认已经接收到的数据。通常情况下,每接收到一个数据包,接收方都会立即发送一个ACK报文进行确认。这种立即发送ACK的方式可以确保可靠传输和快速反馈,但也会增加网络中的报文流量,特别是在高速网络和大流量传输时。

为了减少ACK报文的数量,TCP引入了延迟确认机制。

  • 在没有收到2×最大段长度的数据为止不做确认应答(根据操作系统的不同,有时也有不论数据大小,只要收到两个包就即刻返回确认应答的情况。)
  • 其他情况下,最大延迟0.5秒发送确认应答(如果延迟多于0.5秒可能会导致发送端重发数据。) (很多操作系统设置为0.2秒左右(这个时间越小、CPU的负荷会越高,性能也下降。反之,这个时间越长,越有可能触发发送主机的重发处理,而窗口为只有1个数据段的时候,性能也会下降。) )

如果在这段时间内没有接收到其他数据,接收方就会发送一个累积ACK,确认之前接收到的所有数据。

延迟确认的优势在于减少了ACK报文的数量,从而降低了网络中的报文流量。尤其在一些交互式应用中,可以显著减少网络开销和延迟,提高传输性能。
在这里插入图片描述
然而,需要注意的是,延迟确认也可能引入一定的延迟。如果发送方在等待ACK确认时,没有接收到ACK报文,它会认为数据丢失,并进行重传。这会导致一定的传输延迟。因此,延迟确认的使用需要权衡延迟和网络开销之间的关系,根据具体应用场景进行配置。

捎带应答

捎带应答(SACK, Selective Acknowledgment)是一种TCP拓展功能,用于改进丢包重传的效率。它允许接收方在一个ACK报文中同时确认多个不连续的数据段的接收情况,从而减少重传的次数。

在传统的TCP协议中,当接收方收到一个有序的、连续的数据段时,它会向发送方发送一个ACK报文进行确认。如果接收方收到的数据段不连续,例如有一些数据段丢失,它会发送一个重复ACK来指示发送方需要重传丢失的数据段。发送方收到重复ACK后会认为数据丢失,并进行重传操作。

TCP捎带应答通过在ACK报文中携带了额外的信息,使接收方能够一次性确认多个不连续的数据段的接收情况。接收方会在ACK报文中使用SACK选项,指示已成功接收的数据段的范围。发送方收到这样的ACK报文后,可以根据SACK选项中的信息,只重传丢失的数据段,而不必重传已经成功接收的数据段。

TCP捎带应答的优势在于减少了不必要的重传,提高了网络传输的效率。通过允许接收方一次性确认多个不连续的数据段,TCP可以更加精确地识别出丢失的数据段,并有针对性地进行重传,而不是简单地重传全部数据段。

需要注意的是,TCP捎带应答需要在发送方和接收方之间共同支持和启用。如果其中一方不支持捎带应答,TCP会退回到传统的ACK确认方式。此外,TCP捎带应答使用了TCP报文的选项字段,会增加报文的大小,可能会影响网络传输的效率,特别是在一些低带宽的环境中。
在这里插入图片描述

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

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

相关文章

新能源汽车交流充电桩CP信号详解

随着新能源汽车的推广,交流充电桩迎来了巨大的市场需求,人们对车辆充电的便利性、安全性有着越来越高的要求。CP信号主要用于交流充电桩,充电桩和汽车之间只能通过CP信号进行通讯,判断、控制充电电流和状态。 汽车充电桩CP信号…

QT之自定义表格控件

继承QWidget来绘制的一款自定义控件,设计原因是因为Qt自带的QTableWidget的大批量操作很卡,特别是在嵌入式设备上时。 该控件特色功能: 1、支持拖动自适应。 2、支持各种颜色,字体,行列数设置。 代码如下: …

win10安装cuda11.4及cudnn

查看nvidia驱动版本 在windows终端键入nvidia-smi,查看nvidia显卡驱动。显卡驱动的版本决定了CUDA的版本下限。 如果出现上述的问题,则终端进入C:\Program Files\NVIDIA Corporation\NVSMI文件夹内,再键入nvidia-smi,可以看到我…

[MySQL]MySQL视图特性

[MySQL]MySQL视图特性 文章目录 [MySQL]MySQL视图特性1. 视图的概念2. 视图的基本操作创建视图删除视图 3. 视图规则和限制 1. 视图的概念 视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。基表是对…

Git标签管理(对版本打标签,起别名)

tag 理解标签创建标签git tag [name]git show [tagname] 操作标签删除标签git tag -d < tagname > 推送某个标签到远程git push origin < tagname > 理解标签 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名。 …

数据库备份mysqldump、mydumper、xtrabackup

数据库备份&#xff0c;数据库为school&#xff0c;素材如下 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) );创建sco…

《面试1v1》如何提高远程用户的吞吐量

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

FPGA配置文件从串并模式下载

FPGA配置文件的下载模式有5种&#xff1a; 主串模式&#xff08;master serial&#xff09;从串模式&#xff08;slave serial&#xff09;主并模式&#xff08;master selectMAP&#xff09;从并模式&#xff08;slave selectMAP&#xff09;JTAG模式 其中&#xff0c;JTAG模…

SQL 常见函数整理 _ SOUNDEX() 和 DIFFERENCE()

SOUNDEX() 1. 用法 是一种针对字符串进行音似匹配的函数。它将一个字符串作为输入&#xff0c;并返回一个代表该字符串音似编码的字符串。此编码可用于比较和匹配具有相似发音的字符串。 2. 基本语法 SOUNDEX(expression)其中&#xff0c;expression 是要进行音似编码的字符串…

后端排序优化——谁调用,谁排序

前言 为了使排序更加灵活&#xff0c;建议后端排序可以优化为“谁调用谁排序”。 代码实现 数据库设计 以学生表为例。 前端查询条件为姓名&#xff0c;住址。 Controller 简化后的controller层代码如下&#xff1a; /*** queryStudent[查询学生]* param name 姓名* param …

SQL优化——update优化

1.update优化 执行update语句的时候一定要根据索引字段进行更新&#xff0c;否则就会出现行锁升级为表锁的情况&#xff0c;锁住整张表&#xff0c;一旦锁表了并发性能就会受影响。 2.总结 sql优化事实上都是对索引进行优化

【Git】—— 解决分支合并冲突

在实际分⽀合并的时候&#xff0c;并不是想合并就能合并成功的&#xff0c;有时候可能会遇到代码冲突的问题。 为了演⽰这问题&#xff0c;创建⼀个新的分⽀ dev1 &#xff0c;并切换⾄⽬标分⽀&#xff0c;我们可以使⽤ git checkout - b dev1 ⼀步完成创建并切换的动作…

网卡收发包系统结构收发包流程,tcp/ip协议,socket套接字缓冲区,滑动窗口,mtu/mss

MTU和MSS的区别 MTU和MSS的区别 TCP 的 MTU & MSS MTU是在那一层&#xff1f;MSS在那一层&#xff1f; MTU是在数据链路层的载荷大小也就是传给网络层的大小&#xff0c;mss是在传输层的载荷大小也就是传给应用层的大小 mss是根据mtu得到的 1、MTU&#xff1a; Maximu…

矩阵置零(力扣)思维 JAVA

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 输入&#xff1a;matrix [[0,1,2,0],[3,4,5,2],[…

Django项目之模型

Django项目之模型 创建环境配置连接MySQL数据库创建表单注册模型Django模型类查询模型类的条件查询聚合函数 创建环境 创建Django项目&#xff0c;创建usersapp&#xff0c;并在setting.py中注册 项目工作目录 配置连接MySQL数据库 修改/Djweb/Djweb/setting.py中DATABASE…

netty知识集锦2

粘包半包 粘包半包解决方案&#xff0c; 1短链接&#xff0c;它的消息边界是从链接建立到链接断开 2.定长解码器&#xff1a;服务器端选最大长度的消息作为定长&#xff0c;客户端不足补齐&#xff0c;缺点造成浪费 netty协议设计与解析 Message编码解码

[DASCTF 2023 0X401七月暑期挑战赛] REV1 controlflow复现

这东西没怎么研究过&#xff0c;不过很多人都完成了&#xff0c;不过这种比赛有很多应该是拿的别人的wp&#xff0c;所以减去些水份&#xff0c;赛后拿到一个wp是人c程序实现的。然后根据原代码还原一下加密流程。 首先是main 这里比较特殊&#xff0c;一开始的3个变量明显是加…

VS2010打开VC6工程进行调试时的问题解决方法

VS2010打开VC6工程进行调试时的问题解决方法 在工程属性页&#xff0c;“配置属性—链接器—输入—忽略特定默认库” 中添加编译时提示无法找到的几个lib库&#xff0c;如下图所示

【iOS】App仿写--管理系统

文章目录 前言一、账号界面二、功能界面三、添加功能四、删除功能五、更改功能六、查找功能七、排序功能八、退出功能总结 前言 在日常生活中&#xff0c;如果用文字来记述与管理我们数据会十分麻烦&#xff0c;并且人工成本较高&#xff0c;这里笔者给出一种管理系统的模版&a…

DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作)

DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作&#xff09; 文章目录 DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作&#…