TCP 的 NACK 与 SACK

article/2025/10/5 16:37:46

可靠传输,一旦丢包,必然 HoL blocking,NACK 和 SACK 必须二选一驱动重传:

NACK:receiver 主动通告没有收到的报文,sender 收到后重传。

SACK:receiver 主动通告收到的报文,sender 收到后 mark lost 重传。

到底哪个好?

TCP 为什么选择 ACK/SACK 而不是 NACK?

争论不休,回答当然是怎么解释都通。一个人们不愿接受的事实是,只要都可以解决问题的二选一,怎么解释都通,一方优势恰是另一方缺陷,创造了很多可以扯淡的话题,当然,这个现象在针对 TCP 的讨论中尤为明显。

可是谁告诉你们 TCP 基于 ACK/SACK 了?它明明是个 NACK/SACK 协议啊。

人们认为 TCP 是 ACK/SACK 主要因为 TCP 头里的确认号就叫 ACK,且后来引入的选择确认叫 SACK。但事实上 TCP 头里的 ACK 表示的是一个 NACK,receiver 尚未接收到的一个序号,就是一个 Hole。

即便如此,可为什么后来选择确认选择了 SACK 而非 NACK,比如:
在这里插入图片描述
因为 TCP Option 空间有限,无论 NACK 还是 SACK 都只能包含有限段,以 4 段为例,实际上就是大小为 4 的滑动窗口,而 NACK 和 SACK 的解释是截然相反的:

NACK:迄今为止的 Hole,向前积累,下一刻若有 Hole 被填充,需要撤销曾针对它的 NACK;

SACK:从今往后的确认,向后积累,只要当下被 SACK,后面一直生效(暂忽略 Reneging 这不合时宜的家伙);

Option 空间只能放 4 段(or any)的约束下,NACK 要容纳新 Hole,要删掉一个旧 Hole,而该旧 Hole 如果接下来被接收,需要撤销它的 NACK,而此撤销大概率在 NACK 后被 sender 收到,产生不必要重传。

SACK 完全没有撤销问题,容纳新 SACK block,只需删去一个旧的(建议采用 LRU),除非丢掉连续 4 个 SACK,每个 SACK block 都能以 4 的冗余度被 sender 接收。

关于可靠传输的 NACK or SACK,TCP 建议了两个原则:

原则一:连续空间用 NACK,表示积累确认,NACK 下一个要收的;非连续空间用 SACK,滑动选择确认已经收到的。

原则二:统一由 sender 进行丢包判断和重传,重传者判断丢包。

下个问题,Option 只有 4 段,是缺陷吗?

并不是。

因为这 4 段 SACK block 是由 receiver 非延迟滑动选择确认的,关键词 “非延迟确认”,“滑动”,“选择确认”,只要收到一个不连续段,马上 SACK,接收和 SACK block 是一比一兑换,其实 1 段就足够,4 段只多提供了 3 个冗余。

不过遗憾的是,TCP 在 receiver 端有一个 Reneging 机制,违背了上述广义的原则二,算是画蛇添足。 若非 Reneging,SACK 就永久向后积累了,sender 便可放心删除 retrans-queue 里的 SACK block。

有人说 NACK 丢失必等超时,这并不算 NACK 的缺陷,SACK 同样也一样,TCP 不对 SACK 进行 ACK。只要有源源不断的流量被 receiver 接收,无论 NACK 还是 SACK 都会被触发。且超时并非坏事,它本身就闭环,最初的 TCP 并没有 fast retransmit,超时是唯一的重传触发机制。

没有 fast retransmit 机制的 TCP 相当于对 NACK 不处理。当发生 HoL blocking,receiver 收到乱序报文会发生 dupack 作为 NACK 提示 sender,这是一个多么明显的 NACK 信号,以至于 fast retransmit 这个伟大的重传机制被引入 TCP。

如果细看 RACK 后的 SACK,其实它也是一个 NACK 信号,提示 sender “在某时间 X 之前的报文均未接收到” 这明确的 NACK,虽然它在形式上依然表现为 SACK。应用 NACK or SACK 的原则一,“连续空间用 NACK”,由于时间序标识的 RACK 连续了,便可使用 “积累 NACK” 了。

