如何保证TCP传输的可靠性

news2025/1/12 12:09:13

重传机制,流量控制,拥塞控制

1.重传机制:

序列号+确认应答  当发送端的数据到达接收主机的时候,接收端主机会返回一个确认应答消息,表示已经收到消息

当数据发生丢包时,用重传机制解决

重传机制有好几种:超时重传,快速重传,SACK,D-SACK  

超时重传

发送端发送数据后,如果超过指定时间(RTO,超时重传时间,略大于包往返时间RTT,RTT是在动态变化的,所以RTO也是在动态变化的)还没有接收到接收端的ACK确认,就会重新发送数据,

下一次超时重传时,会将下一次超时时间设置为先前值的两倍,两次超时,就说明网络环境差,此时不宜频繁发送

快速重传

发送端收到3个重复的ACK时,就会触发快速重传,发送端立刻重发丢失的数据包

举例如下:

发送方一共发出五份数据,但是第二份数据(Seq2)丢失了

当收到第一份数据后,接收方发送一个ack2(这是一个正常的ACK),表示期望接下来希望接收第二份数据(编号为2),但是由于第二份数据缺失了,于是发送方并没有接收到ack2

发送发继续发送第三份数据,当接收方接收到第三份数据后,由于没有接收到ack2,所以并没有发送ack4表示希望接下来接收第四份数据,而是再次发送ack2.......

发送端收到了三个 ACK = 2 的确认,知道了 Seq2 还没有收到,就会重传Seq2

最后,服务器收到了Seq2,然后检查一下自己接收到的最大序号是多少,原来是5,于是向客户端发送ack6,表示下一份想接收到的数据是Seq6

这种方法问题在于:如果出现连续丢失多个包的情况,比如Seq2数据包丢失了,Seq3数据包也丢失了,然后成功发送Seq4,Seq5,Seq6,最后客户端重传了Seq2数据包,服务端收到后,就会检查此时收到的最大序号是6,于是向发送方发送ACK7,此时Seq3就彻底丢失了

SACK可以解决连续丢失多个包的情况

SACK也是接收到三个连续重复的ACK就触发重传

一旦接收端没有收到想要的数据包,发送给发送方的报文中就会带上SACK字段,即ACKX,SACK=M~N,这表示X~M-1的数据包没有成功发送,M~N-1的数据包被成功发送了

比如ACK30,SACK=40~50表示30~39的数据包没有成功发送,40~49的数据包成功发送了

这样就可以解决连续丢包的问题,比如如果连续丢了30~39,40~49两个报文,于是向发送方的报文就是ACK30,SACK=50~60或者ACK30,SACK=50~70......

D-SACK   

SACK机制 SACK字段后面只带一个区间

D-SACK机制 SACK字段后面有两个区间

先是连续两次丢失了ACK确认报文

然后又丢失了一次发送报文

然后又丢失了ACK确认报文

最后发送端发送了一个重复报文,接收方发送一个ACK报文(只有发送了重复数据报,才会发送后面带两个区间的SACK字段,否则只发送带一个区间的SACK字段)

ACK30  SACK=10~20   40~50表示你刚刚发送没呢个10~19号已经发送过了,现在是30以前的都有了,40~50也有了,就差30-39没有发送成功了  (也就是SACK第一个字段表示刚才发的那个数据包是重复数据报,第二个字段表示ACK30后面已经收到的数据报)

2.流量控制

控制发送方发送速率,保证接收方来得及接收

TCP 利用滑动窗口实现流量控制,发送方有一个发送方的窗口,接收方有一个接收方的窗口

(发送方的窗口不能大于接收方的窗口大小,否则接收方接受不过来)

接收方给发送方的确认报文里面有一个窗口字段,规定发送方窗口大小,从而影响发送方的发送速率(如果窗口字段为0,表示发送方不能发送数据了)

发送窗口:

可以划分为4个部分:①已经发送并确认②已经发送未确认③未发送但是即将发送的④不能发送的

发送窗口大小就是②已经发送未确认+③未发送但即将发送

 接收窗口:

可以划分为3个部分:①已经接收并确认 ②等待接收还没有接收③不能接收

滑动窗口大小=②等待接收还没有接收

3.拥塞控制

为了避免网络拥塞而采取的对发送方发送速率的控制

发送方会感知网络的拥塞程度(发送方如何感知当前这个网络存在阻塞?只要发生丢包事件,也就是超时就可以认定网络发生了拥塞,那就需要减小窗口大小了)

发送方维护一个拥塞窗口cwnd对发送方的发送速率进行限制,发送方发送窗口大小=Math.min(拥塞窗口大小,接收方接收窗口大小)

