[Linux][网络][TCP][三][超时重传][快速重传][SACK][D-SACK][滑动窗口]详细讲解

news2024/12/22 18:25:41

目录

  • 1.超时重传
    • 1.什么是超时重传?
    • 2.超时时间是如何确定的?
  • 2.快速重传
  • 3.SACK
  • 4.D-SACK
    • 1.ACK丢失
    • 2.网络延迟
  • 5.滑动窗口
    • 0.问题抛出
    • 1.发送方的滑动窗口
    • 2.如何表示发送方的四个部分?
    • 3.接收方的滑动窗口
    • 4.滑动窗口的完善理解


1.超时重传

1.什么是超时重传?

  • 在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的ACK确认应答报文,就会重发该数据

  • TCP在两种情况下会触发超时重传:

    • 确认应答丢失
    • 数据包丢失
      请添加图片描述
  • 当出现丢包时,客户端(发送方)是无法辨别是发送的数据包丢失了,还是对方发来的确认应答报文丢失了,因为这两种情况下发送方都收不到对方发来的响应报文,此时客户端(发送方)就只能进行超时重传

  • 如果是服务器(接收方)确认应答报文丢失而导致发送方进行超时重传,此时服务器(接收方)就会再次收到一个重复的报文数据,但此时也不用担心,接收方可以根据报头当中的32位序列号来判断曾经是否收到过这个报文,从而达到报文去重的目的

  • 需要注意的是,当发送缓冲区当中的数据被发送出去后,操作系统不会立即将该数据从发送缓冲区当中删除或覆盖,而会让其保留在发送缓冲区当中,以免需要时进行超时重传,直到收到该数据的响应报文后,发送缓冲区中的这部分数据才可以被删除或覆盖

2.超时时间是如何确定的?

  • 超时重传时间是以RTO(Retransmission Timeout 超时重传时间)表示
  • 如果超时重传的时间过长或过短会发生什么情况呢?
    • 超时重传的时间设置的太长,会导致丢包后对方长时间收不到对应的数据,进而影响整体重传的效率
    • 超时重传的时间设置的太短,会导致对方收到大量的重复报文,可能对方发送的响应报文还在网络中传输而并没有丢包,但此时发送方就开始进行数据重传了,并且发送大量重复报文会也是对网络资源的浪费
  • TCP为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间
    • Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍
    • 如果重发一次之后, 仍然得不到应答, 等待 2*500ms后再进行重传
    • 如果仍然得不到应答, 等待 4*500ms 进行重传,依次类推,以指数形式递增
    • 累计到一定的重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接

2.快速重传

  • TCP 还有另外一种快速重传机制,它不以时间为驱动,而是以数据驱动重传
    • 快速重传的工作方式是当收到三个相同的ACK报文时,会在定时器过期之前,重传丢失的报文段
  • 快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题
    • 就是重传的时候,是重传之前的一个,还是重传所有的问题
    • 为了解决不知道该重传哪些TCP报文,于是就有SACK方法
      请添加图片描述

3.SACK

  • 还有一种实现重传机制的方式叫:SACK(Selective Acknowledgment 选择性确认)
  • 这种方式需要在TCP头部选项字段里加一个SACK的东西,它可以将缓存的地图发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据
  • 如下图,发送方收到了三次同样的ACK确认报文,于是就会触发快速重发机制,通过SACK信息发现只有200~299这段数据丢失,则重发时,就只选择了这个TCP段进行重发
    请添加图片描述

4.D-SACK

  • 其主要使用了SACK来告诉发送方有哪些数据被重复接收了

1.ACK丢失

请添加图片描述

  • 接收方发给发送方的两个ACK确认应答都丢失了,所以发送方超时后,重传第⼀个数据包(3000 ~ 3499)
  • 于是接收方发现数据是重复收到的,于是回了⼀个 SACK = 30003500,告诉发送方30003500的数据早已被接收了,因为ACK都到了 4000了,已经意味着4000之前的所有数据都已收到,所以这个SACK就代表着D-SACK
  • 这样发送方就知道了,数据没有丢,是接收方的ACK确认报文丢了