对于可靠传输,NACK 才是自然的,SACK 只是不得不。

在设计可靠传输协议时,经常有人会面临 NACK or SACK 的选择,其实当提到这两个词时,基本就暗示了几个误区,TCP 没有采用 NACK 是因为 … SACK 比 NACK 好,由于 TCP ACK 时钟的存在,你会认为连续的积累确认是理所当然的积累 SACK,或者直接叫积累 ACK,但只要砍断 ACK 时钟,给 TCP 头的 ACK 字段换一个名字,其实 TCP 明明就是一个 NACK 协议,ACK 字段表示的是 una(unacknowledged…)

浙江温州皮鞋湿,下雨进水不会胖。


http://chatgpt.dhexx.cn/article/BwhRGf4c.shtml

相关文章

Linux常用命令——pstack命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) pstack 显示每个进程的栈跟踪 补充说明 pstack命令可显示每个进程的栈跟踪。pstack命令必须由相应进程的属主或root运行。可以使用pstack来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的PID。…

【Linux】程序卡死、失败位置|pstack和starce看进程调用|分析耗时函数

目录 即看即用 1,starce 2,pstack 查找进程卡死原因的工具 starce pstack 利用pstack 和 strace分析程序在哪里耗时? 即看即用 区别: 使用 pstack 获得的进程堆栈是程序的静态信息,而使用 strace 可以获得程序的动态信息&#xff0c…

详解命令-pstack

pstack命令可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行。可以使用 pstack 来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的 PID。 实例 pstree以树结构显示进程 pstree -p work | grep ad sshd(22669)---bash(22670)---ad_preproc…

pstack/gstack

pstack是一个shell脚本,用于打印正在运行的进程的栈跟踪信息,它实际上是gstack的一个链接,而gstack本身是基于gdb封装的shell脚本.。此命令可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行。可以使用 pstack 来确定进程…

linux命令-- pstack命令(跟踪进程栈)

pstack是一个shell脚本,用于打印正在运行的进程的栈跟踪信息,它实际上是gstack的一个链接,而gstack本身是基于gdb封装的shell脚本.。此命令可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行。可以使用 pstack 来确定进程…

pstack使用和原理

前言:   最近小组在组织<<深入剖析Nginx>>的读书会, 里面作者提到了pstack这个工具. 之前写JAVA程序, 对jstack这个工具, 非常的喜欢, 觉得很有用. 于是想比较下pstack和jstack的异同.   和jstack一样, pstack亦能展现进程的线程堆栈快照, 非常方便验证和性能…

RDMA RC UC UD

RC:面向连接的可靠服务 UC:面向连接的不可靠服务 UD:面向数据报的不可靠服务 面向连接 vs 面向数据报 相同点&#xff1a;两者的通信均包括双方QP对的参与 不同点&#xff1a;面向连接的通信若有N个节点与之通信&#xff0c;本机需要N个QP对&#xff1b; 面向数据报的通信…

WiFi 芯片原厂、模组厂 一文看懂IOT WiFi选择

一&#xff1a;国内常用WiFi原厂 瑞昱 RTL8710、乐鑫 ESP8266、德州仪器 TI cc3200、紫光展锐RDA5981、新干线NL6621、联发科 MT7681、高通 QCA4004。 博通Broadcom Corporation 博通是Wi-Fi芯片一哥&#xff0c;作为领先的半导体厂商&#xff0c;博通在无线领域的优势有目共睹…

51单片机系列--AD/DA

介绍 AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号 DA&#xff08;Digital to Analog&#xff09;&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换为模拟信号 计算机系统是一…

RDA5981开发环境安装

满满的到处是坑~~ 一&#xff1a;Keil MDK 安装 1.安装KEIL MDK 5.24a版本以及破解。 2.添加环境变量&#xff1a;C:\Keil_v5\ARM\ARMCC\bin 二&#xff1a;GCC-ARM交叉编译安装 1.从 https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads 下载最新版本 win7…

8259A简介

