28. TCP协议之Nagle算法与CORK算法

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

Nagle算法

如果有过多的小分组在网络中进行传输, 这会降低网络的利用率. 假如每个分组都只有一个字节数据组成的TCP数据报的话, 也就是糊涂窗口综合症, 这时可想而知整个网络的利用率有多低. 而采用Nagle算法能明显减少上述可能出现的情况, 并提高网络带宽, 减缓网络拥塞.

Nagle的规则 :

  • 如果包长度达到MSS,则允许发送;

  • 如果该包含有FIN,则允许发送;

  • 设置了TCP_NODELAY选项(网络编程setsockopt函数中设置, 默认开启),则允许发送;

  • 未设置TCP_CORK选项时(网络编程setsockopt函数中设置),若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;

  • 上述条件都未满足,但发生了超时(一般为200ms),则立即发送.

Nalge算法有一个很重要的要求 : 一个TCP连接上最多只能有一个未被确认的未完成的小分组, 在该分组的确认到达之前不能发送其他的小分组. 所以当第一次发送时有数据就立马发送, 当对端的ACK没有到来之前或者超时之前都不能在发送分组, 将没有发送的小分组全部缓存下来组成一个大的分组等到满足条件之后再发送. 但是该算法也有一个缺点, 就是迟延的确认有可能迫使发送端重传其未被确认的报文段.


Nagle算法完整代码在 : Nagle.c

服务端输入 :

./a.out 1 8080 192.168.1.16

客服端输入 :

./a.out 2 8080 192.168.1.16

代码中设置的是客服端连接时就向服务端发送1000个字节, 但是每次只发送一个字节. 如果开启Nagle算法, 客服端必须每次都要等待对端的ACK到来才发下一个分组, 结果如图视 :

在这里插入图片描述
关闭Nagle算法就将99行的代码注释取消掉再来运行. 既然关闭了Nagle算法, 那么不需要等待对端的ACK到来才分组, 只要有分组就立马发送, 结果如图视 :

在这里插入图片描述


CORK算法

CORK算法较Nagle算法则更为激进, 一旦打开CORK算法(网络编程setsockopt函数中设置TCP_CORK选项), TCP不关注是否有收到ACK报文, 只要当前缓存中累积的数据量不足以组成一个MTU大小的数据包就不会将数据包发出, 直到一个RTO超时后才会把不满足一个MTU大小的数据包发出去.

CORK算法暂时没有实验成功, 所以也暂时没有实例来分析. 可以在套接字选项中设置TCP_CORK来验证.


总结

Nagle算法主要关心网络拥塞问题, 而CORK算法是为了提高网络的利用率. 但是两者都是为了尽量避免糊涂窗口综合症的问题.

  • 理解Nagle算法
  • 理解CORK算法在哪里与Nagle算法不同.
