TCP重传机制详解——02SACK

文章目录

  • TCP重传机制详解——02 SACK
    • SACK是什么?
    • 为什么要有SACK?
    • 实际场景
      • 抓包具体显示信息
      • 流程
    • 实战抓包讲解
      • SACK关闭场景下,三次重复ACK后会快速重传
      • SACK打开但是不携带SACK块信息场景下,三次重复ACK也不会快速重传
      • SACK打开并且携带SACK块信息场景下,两次重复ACK也会快速重传
    • SACK reneging
      • 1. 故意不发送SACK
      • 2.SACK选项丢失
      • 3.丢弃已确认接收的数据包
    • 总结
    • REF

TCP重传机制详解——02 SACK

SACK是什么?

Selective Acknowledgment有选择的ACK,显而易见这是在ACK的基础上的扩展。在ACK包上会携带SACK选项,表示一个接收范围,也称之为"空洞"。

为什么要有SACK?

传统的TCP在丢包时会采用超时重传的方式,即等待一段时间后重传丢失的数据段。而使用SACK机制,接收端可以选择性地向发送端反馈已经成功接收的数据段范围,从而使发送端能够更精确地知道哪些数据段需要重传,提高了重传的效率。
SACK机制可以提高TCP的性能和可靠性,特别是在丢包较多或网络拥塞的情况下。

实际场景

在这里插入图片描述

TCP选项,在三次握手的时候,进行协商是否支持SACK选项(必须双方支持才可以使用),协商好则会在连接建立后数据从传输的时候决定是否携带SACK块信息。

抓包具体显示信息

SACK的抓包显示

  1. 报文显示SLE和SRE就是表示是SACK的块信息了,SLE即SACK left edge表示左边沿,SRE即SACK right edge右边沿。
  2. ACK报文不消耗序列号因此不会重传,所以可以看到如果没有确认就会在后面的ACK中继续去附加之前的SACK信息
  3. SACK块信息个数一定是有限的,因为报文就是有大小限制(MSS)

流程

接收端根据接收到的数据的序号,回复ACK,携带已经确认序号的信息块。
例如:收到了P(25-30),则回复SACK(25-31),发送端根据接收到的SACK块信息来重传数据(填洞)

实战抓包讲解

SACK关闭场景下,三次重复ACK后会快速重传

/proc/aya/net/ipv4/tcp_sack=0
在这里插入图片描述
SACK的"bug"(不是真正的bug,是缺点):SACK开启但是不携带SACK选项信息的场景下比不打开SACK场景的效率还要低

SACK打开但是不携带SACK块信息场景下,三次重复ACK也不会快速重传

/proc/aya/net/ipv4/tcp_sack=1,但是不携带SACK块信息
在这里插入图片描述

SACK打开并且携带SACK块信息场景下,两次重复ACK也会快速重传

是不是被标题吓到了?(嘿嘿,不小心做了标题党),这里其实只是抓包看起来是dup ACK两次,实际上SACK的判定条件是不一样的!

其实主要是因为SACK开启下的dup ACK的判定条件是不一样的。这也是为什么dup ACK三次(不携带SACK块)也不会触发快速重传!原因就是:SACK对于dup ACK的认定不是判断ack number的不同,而是根据SACK选项块信息的个数(>=3个)
在这里插入图片描述

SACK reneging

SACK reneging,即SACK违背承诺,或者SACK撤销确认。
SACK seneging是指在TCP通信中,接收端故意不发送SACK选项或者SACK选项丢失或者丢弃已确认成功接收的数据包,从而导致发送端错误地认为数据包丢失,触发不必要的重传行为。即之前确认的SACK选项信息和后面的ACK或者SACK选项信息产生了冲突,导致发送端误认为数据包丢失

1. 故意不发送SACK

攻击者利用TCP协议的漏洞:攻击者可能会发送特制的TCP数据包,故意不发送SACK选项,以此来干扰正常的数据传输,导致发送端频繁地进行不必要的重传,从而消耗网络资源和带宽。

2.SACK选项丢失

