网络编程——TCP的特性之自动重传/流量控制/拥塞控制,一篇说清楚

2024-04-20 05:12

本文主要是介绍网络编程——TCP的特性之自动重传/流量控制/拥塞控制,一篇说清楚,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1. ARQ自动重传协议
      • 1.1 停止等待ARQ
      • 1.2 连续ARQ
      • 1.3 总结
    • 2. TCP的流量控制
    • 3. TCP的拥塞控制
      • 3.1 慢开始算法
      • 3.2 拥塞避免算法
      • 3.3 快重传算法
      • 3.4 快恢复算法

1. ARQ自动重传协议

自动重传请求(Automatic Repeat-reQuest),通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输,其中包括停止等待ARQ协议和连续ARQ协议

1.1 停止等待ARQ

发送窗口大小为1,接收窗口大小也为1
发送方每发送一个数据包,就要等待接收方返回ack包,如果在定时时间内没收到ack包,则需要重新发送,而这个超时时间,是需要经过RTT往返时延(从发送方发送数据开始,到发送方接收到来自接收方的确认消息)来计算出来的。

当数据正常传输时,发送完M1数据包后,等待接收方的M1数据包ACK,收到后继续发送M2数据包并等待ACK
image.png

当数据传输出错时,假设数据包M1丢失,则一定超时时间后,进行一次重传。
image.png

1.2 连续ARQ

连续ARQ发送方可连续发送多个分组的数据,而不需要像停止等待ARQ一样,等到应答再进行发送,大大提升带宽的利用率。
image.png

1)滑动窗口概念
滑动窗口协议在发送方和接收方之间各自维持一个滑动窗口,两个窗口大小不一定相同。
主要提供TCP的可靠性(基于确认重传机制)以及TCP的流控特性(控制网络传输时的流量,避免拥塞发生)。

滑动窗口其实类似一个收费站,收费站也就是窗口的位置是不变的,数据不停的在进行滑动。
image.png

2)滑动窗口重发机制
发送端维护一个窗口,窗口内有多个分组,分组个数等于窗口的大小,窗口内的分组可以直接连续发送数据,不需要等待接收端返回的ACK,这样可以提升对信道的利用率。

TCP协议提供两种滑动窗口协议:回退(Go-Back-N)以及选择重传(Selective Repeat来解决连续ARQ模式下传输数据出错的问题。
1)回退(Go-Back-N)协议
发送窗口大小 n > 1,接收窗口 = 1,当发生数据丢失时,会重传所有大于最后一个ACK的包
image.png
在这种模式下,发送端会维护一块发送端的数据缓存,当需要重发窗口中的分组报文,便会从缓存里读取数据发送。
这里采用的是累计确认的形式,不像停止等待ARQ,现在不需要对数据帧进行逐个的确认,而是对按序到达的最后一个分组进行确认,假设发送方发送了5个包,但是第三个包丢失,则接收方只返回前两个包的ACK,此时发送方因为不知道后面的三个包有没有发送成功,只能选择这三个包进行重传。
2)选择重传(Selective Repeat)协议
发送窗口大小 > 1,接收窗口大小 > 1,当发生数据丢失,只重传丢失的数据包。
此时已经无法依赖ACK包去做选择重传了,因为ACK只能表示收到了哪些包,但中间的包丢失时,则无法表示。
所以在这里引入了SACK**(Selective Acknowledgement)**,存储在TCP头部的可变选项中,记录接收窗口缓存中还未收到的数据包信息。
image.png
具体例子如下:
image.png

1.3 总结

协议窗口大小是否有序接收具体做法
停止等待ARQ发送=1, 接收=1有序发送窗口每次只能发送一个数据包,然后就停止等待ack包。接收窗口有序的接收数据包,接收成功后发送ack包给发送窗口,如果收到的数据包是无序的,就直接丢弃
连续ARQ-回退协议发送 = N,接收 = 1有序发送窗口每次最多一次性发送n个数据包,接收窗口有序的接收数据包,当接收到有序的数据包后,发送ack包给发送窗口,如果收到的数据包时无序的,就直接丢弃。当数据包丢失的时候,会将发送窗口中的后面的所有数据包都重新发送
连续ARQ-选择重传协议发送 = N,接收 = N无序发送窗口每次最多一次性发送n个数据包,接收窗口无序的接收数据包,当接收到数据包后,发送ack包给发送窗口,ack中会携带SACK信息,也就是接收窗口中的缓存信息。发送端会根据SACK信息来只重传丢失的数据包

2. TCP的流量控制

目的:防止分组丢失进而触发自动重传机制,造成网络流量的浪费。

原理:如果发送者发送数据过快,接收者来不及接收,那么就会有数据分组丢失。为了避免这种分组丢失,接收端会通知发送端它的接收窗口大小(TCP首部中有一个窗口大小值),此时发送者也将发送窗口大小更改为这个值,让接收者来得及接收。

具体案例:假设一开始主机A和B的窗口都是400,那么在发送时,主机A会连续发送400个字节的数据,如果201~300号意外丢失了,主机B会返回响应ACK=1,ack=201,rwnd=300,这表示主机B已接收到201号之前的数据,并将自己的接收窗口设置为300。此时A收到后将发送窗口大小也设置为300,达到流量控制的目的。

3. TCP的拥塞控制

