TCP Nagle算法及示例

Nagle 算法:优化 TCP 网络中小数据包的传输 网络通信中,TCP(传输控制协议)是最常用的协议之一,广泛应用于各种网络应用,如网页浏览、文件传输和在线游戏等。然而,随着互联网的普及,小数据包的频繁传输成为一个不容忽视的问题。为了解决这一问题,Nagle 算法应运而生。Nagle 算法由约翰·纳格尔(John Nagle)提出,其主要目的是通过减少网络中的小数据包数量来提高整体网络效率。它通过将小数据包进行聚合,从而降低网络拥塞和提高吞吐量。Nagle 算法在优化 TCP 网络中小数据包的传输方面发挥了重要作用。 阅读详情

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之后再发送。

Nagle算法原理与实现详解 这意味着,在发送完一个小分组后,需要一直等待该分组的确认ACK到达,否则不会发送其他的分组。当确认到达之后,TCP会收集已经准备好的小分组,并将它们合并成一个大的分组发送出去,从而减少了。模式对服务器而言也会造成类似的延迟问题,例如在需要发送两个报文 A、B的情况下,使用此模式时发送 A 报文后,服务器会等待客户端发送 A 报文的ACK,但如果客户端延迟响应,导致过了一段时间才发送ACK,才会发送 B 报文。在发送出去的报文中,必须要等待对方发送ACK之后,服务端才会发送一个新的报文。 阅读详情

相关推荐

加密视频如何破解 如何解除机器码绑定的视频

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 如何破解加密...

Q-980767270的博客 5万+

Nagle算法

概述 在网络拥塞控制领域,有一个非常有名的算法叫做Nagle算法Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这个算法来尝试解决福特汽车公司的网络拥塞问题(RFC 896)。 该问题的具体描述是:如果我们的应用程序一次产生1个字节的数据,而这个1个字节数据又以网络数据包的形式发送到远端服务器,那么就很容易导致网络由于...

xupeng1644的博客 8285

Nagle算法--网络优化算法

Nagle算法的原理是将较小的数据包进行缓存,在缓存数据包的发送时机到来时,将多个小数据包合并成一个大的数据包进行发送。== Nagle算法是一种网络优化算法,旨在减少小数据包的网络传输次数,提高网络传输效率。如果此前已经有一个未确认的数据包在网络上传输中,则Nagle算法会等待该数据包被确认之后才发送当前缓存的数据包。总之,Nagle算法是一种网络优化算法,通过延迟发送小数据包以减少网络传输次数,提高网络传输效率。一旦之前的数据包被确认,Nagle算法会将缓存的数据包封装成一个更大的数据包进行发送。

m0_46376834的博客 894

TCP-IP详解:Nagle算法

Small Packet Problem 在使用一些协议通讯的时候,比如Telnet,会有一个字节字节的发送的情景,每次发送一个字节的有用数据,就会产生41个字节长的分组,20个字节的IP Header 和 20个字节的TCP Header,这就导致了1个字节的有用信息要浪费掉40个字节的头部信息,这是一笔巨大的字节开销,而且这种Small packet在广域网上会增加拥塞的出现。

深邃 精致 内涵 坚持 4万+

TCP选项:TCP_NODELAY和TCP_CORK

Nagle算法 根据创建者John Nagle命名。该算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程 (称为Nagling),通过减少必须发送的封包的数量,提高了网络应用 程序系统的效率。Nagle算法 ,由Ford Aerospace And Communications Corporation Congestion Control in IP/TCP inter

Beyond.cn 2860

【计算机网络】Socket的TCP_NODELAY选项与Nagle算法

TCP_NODELAY是一个套接字选项,用于控制TCP套接字的延迟行为。当TCP_NODELAY选项被启用时,即设置为true,就会禁用Nagle算法,从而实现TCP套接字的无延迟传输。这意味着每次发送数据时都会立即发送,不会等待缓冲区的填充或等待确认。

morris 2万+

TCPNagle算法

面试被问到这个,这里总结下: 在tcp建立连接发送数据时有可能产生小分组(称为微小分组),不如每次发送一个字节,会产生41字节的分组,20字节的IP首部,20字节的tcp首部和一个字节的数据.在局域网上出现这些小分组一般不会出现问题,因为局域网一般不会出现网络拥塞.但是在广域网上,这些小分组很可能会增加拥塞出现的可能.这时就需要Nagle算法, 该算法要求一个tcp连接上最多只能有一个未被确认

qq100440110的专栏 551

网络编程实践】2.3.4.2 建议关闭 Nagle 算法

Nagle算法主要是避免发送小的数据包,要求TCP连接上最多只能有一个未被确认的小分组,在该分组的确认到达之前不能发送其他的小分组。 Nagle算法的目的:避免发送大量的小包,网络上每次只能一个小包存在,在小包被确认之前,只能积累发送大包,如果包长度达到MSS,则允许发送;如果该包含有FIN,则允许发送;但发生了超时(一般为200ms),则立即发送, 启动TCP_NODELAY,就意味着禁用了Nagle算法 Nagle算法会严重影响请求响应式协议的延迟。 如果我们的程序设计的不够合理,Nagle算法可能会增