2.网络延迟

请添加图片描述

  • 数据包(1000~1499)被网络延迟了,导致发送方没有收到Ack 1500的确认报文
  • 而后面报文到达的三个相同的ACK确认报文,就触发了快速重传机制,但是在重传后,被延迟的数据包(1000~1499)又到了接收方
  • 所以接收方回了⼀个 SACK=1000~1500,因为ACK已经到了3000,所以这个SACK是D-SACK,表示收到了重复的包
  • 这样发送方就知道快速重传触发的原因不是发出去的包丢了,也不是因为回应的ACK包丢了,而是因为网络延迟了
  • 可见,D-SACK有这么几个好处
    • 可以让发送方知道,是发出去的包丢了,还是接收方回应的ACK包丢了
    • 可以知道是不是发送方的数据包被网络延迟了
    • 可以知道网络中是不是把发送方的数据包给复制了

5.滑动窗口

0.问题抛出

  • 我们都知道TCP是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个

    • 这种方式的缺点是效率比较低
  • 这样的传输方式有一个缺点:数据包的往返时间越长,通信的效率就越低
    请添加图片描述

  • 为解决这个问题,TCP引入了窗口这个概念,即使在往返时间较长的情况下,它也不会降低网络通信的效率

  • 那么有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值

  • 窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除

  • 假设窗口大小为3个TCP段,那么发送方就可以**「连续发送」** 3个TCP段,并且中途若有ACK丢失,可以通过「下一个确认应答进行确认」

    • 图中的ACK 600确认应答报文丢失,也没关系,因为可以通过下⼀个确认应答进行确认,只要发送方收到了ACK 700确认应答,就意味着700之前的所有数据「接收方」都收到了,这个模式就叫**累计确认或者累计应答**
      请添加图片描述
  • 窗口大小由哪一方决定?

    • TCP报头里有一个字段叫Window,也就是窗口大小
    • 这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据,于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来
    • 所以,通常窗口的大小是由接收方的窗口大小来决定的
    • 发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据
  • 滑动窗口既想给对方推送更多的数据,又想要保证对方来得及接收

  • TCP使用滑动窗口进行流量控制,实际上是对发送方数据流量的控制

1.发送方的滑动窗口

  • 下图就是发送方缓存的数据,根据处理的情况分成四个部分,其中深蓝色方框是发送窗口,紫色方框是可用窗口:
    请添加图片描述

  • 在下图,当发送方把数据全部都一下发送出去后,可用窗口的大小就为0了,表明可用窗口耗尽,在没收到ACK确认之前是无法继续发送数据了
    请添加图片描述

  • 在下图,当收到之前发送的数据3236字节的ACK确认应答后,如果发送窗口的大小没有变化,则滑动窗口往右边移动5个字节,因为有5个字节的数据被应答确认,接下来5256字节又变成了可用窗口,那么后续也就可以发送52~56这5个字节的数据了
    请添加图片描述

2.如何表示发送方的四个部分?

  • TCP滑动窗口方案使用三个指针来跟踪在四个传输类别中的每一个类别中的字节
    • 其中两个指针是绝对指针(指特定的序列号)
    • 一个是相对指针(需要做偏移)
  • SND.WND**:**表示发送窗口的大小(大小是由接收方指定的)
  • SND.UNA**:**是一个绝对指针,它指向的是已发送但未收到确认的第一个字节的序列号
  • SND.NXT**:**也是一个绝对指针,它指向未发送但可发送范围的第一个字节的序列号
  • 指向#4的第一个字节是个相对指针,它需要 SND.UNA 指针加上SND.WND大小的偏移量,就可以指向#4的第一个字节
  • 那么可用窗口大小的计算就可以是:
    • 可用窗口大小 = SND.WND - (SND.NXT - SND.UNA)
      请添加图片描述