TCP Nagle算法 在网络传输中,有时候会遇到这样一种场景:网络中传输了大量的小数据块,浪费资源。有时候传输数据本身的大小比头部还小,一个常见的情况是发送端的"糊涂窗口综合症(Silly Window Syndrome)"。 而Nagle的出现就是为了解决这样的问题的。 Nagle规定任何时候网络中只能存在一个未被确认(未发ACK)的小段(小于MSS)。 Nagle算法的规则 /* Return false, if ... 阅读详情

相关推荐

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

开年来的第一份工作,就是在最新的内核上打补丁。 可没想到Nagle算法也被我冲进了去年的垃圾桶里。 在网上找了一些资料,理论很快被消化,但看了看内核的实现,久久没能动弹。坐了一天,才摸索出来点什么,觉得需要一份代码解释TCP-Nagle的版本说明,这样和Nagle算法的黑盒解释,才能对TCP-Nagle有全面的理解。 于是,有了本文。 Nagle算法 RFC对Nagle算法解释 Nagle’s algorithm, named after John Nagle, is a means of improvi

少年强,六月试锋芒。小弟踉跄学朝步,百战成钢,初登场。 2238

TCP Nagle算法&&延迟确认机制

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33725272的博客 746

WebRTC音频传输实战:从采集到播放的完整链路解析(附RTP包处理细节)

本文深入解析了WebRTC音频传输的完整链路,从麦克风采集、音频处理与编码,到RTP打包、网络发送,再到接收端的NetEQ抗抖动处理与最终播放。文章以Linux PulseAudio为例,详细剖析了线程模型、缓冲区管理及RTP包处理等关键细节,旨在帮助开发者优化实时音频应用的延迟、卡顿与回声问题。

tea88的博客 852

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

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

weixin_46564301的博客 1856

LVDS系列23:Xilinx Ultrascale系ISERDESE3原语(一)

当FIFO_RD_CLK与CLKDIV对齐时,也就是Latency With Late FIFO Empty情况时,延迟比前一种情况长一个FIFO_RD_CLK时钟周期,也就是在FIFO_RD_CLK上升沿后一点,CLKDIV才成功驱动完FIFO_EMPTY的变化,于是读侧要得到FIFO_EMPTY为0的情况则要等到下一个FIFO_RD_CLK的上升沿采集时;IS_CLK_INVERTED、IS_CLK_B_INVERTED设置CLK和CLK_B是否反转,一般情况下设置0;

weixin_38828382的博客 900

本地化搭建DeepSeek+RAGFlow,构建个人知识库

本地化搭建DeepSeek+RAGFlow,构建个人知识库。至少32G以上内存、500G以上空余磁盘空间。

gogospecter的专栏 7427

网络编程:TCP粘包问题——各层粘包/拆包、Nagle 算法、Go实现长度字段协议解决TCP粘包、使用TCP的应用层协议设计

需要注意的是,即使是连续发送大量数据,在正常的网络环境和合理的数据处理方式下,TCP通常可以保持数据包的完整性和顺序,不会出现粘包。当发送方过于迅速发送数据而使接收方无法跟上或处理不当,此时**可能**发生粘包问题。注意,TCP粘包问题并非TCP协议设计上的缺陷,而是由于TCP协议的数据传输特性和网络条件的影响所致。解决TCP粘包问题通常需要应用层协议设计或使用特定的数据分隔方式来确的数据传输和解析。长度字段协议(Length-Field Protocol):发送方在每个数据包前部添加一个表示数据包长度的字

Pistachiout的学习博客 4574

手把手教你用certificate-manager修复Vcenter证书过期问题(附密码重置技巧)

本文详细解析了Vcenter证书过期引发的503服务不可用、密码错误等典型故障现象,并提供了使用certificate-manager工具进行系统性修复的完整步骤。文章重点阐述了证书体系原理、精准诊断方法,并分享了在SSO验证失败时通过vdcadmintool重置密码的关键技巧,帮助管理员快速恢复平台并建立预防性运维策略。

swift5iosmith的博客 459

TCP中的Nagle、DelayedAck、Cork算法

TCP/IP网络的基本算法,在实际项目中非常重要,直接影响了性能

键盘敲的劈啪响 903

软件工程实验报告--用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

m0_73814332的博客 4162

Windows下用MSYS2一键搞定Verilator安装(附国内镜像加速)

本文详细介绍了在Windows系统下,如何利用MSYS2工具和国内镜像源,快速、高效地完成Verilator的安装与配置。通过替换清华镜像源加速下载,并配合Pacman包管理器,实现近乎一键式的安装流程,有效解决了传统方法步骤繁琐、网络依赖下载慢的问题,为数字电路仿真提供了便捷的Windows环境解决方案。

weixin_29208327的博客 592

TCP Nagle算法,TCP_CORK,延迟确认机制简单介绍

虽然Nagle算法在提出时解决了重要问题,但随着网络技术的发展,一些新的机制如TCP_CORK(在Linux中)提供了更细粒度的控制,允许应用程序更好地平衡延迟和效率。Nagle算法与TCP的另一个机制——延迟确认——结合使用时,可能会导致性能问题。延迟确认会推迟发送ACK,而Nagle算法又在等待ACK,这可能会导致不必要的延迟。在其他系统中,可能需要使用不同的机制来实现类似的功能,如FreeBSD的TCP_NOPUSH。它通过延迟发送小数据包来实现这一目标,直到有足够的数据可以发送一个完整的数据包。

toyijiu的专栏 1494

基于Multisim的三相桥式全控整流电路建模、仿真与综合分析

本文基于Multisim 14.2平台,系统研究了三相桥式全控整流电路的建模与仿真方法。首先阐述了电路拓扑结构和工作原理,建立了数学模型。重点介绍了在Multisim中搭建主电路、设计六脉冲触发系统(含两种实现方案)的关键步骤,以及参数设置技巧。通过仿真分析了不同负载(阻性、阻感性)和触发角(0°-90°)下的输出特性,包括电压波形、电流谐波等性能指标。研究为电力电子教学提供了直观的仿真范例,并探讨了模型改进方向与实际工程应用价值。

huanghm88的专栏 353

Nagle 算法与 TCP_NODELAY、TCP_CORK 详解

本文详细解析了Nagle算法及其与TCP_NODELAY、TCP_CORK的关系。Nagle算法通过缓冲小数据包减少网络传输中的头部开销,适用于对延迟不敏感的场景。但在实时交互、小包高频等场景下,Nagle算法可能导致性能问题,此时可通过TCP_NODELAY关闭算法。文章还分析了Nagle与延迟确认(Delayed ACK)的交互问题,并提供了缓解策略和实用建议,包括代码示例和平台排障命令。

REDcker的博客 909

(LDA新闻文本主题分析)基于 gensim训练LDA模型,进行新闻文本主题分析 完整代码+数据 可直接运行

(LDA新闻文本主题分析)基于 gensim训练LDA模型,进行新闻文本主题分析 完整代码+数据 可直接运行

机器学习深度学习业余选手 1498

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

6.4 Nagle算法与CORK算法

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

Remy的学习记录 2003

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

网络性能优化参数关系解读 | TCP Nagle / TCP_NODELAY / TCP_QUICKACK / TCP_CORK

……

u013669912的博客 1836

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TCP_NODELAY 和 TCP_CORK

TCP nagle 和 cork机制和代码解读

already_skb的专栏 1947

TCP_CORK选项

用户层可通过setsockopt系统调用设置TCP套接口的TCP_CORK选项。开启时,内核将阻塞不完整的报文,当关闭此选项时,发送阻塞的报文。此处的不完整指的是应用层发送的数据长度不足一个MSS长度。使用场景是在调用sendfile发送文件内容之前,提前发送一个描述文件信息的头部数据段,并且阻塞住此头部数据,与之后的sendfile数据一同发送。或者用于优化吞吐性能。但是,TCP_CORK最多...

redwingz的博客 4881

TCP协议之《TCP_CORK选项》

TCP协议之《TCP_CORK选项》

C/C++编程指南 1019

TCP_NODELAY和TCP_CORK nagle算法和cork算法

TCP_NODELAY 默认情况下,发送数据採用Nagle 算法。这样尽管提高了网络吞吐量,可是实时性却减少了,在一些交互性非常强的应用程序来说是不同意的。使用TCP_NODELAY选项能够禁止Nagle 算法。 此时,应用程序向内核递交的每一个数据包都会马上发送出去。须要注意的是,尽管禁止了Nagle 算法,但网络的传输仍然受到TCP确认延迟机制的影响。 TC...

aodiyi6351的博客 198

再次谈谈TCP的Nagle算法与TCP_CORK选项

事件回放 使用OpenVPN传输虚拟桌面流量,终端上有明显逐帧刷屏现象,网络环境为百兆局域网。 分析 1.首先将OpenVPN改为TCP模式,因为局域网环境下TCP和UDP差别不大,不会引起重传叠加问题。TCP的好处在于可以任意蹂躏分析,因为它的算法巨复杂,如果换UDP,太简单了,没啥好调整的; 2.分析过程不是本文的目的,直接给结果吧。减小发送/接收缓冲区到MTU的2倍的样子,减小MTU到100...

345

TCP Nagle算法简述

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

Aaron的blog 2189

UDP CORK TCP CORK以及TCP NODELAY

UDP CORK TCP CORK以及TCP NODELAY

gdfhhj的博客 360

TCP Nagle算法详解

转: http://bbs.chinaunix.net/thread-3767363-1-1.html 在网络拥塞控制领域,我们知道有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这个算法来尝试解决福特汽车公司的网络拥塞问题(RFC 896),该问题的具体描述是:如果我们

YUAN1125的专栏 9620
上一篇: 23. TCP协议之IP数据报分片
下一篇: 27. getsockopt和setsockopt函数
Function_18
博客等级 码龄10年 193粉丝 239原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值