网络设备或防火墙的干预:有些网络设备或防火墙可能会过滤或修改TCP选项字段,导致SACK选项被删除或篡改,从而触发SACK seneging。
还有一种有可能导致SACK reneging:

3.丢弃已确认接收的数据包

在这里插入图片描述

总结

场景触发条件
/proc/aya/net/ipv4/tcp_sack=0dup ACK三次后会触发快速重传
/proc/aya/net/ipv4/tcp_sack=1但不带SACK块信息dup ACK三次后会触发快速重传
/proc/aya/net/ipv4/tcp_sack=1且携带SACK块信息SACK块个数三个后会触发快速重传

REF

SACK下的重传
SACK reneging

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

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

相关文章

mysql分页查询多用GitCode平台

目录 一、在GitCode平台AI搜索结果(这个更优) 二、在百度搜索输入“mysql Java分页查询”的输出结果: 三、推荐的文章 四、GitCode的使用 1)如搜索jdk11可以直接下载jdk11的包 2)搜索开源项目 3)如搜…

修改Jupyter Notebook的默认路径,以及在PowerShell中自定义其启动路径

修改Jupyter Notebook的默认路径,以及在PowerShell中自定义其启动路径 设置 Jupyter Notebook 配置文件,修改默认路径要在PowerShell中设置自定义的启动脚本,以确保Jupyter Notebook能够自动定位到当前路径设置后的效果 在使用Jupyter Notebo…

API网关-Apisix路由配置教程(数据编辑器方式)

文章目录 前言一、端口修改1. apisix 端口修改2. dashboard 端口修改3. 登录密码修改 二、常用插件介绍1. 常用转换插件1.1 proxy-rewrite插件1.1.1 属性字段1.1.2 配置示例 2. 常用认证插件2.1 key-auth插件2.1.1 消费者端字段2.1.2 路由端字段2.1.3 配置示例 2.2 basic-auth插…

37、Linux中Xsync数据同步备份工具

37、Linux中Xsync数据同步备份工具 一、介绍二、配置集群hostname三、修改xsync文件四、赋权五、安装Rsync六、验证一七、配置免密登录1、生成rsa密钥2、copy机器自身公钥到目标机器3、.ssh/文件目录赋权 八、验证二 ⚠️ 注:本文全程在普通用户下操作,…

基于RK3588多can口多串口机器人全功能板

RK3588机器人控制器有五大技术优势 1. 内置多种功能强大的嵌入式硬件引擎,支持8K60fps 的 H.265 和 VP9 解码器、8K30fps 的 H.264 解码器和 4K60fps 的 AV1 解码器;支持 8K30fps 的 H.264 和H.265 编码器,高质量的 JPEG 编码器/解码器&…

网络探测工具Nmap介绍

1. Nmap简介 Nmap是一款用于网络发现和安全审计的网络安全工具。可用于列举网络主机清单、管理服务升级调度、监控主机、监控主机服务运行状况、检测目标主机是否在线和端口开放情况、侦测运行的服务类型及版本信息、侦测操作系统与设备类型等。 2. 命令大纲 3. 命令详细介绍…

基于 Linux 的更新版 MaxPatrol VM 可扫描 Windows

👾 MaxPatrol VM 2.1 是俄罗斯唯一一款可以安装在 Linux 上并以审计和五重测试模式扫描 Windows 主机(甚至是旧版本)的漏洞管理产品。 让我们告诉你更新后的 MaxPatrol VM 还有哪些有用的功能: 1. 由于采用了新的数据存储模式&a…

【物联网开源平台】tingsboard安装与编译

别看这篇了,这篇就当我的一个记录,我有空我再写过一篇,编译的时候出现了一个错误,然后我针对那一个错误执行了一个命令,出现了绿色的succes,我就以为整个tingsboard项目编译成功了,后面发现的时候&#xff…

dubbo 源码系列之-集群三板斧---负载均衡(二)

