TCP Nagle算法及示例

article/2025/7/23 4:51:32

TCP nagle算法是说,一个TCP连接只允许有一个未被确认的小数据包,如果有小数据包未被确认,其他要发送的小数据包先被缓存起来,等收到确认后, 把这些数据包再一块发送出去。注意算法中说的是小数据包,也就是nagle算法是针对发送许多小数据包时的算法。为什么会有这个算法?因为我们知道TCP头部一般就有20字节的长度,如果每次我只发送1字节的数据,那一个数据包的有效载荷只有1/21,所以,为了更高效发送数据,TCP设计了nagle算法,把小包收集起来一块发送。这个算法的精妙之处在于,如果我ack收到的越快,发送数据越快,如果ack收到的慢,说明网络环境不好,TCP发送数据也就越慢,这样就避免了给网络带来负担。

示例

首先我在本机windows电脑用netassist开启了1234端口,作为服务端。

 然后编写如下代码,在一台centos虚拟机中执行,在执行之前,开启wireshark抓包。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <string.h>// nagle算法示例
int main(){// 创建套接字int sock = socket(AF_INET, SOCK_STREAM, 0);//向服务器(特定的IP和端口)发起请求struct sockaddr_in serv_addr;memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充serv_addr.sin_family = AF_INET;  //使用IPv4地址serv_addr.sin_addr.s_addr = inet_addr("192.168.52.1");  //具体的IP地址serv_addr.sin_port = htons(1234);  //端口int res = connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));if(res != 0) {printf("connect fail %d\n", res);return 0;}// 向服务端发送多个小数据包char s[] = "abc";for(int i=0; i<100; i++) {write(sock, s, strlen(s));}sleep(1);close(sock);return 0;
}

wireshark抓包内容如下:

可以看到,第四行,tcp先发送了"abc"三个字节,然后就没有继续再发送,而是等到服务端回复了ack之后,又发送了另外的99个"abc"(共297字节)。说明nagle算法起作用了。

tcp提供了一种方式来关闭nagle算法,我们把nagle算法关闭,再来看效果。

修改上面的代码,改成如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <string.h>// nagle算法示例
int main(){// 创建套接字int sock = socket(AF_INET, SOCK_STREAM, 0);// 设置关闭nagle算法int setFlags = 1;socklen_t setFlagsLen = sizeof(setFlags);int setRes = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &setFlags, setFlagsLen);printf("set nagle no delay flags result: %d\n", setRes);//向服务器(特定的IP和端口)发起请求struct sockaddr_in serv_addr;memset(&serv_addr, 0, sizeof(serv_addr));  //每个字节都用0填充serv_addr.sin_family = AF_INET;  //使用IPv4地址serv_addr.sin_addr.s_addr = inet_addr("192.168.52.1");  //具体的IP地址serv_addr.sin_port = htons(1234);  //端口int res = connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));if(res != 0) {printf("connect fail %d\n", res);return 0;}// 向服务端发送多个小数据包char s[] = "abc";for(int i=0; i<100; i++) {write(sock, s, strlen(s));}sleep(1);close(sock);return 0;
}

此时我们再抓包看,如下,这里只截取了一部分,因为数据包太多了。可以看到tcp把我们在for循环中发送的"abc"一个个发送的,不再一块发送,也不再等待服务端ack之后再发送。


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

相关文章

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;可以把红色调成绿色。 「饱和度…

勒让德多项式的正交性和归一化

罗德里格斯公式正交性归一化应用 这学期上数学课时老师布置了一道习题&#xff1a;计算勒让德多项式的模。翻看本科数学物理方法教材&#xff0c;发现计算方法较复杂&#xff0c;且用到了生成函数 为了方便理清整个计算过程&#xff0c;这一博客直接从罗德里格斯公式出发并避免…

向量组的正交性

向量的内积定义 运算&#xff1a; 向量的正交性&#xff1a; 正交向量组的性质&#xff1a; 向量组的正交规范化 正交矩阵 定义&#xff1a; 正交矩阵的判定

拉盖尔多项式的正交性

标准拉盖尔多项式 拉盖尔多项式可以表示为&#xff1a; 拉盖尔多项式的正交性是指 当 时 上式的积分运算结果为0。这是一种加权的正交性。 证明&#xff1a; (1) 采用变换 容易得到,当 上式的结果为0是因为在进行微分运算后&#xff0c;各项均包含 , 各项的上下限均为0。 …

三角函数系的正交性

参考资料&#xff1a; https://zhuanlan.zhihu.com/p/341796771https://www.bilibili.com/video/BV1Et411R78v

1 三角函数的正交性

三角函数的正交性 三角函数的正交性三角函数系证明 三角函数的正交性 三角函数系 集合 { s i n 0 x , c o s 0 x , s i n x , c o s x , s i n 2 x , c o s 2 x , . . . } \lbrace sin0x, cos0x, sinx,cosx,sin2x,cos2x,... \rbrace {sin0x,cos0x,sinx,cosx,sin2x,cos2x,...…

正交的概念

“正交性”是从几何学中借来的术语。如果两条直线相交成直角&#xff0c;它们就是正交的&#xff0c;比如图中的坐标轴。用向量术语说&#xff0c;这两条直线互不依赖。沿着某一条直线移动&#xff0c;你投影到另一条直线上的位置不变。 在计算技术中&#xff0c;该术语用于表示…