网络编程——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

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

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

相关文章

前端获取文件后缀名

function getFileExtension(filename) {var parts filename.split(.);if (parts.length > 1) {return parts.pop();} else {return ;} }// 使用例子 var filename "example.png"; var extension getFileExtension(filename); console.log(extension); // 输出:…

免费的在线视频编辑工具,mp4转gif工具

在线视频编辑&#xff1a;https://online-video-cutter.com/change-video-speed&#xff0c;可以加速视频。 mp4转gif&#xff1a;MP4轉GIF轉換器。在线自由 — Convertio MP4 To GIF | Convert MP4 To GIF Images Online - XConvert

flex:1给了我工作机会

今天就跟大家讲讲flex&#xff1a;1是什么的缩写&#xff0c;怎么去理解这个样式。 首先要知道flex:1就是 flex-grow: 1; flex-shrink: 1; flex-basis: 0;的缩写&#xff0c;首页要理解它们的作用&#xff0c;先看dom解构 <div class"parent"><div class&q…

vivado Versal 串行 I/O 硬件调试流程、使用 Vivado Serial I/O Analyzer 来调试设计

Versal 串行 I/O 硬件调试流程 Versal ™ ACAP 无需再生成 IBERT IP &#xff0c; 因为使用系统内串行 I/O 调试所需的必要逻辑现已集成到 GTY 收发器架构内。使 用 GTY 收发器的任何设计均可用于串行 I/O 硬件调试。 Versal 串行 I/O 硬件调试流程具有 2 个不同阶…

lesson04:类和对象(下)

1. 再谈构造函数 2.static成员 3.友元 4.内部类 5.匿名对象 1. 再谈构造函数 1.1构造函数体内赋值 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Date { public:Date(int year, int month, int day){_year year;_month mont…

Oceanbase体验之(二)Oceanbase集群的搭建(社区版4.2.2)

资源规划 3台observer CPU:4C及以上 内存&#xff1a;32G及以上 硬盘操作系统500G 存储盘1T及以上 虚拟机可以直接划分&#xff0c;物理机需要提前规划好资源 一、上传oceanbase安装包 登录ocp选择软件包管理 上传Oceanbase软件包&#xff08;软件包获取路径 官网免费下载社…

动态规划和递归法求解斐波那契数列

动态规划是把复杂问题分解为相对简单的子问题来求解,动态规划旨在解决具有重叠子问题和最优子结构特性的问题,它的核心思想是解决每个子问题仅能一次,并存储其解,以便需要时直接查找,从而避免重复计算 基本概念: 1.重叠子问题: 问题可以分解为多个子问题,且这些子问题有些会被多…

【量化】基于遗传规划的因子自动挖掘系统

最后&#xff1a;策略达到了23.6%的年化收益&#xff0c;夏普比率达到5.87&#xff0c;最大回撤为-4.3%&#xff0c;平局年换手率为27.45 倍&#xff0c;平均持股数量为543 支。 文末有回测结果。 目录 1.模型思想 1.1遗传规划算法介绍 ​1.2因子测试流程 2.代码与实现 2.1…

云原生Kubernetes: K8S 1.29版本 部署Nexus

目录 一、实验 1.环境 2.搭建NFS 3. K8S 1.29版本 部署Nexus 二、问题 1.volumeMode有哪几种模式 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注masterK8S master节点1.29.0192.168.204.8 node1K8S node节点1.29.0192.168.204.9node2K…

【yolo算法道路井盖检测】

yolo算法道路井盖检测 数据集和模型yolov8道路井盖-下水道井盖检测训练模型数据集pyqt界面yolov8道路井盖-下水道井盖检测训练模型数据集 算法原理 1. 数据集准备与增强 数据采集&#xff1a;使用行车记录仪或其他设备收集道路井盖的图像数据。数据标注&#xff1a;对收集到…

如何看待AIGC技术?【模板】

如何看待AIGC技术&#xff1f; 简介&#xff1a;探讨AIGC技术的发展现状和未来趋势。 提醒&#xff1a;在发布作品前&#xff0c;请把不需要的内容删掉。 方向一&#xff1a;技术应用 提示&#xff1a;分享AIGC技术在各个领域的应用情况&#xff0c;以及对未来社会的影响和可能…

网络协议深度解析:SSL、 TLS、HTTP和 DNS(C/C++代码实现)

在数字化时代&#xff0c;网络协议构成了互联网通信的基石。SSL、TLS、HTTP和DNS是其中最关键的几种&#xff0c;它们确保了我们的数据安全传输、网页的正确显示以及域名的正常解析。 要理解这些协议&#xff0c;首先需要了解网络分层模型。SSL和TLS位于传输层之上&#xff0c…

【Java--数据结构】链表经典OJ题详解(上)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 谈谈头插、头删、尾插、头插的时间复杂度 反转一个单链表 链表的中间结点 返回倒数第k个结点 合并两个链表 谈谈头插、头删、尾插、头插的时间复杂度 头插和头删的时…

HtmlCss 基础总结(基础好了才是最能打的)一

Html&Css 基础学习回顾总结 one day~ 文章目录 Html&Css 基础学习回顾总结前言开始啦Html 骨架Html 基本标签H1-H6标签段落标签换行标签水平线标签图像标签相对路径&绝对路径 和音频视频标签超链接标签 总结 前言 作者在求学期间自学了前端界面相关的&#xff0c…

【数据结构】图基本概念

在计算机科学中&#xff0c;图&#xff08;Graph&#xff09;是一种非常重要的数据结构&#xff0c;用于描述各种复杂的关系和网络。本文将介绍图的基本概念&#xff0c;并通过C语言代码演示如何实现基本的图结构和相关操作。 图的基本概念&#xff1a; 图由节点&#xff08;…

使用react-vant上传图片遇到的问题

使用react-vant Uploader上传图片后出现的问题。 先试用upload上传图片。 <Form.Itemrules{[{ required: true, message: 请上传头像 }]}label上传头像namefiles><Uploader accept* maxCount"1" onChange{imgFile} /></Form.Item> 图片上传成功后…

高频SQL 判断三角形

题目信息 表&#xff1a;Triangle ------------------- | Column Name | Type | ------------------- | x | int | | y | int | | z | int | ------------------- 在 SQL 中&#xff0c;(x, y, z)是该表的主键列。 该表的每一行包含三个线段…

Linux网络-DNS域名解析服务

目录 一.DNS相关介绍 1.DNS是什么 2.DNS系统的分布式数据结构 根域 顶级域 二级域 子域 主机 3.服务器类型 主域名服务器 从域名服务器 缓存域名服务器 转发域名服务器 二.DNS域名解析 1.DNS域名解析方式及功能 2.DNS域名解析查询方式 2.1.递归查询&#xff0…

OpenWRT设置自动获取IP,作为二级路由器

前言 上一期咱们讲了在OpenWRT设置PPPoE拨号的教程&#xff0c;在光猫桥接的模式下&#xff0c;OpenWRT如果不设置PPPoE拨号&#xff0c;就无法正常上网。 OpenWRT设置PPPoE拨号教程 但现在很多新装的宽带&#xff0c;宽带师傅为了方便都会把光猫设置为路由模式。如果你再外…