3.接收方的滑动窗口

  • 接收窗口相对简单一些,根据处理的情况划分成三个部分,使用两个指针进行划分:
    • RCV.WND**:**表示接收窗口的大小,它会通告给发送⽅
    • RCV.NXT**:**是一个指针,它指向期望从发送方发送来的下一个数据字节的序列号
    • 指向#4的第一个字节是个相对指针,它需要RCV.NXT指针加上 RCV.WND 大小的偏移量,就可以指向#4 的第一个字节了
      请添加图片描述

4.滑动窗口的完善理解

  • 滑动窗口的本质:指针或者下标
  • 滑动窗口向右移动吗?
    • 不一定
  • 滑动窗口可以为0吗?
    • 可以
  • 滑动窗口如果一直向右滑动,是否会出现越界问题?
    • 不会,虽然缓冲区物理层面上是数组,但是逻辑层面上是环形数组,到数组结尾的时候或通过模运算等处理手段回到开头

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1647094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

14【PS作图】像素画尺寸大小

【背景介绍】本节介绍像素图多大合适 下图是160*144像素大小,有一个显示文本的显示器,还有一个有十几个键的键盘 像素画布尺寸 电脑16像素,但还有一个显示屏 下图为240*160 在场景素材,和对话素材中,用的是不同尺寸的头像,对话素材中的头像会更清楚,尺寸会更大 远处…

五月节放假作业讲解

目录 作业1: 问题: 结果如下 作业2: 结果: 作业1: 初始化数组 问题: 如果让数组初始化非0数会有问题 有同学就问了,我明明已经初始化定义过了,为啥还有0呀 其实这种初始化只会改变第一个…

服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE漏洞

#知识点: 1、数据库-Redis-未授权RCE&CVE 2、数据库-Couchdb-未授权RCE&CVE 3、数据库-H2database-未授权RCE&CVE#章节点: 1、目标判断-端口扫描&组合判断&信息来源 2、安全问题-配置不当&CVE漏洞&弱口令爆破 3、复现对象-数…

强化学习:时序差分法【Temporal Difference Methods】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程,个人觉得赵老师的课件深入浅出,很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实例分析:GridWorld…

《Video Mamba Suite》论文笔记(4)Mamba在时空建模中的作用

原文翻译 4.4 Mamba for Spatial-Temporal Modeling Tasks and datasets.最后,我们评估了 Mamba 的时空建模能力。与之前的小节类似,我们在 Epic-Kitchens-100 数据集 [13] 上评估模型在zero-shot多实例检索中的性能。 Baseline and competitor.ViViT…

解决Win10家庭版找不到组策略gpedit.msc的·方法

因为电脑出问题,一开机就会自动开启ie浏览器,所以就想找有没有方法解决,然后就了解到了gpedit.msc的作用以及相关的一些方法,也是为之后也许有人遇到相同的问题有个提供方法的途径。 首先我们直接运行gpedit.msc 是找不到的&…

Win10彻底关闭Antimalware Service Executable解决cpu内存占用过高问题

1,win键R打开运行输入gpedit.msc,即可打开本地组策略编辑器 2.依次打开:管理模板----windows组件----windows Defender-----实时保护 3.然后鼠标双击右侧的“不论何时启用实时保护,都会启用进程扫描。勾选 已禁用,就可…

embedding介绍和常用三家模型对比

Embedding(嵌入)是一种在计算机科学中常用的技术,尤其是在自然语言处理(NLP)领域。在NLP中,embedding通常指的是将文本中的单词、短语或句子转换为固定维度的向量(vector)。这些向量代表了文本中的语义和上下文信息。 1.embedding 介绍 1.1 为什么需要Embedding? 在…

基于鸢尾花数据集的四种聚类算法(kmeans,层次聚类,DBSCAN,FCM)和学习向量量化对比

