TCP之延时Nagle算法实验详解

article/2025/7/23 4:55:08

TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
当 TCP 报文的承载的数据非常小的时候,例如几个字节,那么整个网络的效率是很低的,因为每个 TCP 报文中都会有 20 个字节的 TCP 头部,也会有 20 个字节的 IP 头部,而数据只有几个字节,所以在整个报文中有效数据占有的比重就会非常低。
在这里插入图片描述
在这里插入图片描述
nagle 算法讲的是减少发送端频繁的发送小包给对方。
Nagle 算法要求:当一个 TCP 连接中有在传数据(已经发出但还未确认的数据)时,小于 MSS 的报文段就不能被发送,直到所有的在传数据都收到了 ACK。同时收到 ACK 后,TCP 还不会马上就发送数据,会收集小包合并一起发送。
在这里插入图片描述
在这里插入图片描述
可以看到前后对比:
在这里插入图片描述

packetdrill 演示

packetdrill 脚本

--tolerance_usecs=100000
0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
// 0.010 setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
0.100...0.200 connect(3, ..., ...) = 0
// Establish a connection.
0.100 > S 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 7>
0.200 < S. 0:0(0) ack 1 win 32792 <mss 1100,nop,wscale 7>
0.200 > . 1:1(0) ack 1
+0 write(3, ..., 10) = 10
+0 write(3, ..., 10) = 10
+0 write(3, ..., 10) = 10
+0 write(3, ..., 10) = 10
+0 write(3, ..., 10) = 10
+0.030 < . 1:1(0) ack 11 win 257
+0.030 < . 1:1(0) ack 21 win 257
+0.030 < . 1:1(0) ack 31 win 257
+0.030 < . 1:1(0) ack 41 win 257
+0.030 < . 1:1(0) ack 51 win 257
+0 `sleep 1000000`

数据量比较小的场景:
在这里插入图片描述

Nagle 算法的意义

Nagle 算法的作用是减少小包在客户端和服务端直接传输,一个包的 TCP 头和 IP 头加起来至少都有 40 个字节,如果携带的数据比较小的话,那就非常浪费了。就好比开着一辆大货车运一箱苹果一样。
在这里插入图片描述

Nagle 算法是时代的产物

Nagle 算法在通信时延较低的场景下意义不大。在 Nagle 算法中 ACK 返回越快,下次数据传输就越早。假设 RTT 为 10ms 且没有延迟确认,那么你敲击键盘的间隔大于 10ms 的话就不会触发 Nagle 的条件。如果你想触发 Nagle 的停等(stop-wait)机制,1s 内要输入超过 100 个字符。因此如果在局域网内,Nagle 算法基本上没有什么效果。
如果客户端到服务器的 RTT 较大,比如多达 200ms,这个时候你只要1s 内输入超过 5 个字符,就有可能触发Nagle 算法了。Nagle 算法出现的时候网络带宽都很小,当有大量小包传输时,很容易将带宽占满,出现丢包重传等现象。因此对 ssh 这种交互式的应用场景,选择开启 Nagle 算法可以使得不再那么频繁的发送小包,而是合并到一起,代价是稍微有一些延迟。现在的 ssh 客户端已经默认关闭了 Nagle 算法。

总结

Nagle 算法是应用在发送端的,简而言之就是,对发送端而言:
• 当第一次发送数据时不用等待,就算是 1byte 的小包也立即发送
• 后面发送数据时需要累积数据包直到满足下面的条件之一才会继续发送数
据:

  1. 数据包达到最大段大小MSS
  2. 接收端收到之前数据包的确认 ACK

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

相关文章

Nagle Algorithm

转: http://bbs.chinaunix.NET/thread-3767363-1-1.html 在网络拥塞控制领域&#xff0c;我们知道有一个非常有名的算法叫做Nagle算法&#xff08;Nagle algorithm&#xff09;&#xff0c;这是使用它的发明人John Nagle的名字来命名的&#xff0c;John Nagle在1984年首次用这…

TCP中的Nagle算法