发送方会控制发送方发送到连接中但是还没有被接收方确认的数据量

拥塞控制算法:慢开始,拥塞避免,快重传,快恢复

只要网络不堵,我就尽可能去发,如果网络堵,我就减小窗口,这样速率就慢了

慢开始:开始摸不准网络是否堵塞的情况,那就由小到大逐渐增大窗口的值,如果当前窗口发送的报文全都收到了确认报文,那就将窗口大小乘二,也就是每次窗口大小乘2,所以窗口大小依次为1,2,4,8,16,当窗口大于阈值ssthresh(一般大小为16),就采取拥塞避免算法

拥塞避免算法也是去让拥塞窗口增大的,但是增大的速率没有增长那么快了,而是一个一个去增加的线性增长,直到到达网络拥塞的状态,这个时候就会发生超时,一旦发生超时,就可以认定为发生了网络堵塞,这个时候就把阈值ssthresh变成当前窗口的1/2(图里面当前窗口大小是24,所以阈值ssthresh变成12),,然后又开始使用慢开始算法,窗口又从1开始,1,2,4,8,12

总结:先慢开始,然后拥塞避免,然后又慢开始,然后又拥塞避免,然后又慢开始

快重传:尽可能让发送方知道个别报文段丢失了,要求接收方收到有序报文数据后,就立刻去发送确认报文

发送方发送M1报文,然后接收方发送一个M1确认报文给发送方 

发送方发送M2报文,然后接收方发送一个M2确认报文给发送方 

发送M3报文的时候,M3报文丢失了

然后发送方发送M4报文,然后接收方由于没有接收到M3报文,所以接收方还是给发送方发送M2确认报文

.......

如此发送方连续接收到3个异常的连续对M2的重复确认,触发快重传,于是立即重传M3数据报,

本来发送方会等一个超时时间,快速确认三次没有收到,然后马上重传,这个时间是会小于超时时间的

这里可以看到,横坐标为21的时候发生了3次重复确认,发生快重传,快重传之后阈值继续降低,并且从阈值开始(不用从1开始了)直接进入有拥塞避免,省去了慢开始的过程

发生快重传之后窗口大小迅速达到阈值,不用慢开始从1开始,就是快恢复


 

流量控制:控制发送方的发送速度过快,导致接收方来不及接收数据,缓存溢出,数据丢失

拥塞控制:由于网络自身拥堵,导致发送方的发送能力被遏制住

流量控制和拥塞控制都是对发送方进行控制的,前者是解决发送和接收速率不匹配的问题,后者是网络本身拥堵,发送方不得不采取速率控制来避免网络更加拥堵

拥塞控制是一个全局性的过程,涉及到所有的主机,所有的路由器,以及与降低网络传输性能有关的所有因素(而流量控制需要控制的是发送方和接收方两台主机即可)

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

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

相关文章

【Anime.js】——用Anime.js实现动画效果

目录 目标: ​编辑1、确定思路 2、创建网格 3、设置随机位置 4、创建时间轴动画 完整代码: 目标: 实现自动选点,对该点进行先缩小后放大如何回到比其他点大一点的状态,并以该点从外向内放大 1、确定思路 2、创建网…

第12届嵌入式蓝桥杯真题-停车场管理系统的设计与实现

目录 实验要求: 实验思路: 核心代码: (1)主函数 (2)lcd显示 (3)按键函数 (4)LED显示函数 (5)业务处理函数 &…

深度理解取模

深度理解取模一.取模概念二.负数取模三.进一步的解释四.取模和取余是一样的吗?一.取模概念 二.负数取模 上面的代码一目了然就不再多少啦,但如果是负数取模又该怎么办呢? 以上a/b-3是很好理解的,那为什么取模后的值是-1呢&#xf…

useEffect 和 useLayoutEffect 的源码解读

文章目录useEffect 和 useLayoutEffect 的源码解读useEffect源码解读mountEffectImplpushEffectupdateEffectImpl疑惑:useLayOutEffect源码解读mountLayoutEffectupdateLayoutEffect总结useEffect 和 useLayoutEffect 的源码解读 useEffect 文件在 packages/react…

毕业设计-基于深度学习的交通标识识别-opencv

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

叠氮-聚乙二醇-羧基,N3-PEG-COOH 异双功能PEG衍生物COOH-PEG-N3又名Azide-PEG-acid,可用于修饰蛋白质

