TCP快速重传机制为啥出现重复ACK?

ops/2024/11/26 19:40:49/

TCP快速重传机制为啥出现重复ACK

简单来说,丢失数据包后发送方至少发了三个请求,每个请求返回接收方下一次期待的序列号ACK,也就是丢失数据包之前的一个正常请求的确认ACK值

在 TCP(Transmission Control Protocol,传输控制协议)的快速重传机制中,当接收方收到三次相同的 ACK(Acknowledgment,确认)值时就会触发快速重传,之所以会出现这种情况以及它的原理如下:

一、正常的 TCP 确认机制回顾

在 TCP 通信中,发送方发送数据报文段后,接收方会对收到的报文段进行确认,发送 ACK 报文告知发送方已成功接收对应的数据。正常情况下,接收方按照顺序接收报文段,每收到一个报文段就回复一个对应的 ACK,发送方根据 ACK 来判断数据是否被正确接收,进而决定是否继续发送后续报文段等操作。

二、出现三次相同 ACK 的原因

过程:

  • 数据丢失情况:假设发送方按顺序发送了报文段 1、报文段 2、报文段 3 等,其中报文段 2 在传输过程中丢失了(可能由于网络拥塞、链路故障等原因),接收方成功收到了报文段 1,但是一直没收到报文段 2,所以就没办法对报文段 3 及后续按顺序到达的报文段进行正常确认(因为 TCP 是面向字节流的可靠协议,要求按顺序接收数据)。

  • 重复 ACK 的产生:当接收方收到报文段 3 时,由于它期望收到的是报文段 2,此时接收方并不会对报文段 3 进行正常的按序确认(也就是不会确认报文段 3 对应的序列号等内容),而是会再次发送一个对报文段 1 最后一个字节的确认 ACK(这个 ACK 对应的序列号其实就是报文段 1 最后一个字节的序列号),意思是告诉发送方 “我还在等报文段 2 呢,前面的报文段 1 我已经收到了”。之后,如果发送方继续发送了报文段 4、报文段 5 等,只要报文段 2 没到,接收方每次收到新的报文段后,都会重复发送这个针对报文段 1 的 ACK,就这样,当发送方连续收到三个相同的 ACK(都是针对报文段 1 最后一个字节的确认 ACK)时,就可以推断出报文段 2 大概率是丢失了。

三、快速重传及后续处理

  • 快速重传触发:发送方一旦收到三次相同的 ACK,就不会傻傻地等到超时定时器到期(TCP 原本还有超时重传机制,如果等待足够长时间没收到 ACK 就重传数据,但超时时间相对较长),而是立即启动快速重传,重传那个被认为丢失的报文段(也就是上述例子中的报文段 2)。

  • 资源利用合理性分析:虽然表面上看好像重传了可能接收方已经收到的数据(比如接收方后续可能已经收到了报文段 2,只是发送方还没等到相应的 ACK 就触发了快速重传),但实际上这种机制是非常有必要且高效的。因为相比一直等到超时定时器到期再重传(超时时间往往较长,会造成传输效率低下、延迟增加等问题),快速重传能够更快地对可能丢失的数据进行补发,尽早恢复正常的传输秩序,从整体的传输效率和减少延迟角度来看,它所带来的收益远远大于偶尔重传可能已经收到的数据这种小 “浪费”,而且网络环境中数据真正丢失的情况还是比较常见的,快速重传机制多数时候是在做有效的补救工作。

所以,三次相同 ACK 的出现是因为接收方在期望的报文段未按序到达时,通过重复发送之前已正确接收报文段对应的 ACK 来提醒发送方有数据丢失,发送方据此来触发快速重传机制,以保障 TCP 传输的可靠性和高效性。

  • ACK也表示接收端下一次期望收到的序列号,就能解释为啥发送了后面的数据包,也可能返回前面丢失的确认应答。也能解释滑动窗口,不关心部分ACK信息丢失,只要确保最后一个ACK值,就能确定窗口中前部分请求接收到了


http://www.ppmy.cn/ops/136908.html

相关文章

Flutter:启动屏逻辑处理02:启动页

启动屏启动之后&#xff0c;制作一个启动页面 新建splash&#xff1a;view 视图中只有一张图片sliding.png就是我们的启动图 import package:flutter/material.dart; import package:get/get.dart; import index.dart; class SplashPage extends GetView<SplashController…

#Java-常用API-BigInteger、BigDecima、正则表达式

1.BigInteger BigInteger可以表示非常大范围的整数&#xff0c;理论上来说无限大 a.构造方法 构造方法说明public BigInteger(int num, Random rnd)获取随机大整数,范围 : [0 ~ 2的num次方 - 1]public BigInteger(String val)获取指定的大整数public BigInteger(String val,…

机器学习3

KNN算法分类 K-近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;,根据K个邻居样本的类别来判断当前样本的类别;如果一个样本在特征空间中的k个最相似(最邻近)样本中的大多数属于某个类别&#xff0c;则该类本也属于这个类别 欧氏距离和曼哈顿距离&am…

微信小程序组件详解:text 和 rich-text 组件的基本用法

微信小程序组件详解:text 和 rich-text 组件的基本用法 引言 在微信小程序的开发中,文本展示是用户界面设计中不可或缺的一部分。无论是简单的文本信息,还是复杂的富文本内容,text 和 rich-text 组件都能够帮助我们实现这些需求。本文将详细介绍这两个组件的基本用法,包…

《探索 C++:一门强大且多功能的编程语言》

《探索 C&#xff1a;一门强大且多功能的编程语言》 在编程的广阔世界里&#xff0c;C 无疑是一颗璀璨的明星&#xff0c;它以其高性能、丰富的特性和广泛的应用领域&#xff0c;吸引着无数开发者投身其中。今天&#xff0c;就让我们一同深入探索一下这门令人着迷的编程语言吧。…

AI Prompt Engineering

AI Prompt Engineering 简介 Prompt Engineering, 提示工程&#xff0c;是人工智能领域的一项技术&#xff0c;它旨在通过设计高效的提示词&#xff08;prompts&#xff09;来优化生成式 AI&#xff08;如 GPT、DALLE 等&#xff09;的输出。提示词是用户与生成式 AI 交互的核…

Claude Opus MetaPrompt 系统详解

Claude Opus MetaPrompt 系统详解 简介 MetaPrompt系统是由Anthropic提出的&#xff0c;旨在帮助用户为AI助手Claude生成高质量的提示。它指导用户定义任务和变量、结构化指令和细化输出。 具体内容 特点 主要针对Claude 3 Opus版本&#xff0c;并且适用于单轮对话。 核心…

安卓手机5G网络频繁掉4G 问题解决 手机5G网络优化方案

问题环境 在某个长期停留的位置&#xff08;例如&#xff1a;躺平&#xff09;使用手机时网络突然从5G跳到4G&#xff0c;偶尔跳来跳去导致网络体验很差&#xff0c;经过调整5G网络情况下网速及其他体验都要更好&#xff0c;基于这样的情况使用一种简单的操作&#xff0c;锁定5…