在上一课时我们了解了 LoadBalance 接口定义以及 AbstractLoadBalance 抽象类的内容,还详细介绍了 ConsistentHashLoadBalance 以及 RandomLoadBalance 这两个实现类的核心原理和大致实现。本课时我们将继续介绍 LoadBalance 的剩余三个实现。 LeastActiveLoadBala…

C语言从入门到实战----数据在内存中的存储

1. 整数在内存中的存储 在讲解操作符的时候,我们就讲过了下⾯的内容: 整数的2进制表⽰⽅法有三种,即 原码、反码和补码 有符号的整数,三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤…

[蓝桥杯 2022 省 A] 求和

[蓝桥杯 2022 省 A] 求和 题目描述 给定 n n n 个整数 a 1 , a 2 , ⋯ , a n a_{1}, a_{2}, \cdots, a_{n} a1​,a2​,⋯,an​, 求它们两两相乘再相加的和,即 S a 1 ⋅ a 2 a 1 ⋅ a 3 ⋯ a 1 ⋅ a n a 2 ⋅ a 3 ⋯ a n − 2 ⋅ a n − 1 a n − 2 ⋅ a…

【MD】激光驱动原子动力学的全尺寸从头算模拟

Zeng Q, Chen B, Zhang S, et al. Full-scale ab initio simulations of laser-driven atomistic dynamics[J]. npj Computational Materials, 2023, 9(1): 213.核心研究内容: 本文研究了激光驱动的原子动力学的全尺度从头算模拟。研究的重点是探讨在极端条件下材料…

Linux基础系统设置与备份策略

文章目录 Linux基础系统设置网络设置(手动设置与DHCP自动获取):nmcli、hostname日期与时间设置:timedatectl、ntpdate语系设置防火墙简易设置 Linux 服务器硬件数据的收集:dmidecode、lspci、lsusb、iostat了解磁盘的健康状态Linux 备份要点确…

【MySQL】2.MySQL数据库的基本操作

目录 数据库基本操作 查看数据库信息 查看数据库结构 显示数据表的结构(字段) 常用的数据类型 数据库管理操作 SQL语句概述 SQL分类 1.DDL:数据定义语言 1.1创建数据库和表 创建数据库 创建数据表 1.2删除数据库和表 删除数据表…

vscode c++环境配置

1.基础软件安装 安装Visual Studio Code. 安装C拓展。点击在vscode界面最左侧的Extensions图标(打开快捷键:ctrlshiftX),搜索“C/C”,点击进行安装。 确保已安装gcc. 一般ubuntu系统会预装gcc.在终端窗口中输入如下…

Linux系统使用Docker部署Jupyter Notebook结合内网穿透实现公网访问本地笔记

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook,并结合cpolar内网穿透…

《早起的奇迹》要么躺在床上等待生活的暴击,要么早起创造奇迹 - 三余书屋 3ysw.net

精读文稿 今天我们讲述的是关于《早起的奇迹》。通过神奇的早起,我们可以获得改变人生的力量。首先我要给你讲一个故事,这个故事的主人公是一个年轻人,他在少年时就取得了巨大的成就,在15岁时他已经拥有了自己的电台节目&#xff…

数据结构:堆和二叉树遍历

堆的特征 1.堆是一个完全二叉树 2.堆分为大堆和小堆。大堆:左右节点都小于根节点 小堆:左右节点都大于根节点 堆的应用:堆排序,topk问题 堆排序 堆排序的思路: 1.升序排序,建小堆。堆顶就是这个堆最小…

2024/03/27(C++·day3)

一、思维导图 二、完成下面类 代码 #include <cstring> #include <iostream>using namespace std;class myString { private:char *str; // 记录C风格的字符串int size; // 记录字符串的实际长度public:// 无参构造函数myString() : size(10){str new char[si…

JVM(六)——内存模型与高效并发

内存模型与高效并发 一、java 内存模型 【java 内存模型】是 Java Memory Model&#xff08;JMM&#xff09; 简单的说&#xff0c;JMM 定义了一套在多线程读写共享数据时&#xff08;成员变量、数组&#xff09;时&#xff0c;对数据的可见性、有序 性、和原子性的规则和保障…