计算机网络:运输层 —— TCP 的超时重传机制

devtools/2024/11/25 0:25:22/

文章目录

TCP 的超时重传

TCP 的超时重传是保证数据可靠传输的重要机制之一

  • 保证数据可靠性:通过超时重传机制,即使在网络状况不佳,出现数据包丢失等情况时,也能够确保数据最终能够完整、准确地被接收方接收,从而保证了数据传输的可靠性。

  • 自适应网络变化:能够根据网络的实时状况动态调整超时时间和重传策略,较好地适应不同网络环境下的传输需求,提高网络资源的利用率和数据传输效率。

超时重传时间的选择

发送方在发送数据后会启动一个定时器,若在规定时间内未收到接收方的确认报文(ACK),则认为该数据丢失,进而触发重传机制,重新发送该数据,直至发送成功。

TCP 超时重传时间 RTO的选择是TCP最复杂的问题之一,超时重传时间RTO应略大于往返时间RTT

TCP下层是复杂的因特网环境:主机 A 所发送的报文段可能只经过一个高速率的局域网,也可能经过多个低速率的网络,并且每个IP数据报的转发路由还可能不同。

不能直接使用略大于某次测量得到的往返时间 RTT 样本的值作为超时重传时间 RTO。但是,可以利用每次测量得到的 RTT 样本,计算加权平均往返时间 R T T S RTT_S RTTS,这样可以得到比较平滑的往返时间。

在这里插入图片描述

超时重传时间RTO的值应略大于加权平均往返时间 R T T S RTT_S RTTS 的值(而不是某个 RTT 样本的值)

[RFC 6298] 建议使用下式来计算超时重传时间 RTO

在这里插入图片描述

在 TCP 连接建立初期,超时重传时间(RTO)会被赋予一个初始值。例如,根据最初的简单公式,初始值可能为 1 秒;而依据修正公式,初始 RTO 应为 a + 4 d a+4d a+4d,其中 a 、 d a、d ad 为相关参数,如初始化 a a a 为 0,初始化 d d d 为 3 秒

如果所测量到的 RTT 样本不正确,那么所计算出的 R T T S RTT_S RTTSRTT,自然就不正确,进而所计算出的 RTO 也就不正确。然而,RTT 的测量确实是比较复杂的。

在这里插入图片描述

通过上述两个例子可以看出:当发送方出现超时重传后,收到确认报文段时,是无法判断出该确认到底是对原数据报文段的确认还是对重传数据报文段的确认,也就是无法准确测量出RTT,进而无法正确计算RTO。

基于以上问题,Karn 提出了一种算法,但该算法又引出了新问题,因此要对 Karn算法 进行修正:

在这里插入图片描述
也就是说:报文段每重传一次,就把 RTO 增大一些。典型的做法是将新 RTO 的值取为I日 RTO2 倍

在数据正常传输过程中,发送方会根据往返时间(RTT)不断更新 RTO 的值。RTT 是指数据包从发送方发送出去到接收方返回确认报文所需的时间 。发送方通常使用特定的公式来综合旧的 RTT 值和新测量到的 RTT 值,以更准确地估计当前网络状况下合适的 RTO

但在重传情况下,RTO 不使用上述正常传输时的公式计算,而是采用指数退避的方式。比如,当 RTO 为 1 秒时发生数据重传,下一次重传的 RTO 会变为 2 秒,再下次变为 4 秒,以此类推,直至达到 64 秒。

重传策略

  • 普通超时重传:发送方等待 ACK 的定时器超时后,会重传未被确认的数据报文段。并且,每次重传后会重新启动定时器,等待接收方的确认。

  • 快速重传:当接收方收到失序的报文段时,会立即发送一个重复的 ACK。如果发送方连续收到三个重复的 ACK,就可推断有一个报文段丢失,此时发送方不必等待定时器超时,会立即重传丢失的报文段,这就是快速重传机制。快速重传能够有效减少因等待超时带来的延迟,更快地恢复数据传输。

  • 选择性确认重传:这是一种 TCP 扩展机制,接收方可以通过选择性确认SACK)告知发送方哪些数据包已成功接收,哪些需要重传。发送方根据这些信息,仅重传丢失的数据包,避免了不必要的全量重传,提高了传输效率.