基于鸢尾花数据集的四种聚类算法(kmeans,层次聚类,DBSCAN,FCM)和学习向量量化对比 注:下面的代码可能需要做一点参数调整,才得到所有我的运行结果。 kmeans算法: import matplotlib.pyplot a…

JavaScript之数据类型(2)——复杂类型(object)

object的介绍: 我对于object的理解是和C/C中的结构体一样,是一个自定义的数据类型,我们可以通过多个简单的数据类型来定义一个便于我们使用的新的数据类型。 在网上某佬对于其解释如下: Object类型,我们也称为一个对象…

ubuntu 安装单节点HBase

下载HBase mkdir -p /home/ellis/HBase/ cd /home/ellis/HBase/ wget https://downloads.apache.org/hbase/2.5.8/hbase-2.5.8-bin.tar.gz tar -xvf hbase-2.5.8-bin.tar.gz安装java jdk sudo apt install openjdk-11-jdksudo vim /etc/profileexport JAVA_HOME/usr/lib/jvm/…

设计模式之传输对象模式

在编程江湖里,有一种模式,它如同数据的“特快专递”,穿梭于系统间,保证信息的快速准确送达,它就是——传输对象模式(Data Transfer Object, DTO)。这不仅仅是数据的搬运工,更是提升系…

bfs之走迷宫

文章目录 走迷宫广度优先遍历代码Java代码打印路径 走迷宫 给定一个 nm 的二维整数数组,用来表示一个迷宫,数组中只包含 0或 1,其中 0表示可以走的路,1表示不可通过的墙壁。 最初,有一个人位于左上角 (1,1) 处&#…

MATLAB绘制蒸汽压力和温度曲线

蒸汽压力与温度之间的具体关系公式一般采用安托因方程(Antoine Equation),用于描述纯物质的蒸汽压与温度之间的关系。安托因方程的一般形式如下: [\log_{10} P A - \frac{B}{C T}] 其中, (P) 是蒸汽压&#xff08…

syncGradle项目时报错Unknown Kotlin JVM target: 22

解决方案1 定位到build.gradle.kts的出问题行,将其注释掉然后把sourceCompatibility行也注释掉重新sync. 这样会自动使用默认兼容的版本 你也可以根据文档手动解决兼容问题2 Configure a Gradle project | Kotlin Documentation (kotlinlang.org) ↩︎ Compatibil…

[VulnHub靶机渗透] Hackademic: RTB1

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

一、Vagrant搭建相关环境

目录 一、创建Vagrant相关环境1.下载安装VirtualBox2.在BlOS中设置CPU虚拟化3.使用Vagrant新建linux虚拟机3.1下载Vagrant3.2Vagrant官方镜像仓库3.3使用Vagrant初始化一个centos7的虚拟机 4.设置固定ip地址 二、安装docker1.按照docker 三、docker安装一些中间件1.mysql安装2.…

Elasticsearch:理解人工智能相似性搜索

理解相似性搜索(也称为语义搜索)的指南,这是人工智能最新阶段的关键发现之一。 最新阶段人工智能的关键发现之一是根据相似性搜索和查找文档的能力。相似性搜索是一种比较信息的方法,其基于含义而非关键字。 相似性搜索也被称为语…

【隧道篇 / WAN优化】(7.4) ❀ 01. 启动WAN优化 ❀ FortiGate 防火墙

【简介】几乎所有的人都知道,防火墙自带的硬盘是用来保存日志,以方便在出现问题时能找到原因。但是很少的人知道,防火墙自带的硬盘其实还有另一个功能,那就是用于WAN优化。 防火墙自带的硬盘 在FortiGate防火墙A、B、C、D系列&…

MWeb Pro for Mac:功能强大的Markdown博客编辑器

MWeb Pro for Mac是一款功能强大的Markdown博客编辑器,专为Mac用户设计,提供了一站式的博客写作和发布体验。这款软件不仅支持Markdown语法,还提供了丰富的编辑和排版功能,让用户能够轻松创建出精美的博客内容。 MWeb Pro的即时预…