当前位置: 首页 > news >正文

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

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值,就能确定窗口中前部分请求接收到了

相关文章:

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

TCP快速重传机制为啥出现重复ACK 简单来说,丢失数据包后发送方至少发了三个请求,每个请求返回接收方下一次期待的序列号ACK,也就是丢失数据包之前的一个正常请求的确认ACK值 在 TCP(Transmission Control Protocol,传…...

SSM--SpringMVC复习(二)

请求 URL匹配: RequestMapping RequestMapping 负责将请求映射到对应的控制器方法上。 RequestMapping 注解可用于类或方法上。用于类上,表示类中的所有响应请求的方法都以该地址作为父路径。 在整个 Web 项目中,RequestMapping 映射的请求…...

C语言蓝桥杯组题目

系列文章目录 文章目录 系列文章目录前言题目第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少?思路 第二题: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少…...

【解决】Unity TMPro字体中文显示错误/不全问题

问题描述:字体变成方块 原因:字体资源所承载的长度有限 1.找一个中文字体放入Assets中 2.选中字体创建为TMPro 字体资源 3.选中创建好的字体资源(蓝色的大F) 在右边的属性中找到Atlas Width h和 Atlas Heigth,修改的大一点&…...

【Threejs进阶教程-着色器篇】9.顶点着色器入门

【Threejs进阶教程-着色器篇】9.顶点着色器入门 本系列教程第一篇地址,建议按顺序学习认识顶点着色器varying介绍顶点着色器与片元着色器分别的作用Threejs在Shader中的内置变量各种矩阵gl_Position 尝试使用顶点着色器增加分段数增强效果 制作平面鼓包效果鼓包效果…...

质量留住用户:如何通过测试自动化提供更高质量的用户体验

在当今竞争异常激烈的市场中,用户手头有无数种选择,但有一条真理至关重要: 质量留住用户。 产品的质量,尤其是用户体验 (UX),直接决定了客户是留在您的品牌还是转而选择竞争对手。随着业务的发展,出色的用户…...

【CSP CCF记录】201803-1第13次认证 跳一跳

题目 样例输入 1 1 2 2 2 1 1 2 2 0 样例输出 22 思路 没有技术含量的一道题,解题的关键是理解游戏规则。用state标记跳跃状态,以下是对游戏规则的分析: 1. state1,跳到方块上但没跳到中心,得1分 2. state2&#xf…...

详解Qt 中使用虚拟键盘(软键盘qtvirtualkeyboard)

文章目录 详解 Qt 中使用虚拟键盘(软键盘:QtVirtualKeyboard)1. 虚拟键盘简介1.1 虚拟键盘的应用场景 2. 安装和配置2.1 安装 QtVirtualKeyboard2.2 配置环境变量 3. 使用虚拟键盘3.1 示例代码main.cppwidget.hwidget.cpp 4. 总结 详解 Qt 中…...

cocoscreater3.8.4生成图集并使用

1.安装texturepacker,去官网下载https://www.codeandweb.com/texturepacker 2.将图片拖动进来,即可自动生成精灵表,这里输出选用cocos2d-x,打包用免费版的“基本”就行,高级模式是收费的,然后点击“发布精…...

IDEA如何快速地重写方法,如equals、toString等

前言 大家好,我是小徐啊。我们在使用IDEA的时候,有时候是需要重写equals和toString等方法的。这在IDEA中已经很方便的给我们准备好了快速的操作了。今天就来讲解一下。 如何重写 首先,打开要重写方法的文件,让鼠标定位到这个文…...

网络安全——SpringBoot配置文件明文加密

一、前言 在日常开发中,项目中会有很多配置文件。比如SpringBoot项目核心的数据库配置、Redis账号密码配置都在properties、yml配置文件 中。 如果这些信息以明文的方式存储,你的电脑被拿去修理,就会容易泄露,一旦被其他人获取到…...

LightRAG开源了…结合本地ollama实现股票数据接口Akshare智能问答

LightRAG是由香港大学研究团队推出的一种检索增强生成(Retrieval-Augmented Generation, RAG)系统。该系统通过整合图结构索引和双层检索机制,显著提升了大型语言模型在信息检索中的准确性和效率。LightRAG 不仅能够捕捉实体间的复杂依赖关系…...

【PCB设计】AD16教程:分配位号

1、前提条件 确保已经基本画完原理图 2、点击【Tools-Annotate Schematics】 3、依次点击【Reset All】、【Update Changes Lise】、【Close】 最后位号就被自动分配好了...

ElasticSearch7.x入门教程之索引概念和基础操作(三)

文章目录 前言一、索引基本概念二、索引基本使用elasticsearch-head插件Kibana使用 总结 前言 要想熟悉使用ES的索引,则必须理解索引相关的概念,尤其是在工作当中。 在此记录,方便开展工作。 一、索引基本概念 尽量以通俗的话语。 1、集群…...

Python后端flask框架接收zip压缩包方法

一、用base64编码发送,以及接收 import base64 import io import zipfile from flask import request, jsonifydef unzip_and_find_png(zip_data):# 使用 BytesIO 在内存中处理 zip 数据with zipfile.ZipFile(io.BytesIO(zip_data), r) as zip_ref:extracted_paths…...

机器学习中数据集Upsampling和Downsampling是什么意思?中英文介绍

对GPT4o大模型的Prompt如下: Datasets marked with ↓ are downsampled from their original datasets, datasets marked with ↑ are upsampled.这里的上采样和下采样是什么意思 内容援引自:paper (https://allenai.org/papers/tulu-3-repor…...

浏览器控制台中使用ajax下载文件(没有postman等情况下)

有时候,可能电脑里面没有postman(比如内网),然后又需要导出一些文件,前端又没有提供相应的功能(比如循环调用导出等),这时候我们就可以通过在控制台写代码的方式来实现了。这个还是在…...

完全二叉树的基本操作(顺序存储)

#include<iostream> #include<math.h> using namespace std;#define MaxSize 100 struct TreeNode {int value;bool isEmpty;//判断该节点是否为空 }t[MaxSize];/** *定义一个长度位MaxSize的数组&#xff0c;按照从上到下&#xff0c; *从左到右的方式依次存储完全…...

【HTTP】http与https

http与https的关系 应用层协议&#xff1a; http&#xff08;HyperText Transfer Protocol&#xff09;超文本传输协议&#xff1b; https&#xff08;Hypertext Transfer Protocol Secure&#xff09;超文本传输安全协议&#xff1b; 传输层协议&#xff1a;TCP&#xff08;Tr…...

【Git多人开发与协作之团队的环境搭建】

Git多人开发与协作之团队的环境搭建 新的改变1. Git 的用途2. 分支的概念与类型3. HEAD 和分支指针如何查看 HEAD 指向的位置&#xff1a; 4. 常见的 Git 操作5. 常见问题与解决方法总结GitHub 项目获取实操在新电脑上运行 Git1. 安装 Git2. 配置用户名和邮箱3.配置 Git 和 SSH…...

茉莉花插件:如何用3分钟完成中文文献元数据智能抓取与PDF大纲生成

茉莉花插件&#xff1a;如何用3分钟完成中文文献元数据智能抓取与PDF大纲生成 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 茉莉…...

I3C协议学习总结

I3C可以使用推挽式&#xff0c;节省功耗&#xff0c;速度更快SDR 单数据传输速率&#xff0c; SCL时钟频率可达到12.5MHz所有符合I3C标准的设备都必须要拥有一个总线特性寄存器1. I3C 协议模式概览 (Section 5)文档首先列出了 I3C 支持的几种主要通信模式&#xff1a;SDR (Sing…...

MissionPlanner地面站调试Pixhawk:除了基础校准,你的F450还能设置这些高级功能

MissionPlanner地面站进阶指南&#xff1a;解锁Pixhawk飞控的隐藏潜力 当你已经能够熟练完成F450无人机的基础校准&#xff0c;让四轴稳稳升空只是起点而非终点。MissionPlanner作为Pixhawk飞控的瑞士军刀&#xff0c;藏着许多被普通教程忽略的进阶功能——这些功能往往决定着你…...

【并发心法】别用 volatile 骗自己了!撕碎裸机并发的伪安全,用 C++ Atomics 与内存屏障镇压“乱序执行”的底层叛乱

摘要&#xff1a;在嵌入式 C/C 开发中&#xff0c;99% 的工程师误以为 volatile 是解决中断与主循环并发冲突的万能解药。本文将无情揭露这一长达数十年的认知毒瘤。我们将带你深入现代编译器&#xff08;GCC/Clang&#xff09;的优化黑盒与 ARM Cortex 高级内核的流水线深处&a…...

单片机入门到实践:51系列开发全攻略

单片机从零入门到项目实践的技术路径1. 单片机学习基础准备1.1 必备知识体系学习单片机开发需要构建以下基础知识框架&#xff1a;电路基础&#xff1a;包括欧姆定律、基尔霍夫定律等基本电路理论数字电路&#xff1a;逻辑门电路、时序电路、组合逻辑电路等模拟电路&#xff1a…...

原创:黄大年茶思屋难题揭榜第141期|5道核心题精简公开·未获技术反馈求指正

黄大年茶思屋难题揭榜第141期&#xff5c;5道核心题精简公开未获技术反馈求指正 作者&#xff1a;华夏之光永存 摘要 这五道题我们已完整解题并提交黄大年茶思屋难题揭榜&#xff0c;最终被退回&#xff0c;但平台未给出任何具体技术驳回意见、未指明缺陷、未提供修改方向。我们…...

毕业设计实战:基于SSM的学生宿舍设备报修管理系统设计与实现全攻略

毕业设计实战&#xff1a;基于SSM的学生宿舍设备报修管理系统设计与实现全攻略 在开发“学生宿舍设备报修管理系统”这套毕设时&#xff0c;我曾因“故障上报与维修派单流程脱节”踩过一个关键坑。初期设计时&#xff0c;我将“学生报修”和“维修人员接单”视为两个独立的模块…...

Modules 模块化:头文件地狱真的要终结了吗?我持怀疑态度

各位来宾&#xff0c;各位技术同仁&#xff0c;大家好&#xff01;今天我们齐聚一堂&#xff0c;探讨一个在C社区引发广泛讨论、充满期待又饱含争议的话题&#xff1a;C模块化。特别是关于“头文件地狱真的要终结了吗&#xff1f;”这个问题&#xff0c;我深知在座的许多人&…...

手把手教你排查PCIe设备异常:从`Malformed TLP`错误看MPS/MRRS配置

深度解析PCIe设备异常&#xff1a;从Malformed TLP错误到MPS/MRRS调优实战 当你在嵌入式Linux系统中接入一块高性能FPGA加速卡时&#xff0c;突然在系统日志中发现Malformed TLP错误&#xff0c;设备性能骤降甚至完全无法工作——这种场景对任何嵌入式开发者都不陌生。PCIe总线…...

AI 编程时代来了:为什么每个开发者都要学会用 AI 写代码

2026 年&#xff0c;不会用 AI 写代码的开发者&#xff0c;就像 2010 年不会用 Google 的程序员一样——不是不能工作&#xff0c;而是效率会被远远甩在后面。先看一组数字 根据 GitHub 2026 年开发者调查报告&#xff1a; 73% 的开发者在工作中使用了 AI 编程工具55% 的代码由…...