专注于C/C++/Linux领域创作 3596

socket 选项 TCP NODELAY 和 NAGLE 算法

socket 选项 TCP NODELAY 和 NAGLE 算法

jfdfhh的博客 418

沾包 nagle算法

1.根据Nagle算法,什么时候要发送包 内核代码Nagle算法下,当一个报文能够被发送时,下面这个函数返回0 Filename : \linux-3.4.4\net\ipv4\tcp_output.c /* Return 0, if packet can be sent now without violation Nagle's rules: * 1. It is full sized. * 2. Or it contains FIN. (already che

m0_37313888的博客 171

Nagle算法--TCP缓冲区管理算法

说明:本文是最近项目上使用tcp时遇到的问题找到的原因,参考了网络上的几篇文章整理出来,如有版权问题,请留言。    Nagle算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程(称为Nagling),通过减少必须发送的封包的数量,提高了网络应用程序系统的效率。 1. Nagle算法的规则   (可参考tcp_output.c文件里tcp_nagle_check函数注释)

1584

Nagle 算法

TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。         Nagle算法的基本定义是任意

Erica_1230的专栏 2393

TCP/IPNagle算法

Nagle算法 1、为什么要引入Nagle算法 Nagle算法主要是为了防止网络连接中充斥着<MSS的分组。小的分组一方面会造成网络拥塞,另外一方面由于网络传输过程中,用户程序需要传递的内容需要附上TCP头和IP头封装成为TCP包/IP包,会造成资源浪费。为了解决这个问题,Nagle就提出一种算法Nagle算法)。 2、Nagle算法的原理 该算法要求在TCP连接中,如果还有未被确...

远方不远 2972

TCP Nagle 算法网络优化的双刃剑

在广域网(WAN)中,频繁发送小数据包可能会导致网络拥塞,因为每个小数据包都需要单独的确认(ACK),这增加了网络的负载。Nagle 算法的核心思想是,在一个 TCP 连接上,最多只能有一个未被确认的小数据包(小于 MSS,即最大报文段大小)在网络中。如果有未确认的数据,且新数据可以与未确认的数据合并(即新数据的大小加上未确认数据的大小小于 MSS),则将新数据添加到未确认数据的末尾。如果新数据不能与未确认数据合并,且未确认数据已收到 ACK,那么发送未确认数据和新数据。

weixin_46564301的博客 1847

nagle算法

Nagle算法,全称为John Nagle提出的Nagle算法,是一种用于减少网络传输中的小包数量,从而提高网络效率的算法Nagle算法的基本原理是:当一个TCP连接上有数据要发送时,并不立即发送出去,而是等待一小段时间(通常是由一个RTT,即往返时延来估计),看看是否有更多的数据要发送。Nagle算法的优点在于减少了网络中的数据包数量,降低了网络拥塞的可能性,提高了网络的整体吞吐量。为此,TCP协议提供了TCP_NODELAY选项,允许应用程序禁用Nagle算法,以牺牲带宽效率为代价,换取更低的延迟。

Yan的博客 1389

6.4 Nagle算法与CORK算法

6.4.1 算法目的         当发送端应用进程产生数据很慢(比如Telnet应用),就会使应用进程间传送的TCP有效载荷很小(可能只有1个字节),而传输开销有40字节(20字节的IP头+20字节的TCP头) 这种现象就叫糊涂窗口综合症(Silly Windw Syndrome)。如果有大量的小TCP报文在网络中传输会导致网络拥塞。Nagle算法是为了解决TCP数据发送端“糊涂窗口综合症”

Remy的学习记录 1999

Nagle算法TCP_NODELAY和TCP_CORK

      坐公交车,最近在看《网络游戏Server编程》,里面提到了Nagle算法和socket的TCP_NODELAY选项,不是很了解,所以百度了一下,查到以下资料,并收藏。 下面摘自:http://hi.baidu.com/zzcqh/blog/item/15f78c363985fd390a55a933.htmlNagle算法 TCP_NODELAY和TCP_CORKNagl

shellching的专栏 1万+

大模型——Coze工作流实战:一键生成像素风格视频

本文介绍了如何利用Coze平台工作流生成像素风格心理学短视频的方法。通过创建工作流、设置变量节点、调用大模型生成文案、数据格式化处理、合成音频、生成字幕等步骤,最终实现从输入主题到生成完整视频的自动化流程。文章详细展示了每个节点的具体配置方法,包括提示词编写和数据处理脚本,为读者提供了完整的像素风格视频制作解决方案。

784

土木工程毕设-【5层】5324平米钢框架办公楼毕业设计(计算书pdf、建筑、结构图).zip

土木工程毕设-【5层】5324平米钢框架办公楼毕业设计(计算书pdf、建筑、结构图).zip

上一篇: Rabbitmq基本使用以及与springboot集成简单示例
下一篇: 浅谈springboot启动过程
gitcat熊
博客等级 码龄12年 45粉丝 53原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值