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

文章目录

    • TCP 的超时重传
      • 超时重传时间的选择
      • 重传策略
      • 与拥塞控制的关联

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.rhkb.cn/news/477087.html

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

相关文章

C嘎嘎探索篇:和stack,queue的相遇

C嘎嘎探索篇:和stack,queue的再次相遇 前言: 小编在前几日刚完成了关于list容器的介绍,中间由于我牙齿出现了问题所以断更了不少天,如今我牙齿已经恢复,我也要开始继续新内容的讲解了,各位读者…

GPTZero:高效识别AI生成文本,保障学术诚信与内容原创性

产品描述 GPTZero 是一款先进的AI文本检测工具,专为识别由大型语言模型(如ChatGPT、GPT-4、Bard等)生成的文本而设计。它通过分析文本的复杂性和一致性,判断文本是否可能由人类编写。GPTZero 已经得到了超过100家媒体机构的报道&…

MyBatis Plus 项目的创建和使用

1. 快速上手 1.1. 项目的创建和配置 首先&#xff0c;创建一个 Spring Boot 工程&#xff0c;添加 MyBatis Plus 和 MySQL 对应的依赖&#xff0c;然后&#xff0c;和 MyBatis 一样&#xff0c;需要在 yml 文件中配置数据库连接信息 <dependency><groupId>com.b…

IDEA 2024.3 版本更新主要功能介绍

IDEA 2024.3 版本提供的新特性 IntelliJ IDEA 2024.3 的主要新特性&#xff1a; AI Assistant 增强 改进的代码补全和建议更智能的代码分析和重构建议Java 支持改进 支持 Java 21 的所有新特性改进的模式匹配和记录模式支持更好的虚拟线程调试体验开发工具改进 更新的 UI/UX 设…

Java编程,配置mongoUri连接mongodb时,需对特殊字符进行转义

一、背景 java程序连接mongo有两种方式&#xff1a; 用户名和密码方式uri方式 1、用户名和密码 以用户数据库为例&#xff0c;注意看它的密码 spring:data:mongodb:host: 192.168.10.17database: db_user_serviceport: 3717username: user_servicepassword: user_service3…

学习笔记|MaxKB对接本地大模型时,选择Ollma还是vLLM?

在使用MaxKB开源知识库问答系统的过程中&#xff0c;除了对接在线大模型&#xff0c;一些用户出于资源配置、长期使用成本、安全性等多方面考虑&#xff0c;还在积极尝试通过Ollama、vLLM等模型推理框架对接本地离线大模型。而在用户实践的过程中&#xff0c;经常会对候选的模型…

Python 快速入门(上篇)❖ Python基础知识

Python 基础知识 Python安装**运行第一个程序:基本数据类型算术运算符变量赋值操作符转义符获取用户输入综合案例:简单计算器实现Python安装** Linux安装: yum install python36 -y或者编译安装指定版本:https://www.python.org/downloads/source/ wget https://www.pyt…

【1.2 Getting Started--->Installation Guide】

NVIDIA TensorRT DOCS 此 NVIDIA TensorRT 10.6.0 安装指南提供安装要求、TensorRT 包中包含的内容列表以及安装 TensorRT 的分步说明。 安装指南 摘要&#xff1a; 本 NVIDIA TensorRT 10.3.0 安装指南提供了安装要求、TensorRT 软件包中包含的内容列表以及安装 TensorRT 的…

RT_Thread内核源码分析(三)——线程

目录 1. 线程结构 2. 线程创建 2.1 静态线程创建 2.2 动态线程创建 2.3 源码分析 2.4 线程内存结构 3. 线程状态 3.1 线程状态分类 3.2 就绪状态和运行态 3.3 阻塞/挂起状态 3.3.1 阻塞工况 3.4 关闭状态 3.4.1 线程关闭接口 3.4.2 静态线程关闭 3.4.3 动态线程关…

Unity图形学之CubeMap立方体贴图

1.CubeMap&#xff1a;有六个面的贴图组成 2. 假反射&#xff1a;反射天空盒子 &#xff08;1&#xff09;正常UV采样&#xff1a; &#xff08;2&#xff09;Cube的采样&#xff1a;利用反射角采样&#xff0c;反射角X和Cube的交点采样 Shader "Custom/TestReflect"…

