19- TCP 协议(Nagle)

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

前面我们所用的 unp/protocol/tools/winclient/echo_cli.cpp 程序的特别之处是它总会发送一个小分组(TCP 段,只有 41 字节)到服务器。这样的小分组在英文中称为 tinygram,在网络状态好的情况下,比如局域网中,通常不会引起什么麻烦。但是在广域网中,这样的小分组会增加网络拥塞的可能。

为了能够减少这样的 tinygram 在网络中的数量,在 TCP 协议栈中,默认使用了 Nagle 算法。

1. Nagle 算法

Nagle 算法要求:

  • 一个 TCP 连接上最多只能有一个未被确认的未完成的小分组,在它到达目的地前,不能发送其它分组。
  • 在上一个小分组未到达目的地前,即还未收到它的 ack 前,TCP 会收集后来的小分组。当上一个小分组的 ack 收到后,TCP 就将收集的小分组合并成一个大分组发送出去。

在广域网中,一般网络延时都比较大,小分组发送出去后,可能要等很久才会收到 ack,因此,在收到 ack 前,发送方可能会累积好多好多未发送的小分组。


这里写图片描述
图1 Nagle 算法如何处理小分组

在图 1 中,客户端首先发送了一个字符 l 给服务器,在收到服务器的回应前,客户端又发送了三个分组,根据 Nagle 算法规则,在未收到 ack 前,这些小分组都不能发出去。收到 ack 后,tcp 将这三个小分组合并成一个,一次性发出去。

2. 实验 1(开启 Nagle 算法)

默认情况下 Nagle 算法就是开启的。

在图 1 中,假设往返时间是 16ms,要想在这 16ms 里连续发送 4 个字符 l, o, v, e 几乎是不可能的,这意味着我们每秒打字速度要超过 250 个左右,16 ms 里发送至少 2 个字符,打字速度也得要超过每秒 60 个。那么如何在实验中模拟快速发送字符呢?

客户端 echo_client.cpp 提供了一个选项,它能帮我们在键入一个字符时,连续将此字符发送多次。比如键入字符 x,echo_client.cpp 会在极短时间内将 x 发送很多次。

  • 客户端路径:unp/protocol/tools/winclient/echo_client.cpp,部署在 windows 上。
  • 服务器路径:unp/protocol/tools/tcpserver/echo_serv.c,部署在 Linux 上。

2.1 实验步骤

  • 在 Linux 上启动服务器 echo_serv
$ ./echo_serv 192.168.80.130 8000
  • 在 Windows 上打开 OmniPeek 抓包
  • Windows 上启动 echo_client.exe
// 注意 echo_client 后面又加了个参数 5,表示将输入的字符连续发送 5echo_client.exe 192.168.80.130 8000 5

接下来,我在 client 中键入了一个字符 x,然后按 q 键结束。

2.2 抓包结果


这里写图片描述
图2 OmniPeek 抓的数据

图 2 中,客户端首先发送了一个字符 x 过去,接下来等待 ack,在此期间,客户端又请求发送了四个 x,TCP 将这些后来的小分组收集,当收到 ack 后,将这 4 个 x 合并成了一个分组一次发送出去。

3. 实验 2(关闭 Nagle 算法)

这一次我们关闭 Nagle 算法。

和实验 1 不同的地方在于,客户端启动的时候,再加一个参数,NONAGLE.

// 启动客户端echo_client.exe 192.168.80.130 8000 5 NONAGLE

同样的在客户端中输入一个字符 x,此时客户端会帮我们连续发送 5 次 x,然后按 q 退出。抓包结果如下:


这里写图片描述
图3 没有 Nagle 算法的情况下,客户端发数据的结果

从图 3 中可以看到,红色框框包含的那 5 个数据包,在极短的时间内被发送出去,TCP 在发送第一个包后,并没有等待对方回送的确认。

4. 总结

  • 掌握 Nagle 算法的规则
  • 有 Nagle 算法和无 Nagle 有什么不同

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

相关文章

TCP Nagle算法详解

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

TCP之延时Nagle算法实验详解

TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MS…

Nagle Algorithm

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

TCP中的Nagle算法

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

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

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

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

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

禁用 Nagle 算法

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

TCP Nagle算法及示例

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

TCP-IP详解:Nagle算法

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

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

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

Nagle算法原理与实现详解

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

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

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

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

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

三角函数正交性的推导

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

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

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

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

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

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

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

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

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

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

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