文章目录 1中断简介1.1中断1.2禁止中断与中断屏蔽1.3中断嵌套1.4中断类型号和中断向量表 2,8259A简介2.1 8259A介绍2.2 8259A内部结构2.3 8259A引脚2.3.1 与CPU相连的引脚2.3.2 与外设相连的引脚 2.4 8259a可编程寄存器 1中断简介 1.1中断 定义&#xff1a;CPU暂停当前程序的…

RTL8201-RMII电路

本文分享一下RTL8201如何用作RMII电路&#xff0c;无需外部晶体&#xff0c;时钟由主芯片产生。 RTL8201是常用的百兆电流型PHY&#xff0c;支持端口自动翻转&#xff08;AUTO MDIX&#xff09;&#xff0c;如下框图 RMII相对MII来说&#xff0c;连接线更少&#xff0c;MII需要…

RDMA 、RoCE 、IB 、TCP、Ethernet

ROCE ROCE&#xff08;Remote Direct Memory Access over Converged Ethernet&#xff09;是一种网络技术&#xff0c;它结合了RDMA&#xff08;远程直接内存访问&#xff09;和以太网交换机的特性。ROCE允许主机之间通过以太网进行高效的直接内存访问&#xff0c;从而提供低延…

RTD2785T RTD2785R 2K eDP屏驱动芯片介绍

RTD2785T 支持VGA2HDMI2DP转eDP&LVDS 2K分辨率 支持按键菜单和Uart串口通信&#xff0c;用于工控MCU通过uart指令调节参数 文章转载&#xff1a; RTD2785T 2HDMI2DP转eDP&LVDS 2K方案设计-易显方案设计 (rtddisplay.com)

【RDMA】15. RDMA之RoCE Soft-RoCE

【RDMA】RDMA 学习资料总目录_bandaoyu的笔记-CSDN博客SavirRDMA 分享1. RDMA概述https://blog.csdn.net/bandaoyu/article/details/112859853https://zhuanlan.zhihu.com/p/1388747382. 比较基于Socket与RDMA的通信https://blog.csdn.net/bandaoyu/article/details/1128613993…

Uva509 RAID

我在这题卡了一天&#xff0c;心态有点小崩。不过最后AC的时候还是很开心的。 坑点&#xff1a;1.注意当两个及以上disc无法读取时&#xff0c;输入不合法。 2.当校验结果与预期ans不同时&#xff0c;输入不合法。 其它都为合法情况。 当合法时&#xff0c;校验块不能作为数据…

百度dueros人工智能-RDA5981(R01开发板)-学习心得-安装SDK(dueros的MbedOS系统)

R01开发板的代码及功能测试需要安装SDK才能正常测试,我们需要了解一点MbedOS系统的基本知识及R01开放板的硬件知识才能开始安装SDK的工作。 1.Mbed OS基础知识 Mbed OS是一个开放源码操作系统,专门用于为物联网(IoT)设备设计的ARM微控制器的平台:需要连接到互联网的低功率、…

百度dueros人工智能-RDA5981(R01开发板)-学习心得-入门及硬件连接

一.入门及硬件连接 自从2017年12月10号收到在深圳比特跳动技术有限公司的淘宝网上购买的百度dueros人工智能-R01开发板,当拆开快递包裹的时候,我本以为可以到手就玩,结果当场就懵了,配件如下图所示: 配件从左到右分别是MIC语音输入,天线,发声喇叭,R01开放板。看见这四…

从RDA5981A/B/C编译后map文件和datasheet分析内存分配情况

先查看RDA5981的datasheet, 如下图,RDA5981芯片内部有三个RAM区域, I_SRAM,D_SRAM,I_cache, 还可以外挂PSRAM, 内存映射图解释: 在编译目录BUILD\UNO_81C\GCC_ARM\找到*.map文件, 可以搜索到如下地址情况: .data 0x00100080 .bss 0x001017a8 .stack …

RDA5981开发环境搭建

最近有商家在卖带有CC2530 Zigbee模块的板子&#xff08;电子垃圾&#xff09;&#xff0c;我对Zigbee还不是特别感冒&#xff08;没时间研究&#xff09;&#xff0c;倒是看中了同一个板子上的RDA5981模块。我这个人有个特点&#xff0c;没有研究明白的东西&#xff0c;不会轻…