C语言基础学习:抽象数据类型(ADT)

基础概念 抽象数据类型&#xff08;ADT&#xff09;是一种数据类型&#xff0c;它定义了一组数据以及可以在这组数据上执行的操作&#xff0c;但隐藏了数据的具体存储方式和实现细节。在C语言中&#xff0c;抽象数据类型&#xff08;ADT&#xff09;是一种非常重要的概念&…

Qt-多元素控件

Qt中的多元素控件 Qt提供的多元素控件有&#xff1a; 这里的多元素控件都是两两一对的。 xxWidget和xxView的一个比较简单的理解就是&#xff1a; xxView是更底层的实现&#xff0c; xxWidget是基于xxView封装来的。 可以说&#xff0c;xxView使用起来比较麻烦&#xff0c;但…

2023年9月GESPC++一级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 题号 123456789101112131415 答案 CDBCDBACACBBDDA 1. 我们通常说的 “ 内存 ” 属于计算机中的&#xff08;&#xff09;。 A. 输出设备 B. 输 ⼊ 设备 C. 存储设备 D. 打印设备 【答案】 C 【考纲知识点】…

wend看源码-APISJON

项目地址 腾讯APIJSON官方网站 定义 APIJSON 可以定义为一个面向HTTP 协议的JSON 规范&#xff0c;一个面向数据访问层的ORM 框架。其主要工作流程包括&#xff1a;前端按照既定格式组装 JSON 请求报文&#xff0c;通过 APIJSON-ORM 将这些报文直接转换为 SQL 语句&#xff0c…

VMware虚拟机Ubuntu桥接模式突然连接不上网络解决办法

在Linux环境进行开发时突然发现虚拟机中的Ubuntu突然连接不上网络&#xff0c;图形化界面也找不到有线连接选项。在此记录解决办法。 解决办法 1. 在终端命令行输入以下命令&#xff1a; sudo service network-manager stop2. 然后编辑以下文件将其中NetworkingEnable fals…

丹摩征文活动|摩智算平台深度解析:Faster R-CNN模型的训练与测试实战

目录 文章前言Faster R-CNN的简介Faster RCNN的训练与测试提前准备1.1 mobaxterm&#xff08;远程连接服务器&#xff09;1.2 本文的源码下载 目标检测模型 Faster-Rcnn2.1云服务器平台 数据上传内置JupyterLab的使用本地连接使用DAMODEL实例获取实例的SSH访问信息通过SSH连接通…

【数据结构】归并排序 —— 递归及非递归解决归并排序

归并排序 一、归并排序1、归并排序的思想2、归并排序代码实现&#xff08;递归&#xff09;<1> 归并排序的递归区间<2> 归并排序的稳定性<3> 拷贝 3、归并排序代码实现&#xff08;非递归&#xff09;<1> 循环区间溢出问题 二、总结 一、归并排序 1、…

调大Vscode资源管理器字体

对于调整资源管理器字体大小&#xff08;也就是下图红框&#xff09;&#xff0c;查找了网上很多方法。要么介绍的方法是调整了代码字体&#xff0c;要么是调节了终端字体&#xff0c;要么是通过整体放缩实现的调整&#xff0c;总之都不合适。 唯一的调整方法是在几篇CSDN里看到…

【Linux】-学习笔记04

第十二章、磁盘管理 1.查看磁盘空间使用量 1.1df命令 作用&#xff1a; 列出文件系统的磁盘空间占用情况 df&#xff0c;disk free&#xff0c;通过文件系统来快速获取空间大小的信息&#xff0c;当我们删除一个文件的时候&#xff0c;这个文件 不是马上就在文件系统当中消…

centos 服务器 docker 使用代理

宿主机使用代理 在宿主机的全局配置文件中添加代理信息 vim /etc/profile export http_proxyhttp://127.0.0.1:7897 export https_proxyhttp://127.0.0.1:7897 export no_proxy"localhost,127.0.0.1,::1,172.171.0.0" docker 命令使用代理 例如我想在使用使用 do…