与拥塞控制的关联

相关阅读网络>计算机网络:运输层 —— TCP 的拥塞控制

  • 慢启动阶段:当发生超时重传时,通常意味着网络可能出现了拥塞或其他问题。此时,会将慢启动门限(ssthresh)设置为当前拥塞窗口(cwnd)的一半,同时将 cwnd 重新设置为 1 个报文段大小,重新进入慢启动阶段,以较慢的速度重新探测网络的承载能力,避免再次造成网络拥塞

  • 快速恢复阶段:在快速重传之后,发送方进入快速恢复阶段。此时,ssthresh 同样被设置为当前 cwnd 的一半,而 cwnd 则被设置为 ssthresh 加上 3 倍的报文段大小。之后,发送方每收到一个新的 ACK,就将 cwnd 增加 1 个报文段大小并发送 1 个分组,直到再次检测到拥塞。


http://www.ppmy.cn/devtools/136684.html

相关文章

【Linux】用户和用户组管理

管理用户 1.添加用户账号——useradd命令 【实例2-1-1】 按系统默认配置添加指定用户账号st和stu。 # 添加用户账号st [rootlocalhost ~]# useradd st # 添加用户账号stu [rootlocalhost ~]# useradd stu【实例2-1-2】添加用户账号stu01,UID为1004&am…

【Python-办公自动化】实现自动化输出模板表格报告

import pandas as pd import numpy as np# 定义时间范围 date_range = pd.date_range(start=2023-11-01, end=2024-10-31, freq=M

Spark RDD Checkpoint 数据的保存机制

在 Spark 中,RDD 的 checkpoint 是一种容错机制,用于将 RDD 的数据保存到可靠的存储系统(如 HDFS)中,以便在节点故障时可以从存储中重新加载数据,而不是重新计算依赖链。 RDD Checkpoint 数据的保存格式 数…

Flutter中sqflite的使用案例

目录 引言 安装sqflite 创建表 查询数据 添加数据 删除数据 更新数据 完整使用案例 引言 随着移动应用的发展,本地数据存储成为了一个不可或缺的功能。在Flutter中,sqflite 是一个非常流行且强大的SQLite插件,它允许开发者在移动设备…

Kingfisher 下载ENA、NCBI SRA、AWS 和 Google Cloud)序列数据和元数据

Kingfisher 是一个灵活高效的工具,用于从公共数据仓库(如 ENA、NCBI SRA、AWS 和 Google Cloud)下载序列数据和元数据。它有两个主要模式:获取序列数据(get)和获取元数据(annotate)。…

使用MATLAB进行字符串处理

MATLAB是一个强大的数学和计算机科学的软件工具包。它拥有一个灵活的字符串处理工具,可以用于处理和转换不同格式的字符串,例如,数值、日期、时间等。本文将探讨如何使用MATLAB进行字符串处理,以及如何利用它来解决实际问题。 在…

RocketMQ: 客户端使用指南

客户端如何寻址 RocketMQ 有多种配置方式可以令客户端找到 Name Server, 然后通过 Name Server 再找到 Broker,分别如下,优先级由高到低,高优先级会覆盖低优先级 一、代码中指定 Name Server 地址 producer.setNamesrvAddr("192.168.…

【es6进阶】vue3中的数据劫持的最新实现方案的proxy的详解

vuejs中实现数据的劫持,v2中使用的是Object.defineProperty()来实现的,在大版本v3中彻底重写了这部分,使用了proxy这个数据代理的方式,来修复了v2中对数组和对象的劫持的遗留问题。 proxy是什么 Proxy 用于修改某些操作的默认行为&#xff0…