TCP为什么可靠之“重传机制”

news/2024/5/17 19:52:22 标签: 网络, tcp/ip, tcp

TCP重传机制

TCP针对数据包丢失的情况,会通过重传机制解决,包括像超时重传、快速重传、选择确认SACK、D-SACK

超时重传

TCP会设置一个定时器,如果在发送数据之后的规定时间内,没有收到对方的ACK报文,就会触发重新发送数据。那么这个规定的时间应该设置为多少呢?这里有两个时间的概念

  • RTT(Round-Trip Time):往返时延,也就是从发送数据开始到接收应答报文的时间

  • RTO(Retransimission Timeout):超时重传时间,在数据发送之后开始,如果RTO时间内没有收到ACK报文,就会重新发送报文

超时重传时间如果设置的太小,会导致数据包还没有到达对方主机,或者是对方确认应答还没有到达本机时,就重新发送数据包,导致重复发送、网络负荷增大;如果设置的太大,会导致丢包后重新发送数据包的空闲时间太长,降低传输效率。

所以超时重传的时间应该略大于往返时延,这才能保证不会太大或太小。

由于网络是不断波动和变化的,所以RTT往返时延和RTO不会是一个固定的值。在Linux系统中,为了得到RTO,需要对RTT进行采样,然后加权计算出平滑RTT值,同时采样波动范围。根据RFC的标准以及大量的实验不断调试,最终得出了超时重传的这么一个策略:

  • 超时 间隔加倍:每当需要超时重传时,就将下一次的超时重传时间设置为原先的两倍。连续的两次超时,就说明网络环境差,不宜反复发送

超时重传是以时间作为重传的标准,需要等待超时才触发重传,所以它时间相对比较长,有没有更快的方式能够感知数据包丢失而触发重传呢?

快速重传

与超时重传不同,快速重传以数据作为标注,触发重传机制。

快速重传是指,当连续三次收到相同序号的ACK报文,就认为数据包丢失,需要重传,而不用等待超时再重传。

但快速重传面临着一个问题,是重传一个报文,还是包括该报文之后的所有报文?

  • 如果重传一个报文,在连续多个报文丢失的情况下,一次重传无法重传所有丢失的报文,需要触发下一次重传

  • 如果重传所有报文,可能导致重复发送已经被对方成功接收的数据,导致资源浪费

所以为了解决这个问题,有了之后的选择确认SACK

选择确认SACK

通过选择确认(Selective ACK),能够重传对方缺少的数据,而不重传已经成功被对方接收的数据。

要使用选择确认SACK,就需要在建立TCP连接时,在TCP报文头部的选项字段中加上”允许SACK“。

当接收方发生数据缺失时,就把确实报文的序号范围添加到TCP报文头部中,用来告知发送方哪些序号的报文需要重发。一个数据块有两个边界,指明一个边界就要用掉4个字节(因为边界指的就是序号,一个序号占4个字节),而TCP选项字段最长可达40字节。

D-SACK

Duplicate SACK,通过SACK字段,来告诉对方哪些数据被重复接收了。

导致数据的重复发送主要有两个场景,一个是没有收到ACK报文,另一个是网络延迟。

D-SACK的唯一作用就是能够让发送方知道,重传的原因,是因为自己发送的数据丢失了,还是对方的ACK报文丢失了,还是因为网络阻塞导致的数据延迟。


http://www.niftyadmin.cn/n/5253224.html

相关文章

STM32-TIM定时器输出比较

目录 一、输出比较简介 二、PWM简介 三、输出比较通道(通用) 四、输出比较通道(高级) 五、输出比较模式 六、PWM基本结构 七、PWM参数计算 八、外设介绍 8.1 舵机 8.2 直流电机及驱动 九、开发步骤 十、输出比较库函数…

Mybatis之简介、使用操作(安装、XML、SqlSession、映射的SQL语句、命名空间、作用域和生命周期)

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

Android 10.0 系统framework修改低电量关机值为2%

1.前言 在10.0的系统产品开发中,在系统关于低电量关机的值,每个平台都不同,根据实际开发底层硬件的要求看实际情况来调整这个值, 所以需要分析相关的电量变化执行的代码流程,来实现这个功能 2.系统framework修改低电量关机值为2%的核心类 frameworks\base\services\cor…

深度学习探索:从基础原理到前沿应用的科技演进

目录 第一部分:深度学习的基础概念 1.1 神经网络的基本原理 1.2 反向传播算法 1.3 深度学习与传统机器学习的区别 第二部分:深度学习的发展历程 2.1 早期神经网络的探索 2.2 深度学习的复兴 2.3 CNN和RNN的崛起 2.4 强化学习的整合 第三部分&am…

Elasticsearch 8.9 refresh刷Es缓冲区的数据到Lucene,更新segemnt,使数据可见

一、相关API的handler1、接受HTTP请求的hander(RestRefreshAction)2、往数据节点发送刷新请求的action(TransportRefreshAction)3、数据节点接收主节点refresh传输的action(TransportShardRefreshAction) 二、在IndexShard执行refresh操作1、根据入参决定是使用lucene提供的阻塞…

qt5图形视频框架

Qt5 图形视频框架(Qt Graphics Video Framework)是 Qt 跨平台应用程序开发框架的一部分,用于开发图形用户界面(GUI)和多媒体应用程序。它提供了一系列工具和类,用于绘制 2D 和 3D 图形、处理图像和视频、创…

【Linux】使用Bash和GNU Parallel并行解压缩文件

介绍 在本教程中,我们将学习如何使用Bash脚本和GNU Parallel实现高效并行解压缩多个文件。这种方法在处理大量文件时可以显著加快提取过程。 先决条件 确保系统上已安装以下内容: BashGNU Parallel 你可以使用以下命令在不同Linux系统上安装它们&am…

CMMI认证有什么意义

什么是CMMI认证 CMMI(Capability Maturity Model Integration)即能力成熟度模型集成,是由美国卡内基梅隆大学软件工程研究所(SEI)开发的,用于评估和改善企业软件开发过程的一种标准。它主要关注软件开发过…