目的:防止过多的数据注入到网络中,避免出现网络负载过大的情况,常用的算法就是:
慢开始、拥塞避免、快重传、快恢复

原理:发送方维持一个拥塞窗口cwnd(congestion window)的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。另外考虑到接受方的接收能力 发送方的发送窗口小于或等于拥塞窗口

3.1 慢开始算法

原理:一开始不发送大量的数据,防止网络负载过大,由小到大逐渐增加拥塞窗口的大小,来探测网络的拥塞程度

具体案例:发送方每次经过一个传输轮次之后,拥塞窗口cwnd就直接加倍,这样比直接一下把许多报文注入网络要慢的多。
image.png

3.2 拥塞避免算法

原理:当拥塞窗口cwnd到达慢开始门限ssthresh后,让拥塞窗口缓慢增长,每经过一个传输轮次后,将cwnd值加一,而不是直接加倍。使cwnd已经到达一定值的情况下,网络不容易出现阻塞。

慢开始门限ssthresh与拥塞窗口cwnd的关系
当cwnd<ssthresh时,使用慢开始算法
当cwnd>ssthresh时,改用拥塞避免算法
当cwnd=ssthresh时,慢开始与拥塞避免算法任意

具体案例:拥塞窗口cwnd初始值为1,慢开始门限ssthresh初始值是16
1)在cwnd<ssthresh,执行慢开始算法,cwnd的值在经过一个轮次传输后值翻倍
2)当cwnd>ssthresh,执行拥塞避免算法,每一个轮次,cwnd的值只加1
3)当cmnd = 24时,假设发生网络阻塞,将进行”乘法减小“,ssthresh = cwnd / 2,cwnd为0,重新开始慢开始算法
image.png

3.3 快重传算法

原理:快速进行重传,当接收方在收到一个失序的报文段后就立即发出重复确认,发送方只要一连收到三个重复确认就认为是网络阻塞,立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。(提高网络吞吐量百分之20左右)

具体案例
image.png

3.4 快恢复算法

原理:快速恢复传输,和快重传搭配使用,当发生快重传时,进行”乘法减小“算法,此时不会再进行慢开始算法,而是执行快恢复算法,直接将cwnd设置为ssthresh减半后的值。

具体案例:cwnd为24时,收到三个重复确认,则进行快重传,此时执行”乘法减小“算法,ssthresh = cwnd/2,cwnd = ssthresh,直接便开始了拥塞避免算法。

注意:在TCP Reno版本采用快恢复算法时,慢开始算法只是在TCP连接建立时和网络出现超时时才使用,其他例如收到三个重复的确认,则会执行快恢复算法。
image.png

这篇关于网络编程——TCP的特性之自动重传/流量控制/拥塞控制,一篇说清楚的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/919354

相关文章

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

16.Spring前世今生与Spring编程思想

1.1.课程目标 1、通过对本章内容的学习,可以掌握Spring的基本架构及各子模块之间的依赖关系。 2、 了解Spring的发展历史,启发思维。 3、 对 Spring形成一个整体的认识,为之后的深入学习做铺垫。 4、 通过对本章内容的学习,可以了解Spring版本升级的规律,从而应用到自己的系统升级版本命名。 5、Spring编程思想总结。 1.2.内容定位 Spring使用经验

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

Java研学-RBAC权限控制(八)

九 登录登出 1 登录作用   判断员工是否有权限访问,首先得知道现在操作的人是谁,所以必须先实现登录功能 2 登录流程   ① 提供登录页面,可输入用户名与密码信息,并添加执行登录的按钮。(登录页面不能被拦截)   ② 给按钮绑定点击事件(异步操作,POST请求)   ③ 事件中发送登录请求,使用 AJAX 方式提交。(使用 AJAX 原因:用户体验更好,既可保留用户刚输入的用户名和密码

说一说三大运营商的流量类型,看完就知道该怎么选运营商了!

说一说三大运营商的流量类型,看完就知道该怎么选运营商了?目前三大运营商的流量类型大致分为通用流量和定向流量,比如: 中国电信:通用流量+定向流量 电信推出的套餐通常由通用流量+定向流量所组成,通用流量比较多,一般都在100G以上,而且电信套餐长期套餐较多,大多无合约期,自主激活的卡也是最多的,适合没有通话需求的朋友办理。 中国移动:通用流量+定向流量 移动推出的套餐通常由通用流量+定向

WordPress网创自动采集并发布插件

网创教程:WordPress插件网创自动采集并发布 阅读更新:随机添加文章的阅读数量,购买数量,喜欢数量。 使用插件注意事项 如果遇到404错误,请先检查并调整网站的伪静态设置,这是最常见的问题。需要定制化服务,请随时联系我。 本次更新内容 我们进行了多项更新和优化,主要包括: 界面设置:用户现在可以更便捷地设置文章分类和发布金额。代码优化:改进了采集和发布代码,提高了插件的稳定

【青龙面板辅助】JD商品自动给好评获取京豆脚本

1.打开链接 开下面的链接进入待评价商品页面 https://club.jd.com/myJdcomments/myJdcomments.action?sort=0 2.登陆后执行脚本 登陆后,按F12键,选择console,复制粘贴以下代码,先运行脚本1,再运行脚本2 脚本1代码 可以自行修改评价内容。 var content = '材质很好,质量也不错,到货也很快物流满分,包装快递满