TCP中的Nagle算法 一. Nagel算法 TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认.为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据.(在一个连接中会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数…

确认应答、Nagle算法和延时确认应答

目录 确认应答 延时确认应答 Nagle算法 确认应答 TCP在传输数据的时候&#xff0c;每次接受方收到来自发送方的数据包后&#xff0c;接受方对都会发送一个确认应答(ACK)报文作为回应&#xff0c;发送方收到来自接受方的确认应答(ACK)报文&#xff0c;就表明发送的数据已经被…

TCP/IP卷一:80---TCP数据流与窗口管理之(延时确认(延迟ACK)、Nagle算法)

一、延迟确认&#xff08;延迟ACK&#xff09; 在许多情况下&#xff0c;TCP并不对每个到来的数据包都返回ACK&#xff0c;利用TCP的累积ACK字段&#xff08;参见TCP报文格式https://blog.csdn.net/qq_41453285/article/details/104016416&#xff09;就能实现该功能累积确认可…

禁用 Nagle 算法

有没有发现一个很奇怪的组合&#xff0c;即 Nagle 算法和延时 ACK 的组合。这个组合为什么奇怪呢&#xff1f; 我举一个例子你来体会一下。比如&#xff0c;客户端分两次将一个请求发送出去&#xff0c;由于请求的第一部分的报文未被确认&#xff0c;Nagle 算法开始起作用&…

TCP Nagle算法及示例

TCP nagle算法是说&#xff0c;一个TCP连接只允许有一个未被确认的小数据包&#xff0c;如果有小数据包未被确认&#xff0c;其他要发送的小数据包先被缓存起来&#xff0c;等收到确认后&#xff0c; 把这些数据包再一块发送出去。注意算法中说的是小数据包&#xff0c;也就是n…

TCP-IP详解:Nagle算法

参考书籍&#xff1a;TCP/IP详解&#xff0c;卷1&#xff1a;协议 Small Packet Problem 在使用一些协议通讯的时候&#xff0c;比如Telnet&#xff0c;会有一个字节字节的发送的情景&#xff0c;每次发送一个字节的有用数据&#xff0c;就会产生41个字节长的分组&#xff0c…

TCP-Nagle:代码版本重新解释Nagle算法

开年来的第一份工作&#xff0c;就是在最新的内核上打补丁。 可没想到Nagle算法也被我冲进了去年的垃圾桶里。 在网上找了一些资料&#xff0c;理论很快被消化&#xff0c;但看了看内核的实现&#xff0c;久久没能动弹。坐了一天&#xff0c;才摸索出来点什么&#xff0c;觉得…

Nagle算法原理与实现详解

文章目录 背景Nagle算法详解算法实现实现开启与关闭Nagle算法 Nagle算法与延迟ACK参考 背景 TCP的数据流大致可以被分成两类&#xff1a; 交互式数据流 TCP交互数据流指的是&#xff1a;TCP连接中传输的所有数据的总和&#xff0c;包括控制命令&#xff08;用于管理网络中连接…

TCP详解 (三)Nagle算法和延迟确认

文章目录 延迟确认Nagle算法Nagle算法遇上延迟确认关闭Nagle算法 一些有关TCP通信量的研究如[Caceresetal.1991]发现&#xff0c;如果按照分组数量计算&#xff0c;约有一半的TCP报文段包含成块数据&#xff08;如 FTP、电子邮件和 Usenet新闻&#xff09;&#xff0c;另一半则…

复指数信号正交性的简单证明

复指数信号为&#xff1a; . 写成矢量形式&#xff1a; 复指数信号两两正交&#xff0c;也就是两个复指数信号的内积有如下表示&#xff1a; 将上式内积形式展开&#xff1a; 当kl时&#xff0c;所有cos项1&#xff0c;sin项0&#xff0c;求和为N。 当时&#xff0c;将求和符…

三角函数正交性的推导

定理&#xff1a; 一个三角函数系&#xff1a;1 cosx sinx cos 一个三角函数系&#xff1a;1&#xff0c;cosx , sinx , cos2x , sin2x , … , cosnx , sinnx , … 如果这一堆函数&#xff08;包括常数1&#xff09;中任何两个不同函数的乘积在区间[-π, π]上的积分等于…

OFDM时频脉冲形状与子载波正交性的理解

从多载波调制的角度来理解子载波间正交&#xff0c;首先要明确OFDM默认的脉冲成型是时域矩形窗&#xff0c;时域上每个子载波 e j 2 π f n t e^{j2πf_nt} ej2πfn​t 都被一个矩形窗脉冲 g T ( t ) g_T(t) gT​(t)成型。其次&#xff0c;OFDM子载波间隔 等于 OFDM符号周期的…

正交性原理与维纳霍夫(正则)方程

有期望信号d&#xff08;n&#xff09;&#xff0c;纯净信号x&#xff08;n&#xff09;&#xff0c;以及噪声信号g&#xff08;n&#xff09;; 有滤波器h&#xff08;m&#xff09;,以及滤波器输出信号y&#xff08;n&#xff09;&#xff0c;滤波器输出纯净信号x的估计值y&a…

三大变换与自控(五)三角函数的正交性证明

在本系列文章的第一篇中&#xff0c;我们提到任何信号都可以被分解为三角函数&#xff0c;是因为三角函数的正交性&#xff0c;因此在三角函数构建的坐标系中可以绘制任何图形。现在我们就来证明一下三角函数的正交性&#xff0c;以完善我们整个推导过程。 教材上的三角函数系…

机器学习的数学基础(3):正交性原理(orthogonality principle)

思考这样一个问题&#xff0c;令S为一个希尔伯特空间&#xff0c;而空间S的一个子空间 当我们给定了&#xff0c;如何求最近上距离x最近的点。 则我们用数学语言表示该问题为一个优化问题&#xff1a; 该问题的解可以直接通过一个定理给出&#xff0c;即正交性定理&#xff0…

傅里叶级数与傅里叶变换_Part1_三角函数系的正交性

傅里叶级数与傅里叶变换_Part1_三角函数系的正交性 参考链接&#xff1a; DR_CAN老师的原视频 0、复习Part0的内容 参考链接&#xff1a;傅里叶级数与傅里叶变换_Part0_欧拉公式证明三角函数和差公式证明 三角函数的和差公式如下 sin ⁡ ( α β ) sin ⁡ ( α ) cos ⁡ …

09 正交性

09 正交性 9-1 空间&#xff0c;向量空间和欧几里得空间 9-2 广义向量空间 9-3 子空间 9-4 维度 9-5 行空间和矩阵的行秩 9-6 列空间 9-7 矩阵的秩和矩阵的逆 9-8 零空间与看待零空间的三个视角 9-9 零空间与秩-零化度定理 9-10 左零空间&#xff0c;四大子空间和研究子空间的…

CSS正交性分析

Refer: 为什么 CSS 这么难学&#xff1f; 我先来解释一下什么是正交。你调过显示器的「亮度」、「色调」和「饱和度」吧。 「亮度」就是明暗程度&#xff0c;值越大&#xff0c;屏幕越亮。 「色调」就是颜色&#xff0c;你通过调色调&#xff0c;可以把红色调成绿色。 「饱和度…