新闻详情

新闻详情

首页 / 资讯中心 / 详情

【2018-06-29】TCP之Nagle算法延迟ACK

发布时间:2026/9/6 23:47:20来源:尧图网络
【2018-06-29】TCP之Nagle算法延迟ACK
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2018-06-29 标题TCP之Nagle算法延迟ACK分类编程 标签TCPUDP·delayack·disable-nagleTCP延迟确认和禁用Nagle算法1. Nagle算法2. 延迟ACK3. 当Nagle遇上延迟ACK4. 关闭Nagle算法5. 禁止Nagle和开启Nagle算法发送数据与确认示意图参考链接《 https://www.cnblogs.com/wanpengcoder/p/5366156.html 》《 https://blog.csdn.net/wdscq1234/article/details/52432095 》1. Nagle算法Nagle算法的基本定义是任意时刻最多只能有一个未被确认的小段。 所谓“小段”指的是小于MSS尺寸的数据块所谓“未被确认”是指一个数据块发送出去后没有收到对方发送的ACK确认该数据已收到。Nagle算法的规则可参考tcp_output.c文件里tcp_nagle_check函数注释1如果包长度达到MSS则允许发送2如果该包含有FIN则允许发送3设置了TCP_NODELAY选项则允许发送4未设置TCP_CORK选项时若所有发出去的小数据包包长度小于MSS均被确认则允许发送5上述条件都未满足但发生了超时一般为200ms则立即发送。Nagle算法只允许一个未被ACK的包存在于网络它并不管包的大小因此它事实上就是一个扩展的停-等协议只不过它是基于包停-等的而不是基于字节停-等的。是为了减少广域网的小分组数目从而减小网络拥塞的出现该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组在该分组ack到达之前不能发送其他的小分组tcp需要收集这些少量的分组并在ack到来时以一个分组的方式发送出去其中小分组的定义是小于MSS的任何分组该算法的优越之处在于它是自适应的确认到达的越快数据也就发哦送的越快而在希望减少微小分组数目的低速广域网上则会发送更少的分组2. 延迟ACK如果tcp对每个数据包都发送一个ack确认那么只是一个单独的数据包为了发送一个ack代价比较高所以tcp会延迟一段时间如果这段时间内有数据发送到对端则捎带发送ack如果在延迟ack定时器触发时候发现ack尚未发送则立即单独发送延迟ACK好处(1) 避免糊涂窗口综合症(2) 发送数据的时候将ack捎带发送不必单独发送ack(3) 如果延迟时间内有多个数据段到达那么允许协议栈发送一个ack确认多个报文段3. 当Nagle遇上延迟ACK试想如下典型操作写-写-读即通过多个写小片数据向对端发送单个逻辑的操作两次写数据长度小于MSS当第一次写数据到达对端后对端延迟ack不发送ack而本端因为要发送的数据长度小于MSS所以nagle算法起作用数据并不会立即发送而是等待对端发送的第一次数据确认ack这样的情况下需要等待对端超时发送ack然后本段才能发送第二次写的数据从而造成延迟4. 关闭Nagle算法使用TCP套接字选项TCP_NODELAY可以关闭套接字选项;如下场景考虑关闭Nagle算法(1) 对端不向本端发送数据并且对延时比较敏感的操作这种操作没法捎带ack(2) 如上写-写-读操作对于此种情况优先使用其他方式而不是关闭Nagle算法–使用writev而不是两次调用write单个writev调用会使tcp输出一次而不是两次只产生一个tcp分节这是首选方法–把两次写操作的数据复制到单个缓冲区然后对缓冲区调用一次write–关闭Nagle算法调用write两次有损于网络通常不考虑5. 禁止Nagle和开启Nagle算法发送数据与确认示意图
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

虚拟偶像翻唱MV制作全流程:从音频分离到多平台发布 2026/9/7 2:29:39

虚拟偶像翻唱MV制作全流程:从音频分离到多平台发布

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Three.js GLSLNodeFunction 解析:GLSL 着色器节点函数的解析与代码重组原理 2026/9/7 2:29:39

Three.js GLSLNodeFunction 解析:GLSL 着色器节点函数的解析与代码重组原理

Three.js GLSLNodeFunction 解析:GLSL 着色器节点函数的解析与代码重组原理 【免费下载链接】three.js JavaScript 3D Library. 项目地址: https://gitcode.com/GitHub_Trending/th/three.js 本文深入讲解 three.js 节点系统(TSL / Node Material…

阅读更多 →
Cap:免费开源录屏工具,停止录制的瞬间链接就在眼前 2026/9/7 2:29:39

Cap:免费开源录屏工具,停止录制的瞬间链接就在眼前

Cap:免费开源录屏工具,停止录制的瞬间链接就在眼前 【免费下载链接】Cap Open source Loom alternative. Beautiful, shareable screen recordings. 项目地址: https://gitcode.com/GitHub_Trending/cap1/Cap 要演示一次 bug 复现,约半…

阅读更多 →
rustc 错误 E0264 完全解读:`unknown external lang item` 的成因、复现与修复方案 2026/9/7 2:29:39

rustc 错误 E0264 完全解读:`unknown external lang item` 的成因、复现与修复方案

rustc 错误 E0264 完全解读:unknown external lang item 的成因、复现与修复方案 【免费下载链接】rust Empowering everyone to build reliable and efficient software. 项目地址: https://gitcode.com/GitHub_Trending/ru/rust E0264 是 rustc 在使用 #[l…

阅读更多 →
SpringCloud+Layui+AI大模型:智能政务老年卡办理微服务系统实践 2026/9/7 2:29:39

SpringCloud+Layui+AI大模型:智能政务老年卡办理微服务系统实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
计算机仿真设计报告全攻略:选题建模到PDF排版避坑指南 2026/9/7 2:26:39

计算机仿真设计报告全攻略:选题建模到PDF排版避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