英文名称:N3-PEG-COOH;COOH-PEG-N3 Azide-PEG-acid 中文名称:叠氮-聚乙二醇-羧基;羧基-聚乙二醇-叠氮 存储条件:-20C,避光干燥 用 途:仅用于科学研究,不能用于人体 外观: 固体或…

【OpenFeign】【源码+图解】【一】HelloWorld及其工作原理

目录1. HelloWorld1.1 pom.xml1.2 yml配置1.3 开启OpenFeign1.4 创建Product的FeignClient1.5 Controller2. OpenFeign的工作原理1. HelloWorld 服务中心以及Product微服务继续使用LoadBalance中的HelloWorld,新建一个client作为OpenFeign的例子 1.1 pom.xml 引入…

【视觉高级篇】26 # 如何绘制带宽度的曲线?

说明 【跟月影学可视化】学习笔记。 如何用 Canvas2D 绘制带宽度的曲线? Canvas2D 提供了相应的 API,能够绘制出不同宽度、具有特定连线方式(lineJoin)和线帽形状(lineCap)的曲线,绘制曲线非…

力扣(1053.115)补9.13

1053.不相交的线 不会,这题和1143题代码一样,只不过题意不太能懂,难想,难想。 115.不同的子序列 难想,这种题就跟该画dp图去理解,太难了。 跟着图去模拟一下,要不然真的答案都看不懂。 dp[i][j…

Servlet知识

1、什么是Servlet? Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据&…

机器学习笔记:scikit-learn pipeline使用示例

0. 前言 在机器学习中,管道机制是指将一系列处理步骤串连起来自动地一个接一个地运行的机制。Scikit-Learn提供了pipeline类用于实现机器学习管道,使用起来十分方便。 既然要将不同处理步骤串联起来,首先必须确保每个步骤的输出与下一个步骤的…

java计算机毕业设计基于安卓Android的数字猎头招聘管理APP

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把数字猎头招聘管理与现在网络相结合,利用java技术建设数字猎头招聘管理APP,实现数字猎头招聘管理的信息化。则对于进一步提高数字猎头招聘管理发展,丰富数字猎头招聘管理经验能起到不少的促进作用。 数字猎头招聘管理APP能…

kafka概念及部署

文章目录一.kafka1.kafka的概念2.Kafka的特性3.工作原理4.文件存储5.消息模式5.1点到点5.2订阅模式6.基础架构一.kafka 1.kafka的概念 Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica&a…

第八章会话控制

文章目录为什么需要会话控制带来的问题如何解决无状态的问题——Cookie如果只靠单纯的Cookie存在的问题单纯Cookie导致问题的解决方法——SessionSessionsession的结构一些关于Session的APISession的保存作用域Cookie时效性会话和持久化Cookie对比Cookie的domain和path为什么需…

后端开发框架的具体内容是什么?

在数据化管理越来越规范的今天,低代码开发平台也迎来了重要的发展期。前后端分离已经成为发展趋势,有不少客户朋友想要咨询后端开发框架的定义和内容,为了帮助大家答疑解惑,小编经过整理,组织出了一篇关于该内容的文章…

centos7 安装部署sonarqube 8.9.1(postqresql数据库版)

公司产品sonarqube以最大限度地提高质量并管理软件产品组合中的风险。为开发者软件开发人员最终负责代码质量。 代码质量是所谓的非功能性需求的一部分,因此是开发人员的直接责任。为有追求的程序员写出地道代码提供方向。 一、环境要求 1、centos7 x64 2、jdk11 3…

KT6368A蓝牙芯片用户PC升级_搭配下载器_使用说明

目录 一、下载原理简介 KT6368A双模蓝牙芯片是flash版本,支持重复烧录程序,但是烧录程序必须使用专用的下载工具 这个工具需要由我们来提供。 下载的总体思路是,把芯片和PC电脑相连接,通过USB。然后PC端有上位机工具&#xff0…

Zabbix

一、什么是Zabbix zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 zabbix 由 2 部…

Spring Boot 整合 RabbitMQ

一、工程简介 1、生产者&#xff08;test-11-rabbitmq-producer&#xff0c;spring boot 版本 2.4.1&#xff09; 1&#xff09;pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifact…

外汇天眼:分分飞艇──谎称33倍高收益,入金投资获利要不回

在这个万物皆涨、薪水不涨的年代&#xff0c;大多数人都知道投资的重要性&#xff0c;但因为受限于本身的知识与技巧不足&#xff0c;经常看错市场方向或选错标的而亏损&#xff0c;并因此感到苦恼不已。此时若看到人宣称有无风险高获利的赚钱管道&#xff0c;不免会跃跃欲试。…