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

一、Nagle算法的基本定义

任意时刻,最多只能有一个未被确认的小段。

所谓“小段”,指的是小于MSS尺寸的数据块,

所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。

二、Nagle算法的规则

(1)如果包长度达到MSS,则允许发送;

(2)如果该包含有FIN,则允许发送;

(3)设置了TCP_NODELAY选项,则允许发送;

TCP_NODELAY选项可以禁止Nagle 算法。

(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;

设置该选项后,内核会尽力把小数据包拼接成一个大的数据包(一个MTU)再发送出去,当然若一定时间后(一般为200ms,该值尚待确认),内核仍然没有组合成一个MTU时也必须发送现有的数据(不可能让数据一直等待吧)。

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

三、 Nagle算法与CORK算法区别
  

  Nagle算法主要避免网络因为太多的小包(协议头的比例非常之大)而拥塞,而CORK算法则是为了提高网络的利用率,使得总体上协议头占用的比例尽可能的小。如此看来这二者在避免发送小包上是一致的,

在用户控制的层面上,Nagle算法完全不受用户socket的控制,你只能简单的设置TCP_NODELAY而禁用它,CORK算法同样也是通过设置或者清除TCP_CORK使能或者禁用之,然而Nagle算法关心的是网络拥塞问题,只要所有的ACK回来则发包,而CORK算法却可以关心内容,在前后数据包发送间隔很短的前提下(很重要,否则内核会帮你将分散的包发出),即使你是分散发送多个小数据包,你也可以通过使能CORK算法将这些内容拼接在一个包内,如果此时用Nagle算法的话,则可能做不到这一点。

四、延迟确认

累积确认

有时候,发送方发送速度非常快,接收方一下下接收到了好几个 tcp 段,可以通过累积确认的方式,一次确认好几个 tcp 段,这样减少报文段的传输。

捎带确认

有时候,双方互相发送数据,当接收到对方的 tcp 段后,先不着急确认,而是等待一会儿,连同数据和 ack 一起发送过去,这种情况叫捎带确认。如果等了一会儿(到时间了),接收方还没有数据要发送,那就直接回复一个纯 ack 过去,这样的 ack 称为延时的 ack(Delayed ACK)。

参考博客:https://blog.csdn.net/zxm342698145/article/details/80992532

://blog.csdn.net/asklw/article/details/79246959

Nagle算法和延迟确认相关推荐

  1. 计算机网络之Nagle算法与延迟确认

    文章目录 计算机网络之Nagle算法与延迟确认 1.Nagle算法 2.延迟确认 计算机网络之Nagle算法与延迟确认 1.Nagle算法 如果发送方疯狂地向接收方发送很小的数据包,比如一次就发送 1 ...

  2. nagle算法和延迟ACK

    nagle算法主要是避免发送小的数据包,要求TCP连接最多只能有一个未被确认的小分组,在该分组的确认到达之前不能发送其他的小分组,由于发送小分组时,包头会占很大的比重,所以会使TCP得传输效率降低. ...

  3. Nagle算法延时确认

    数据流分类 成块数据 交互数据 Rlogin需要远程系统(服务器)回显我们(客户)键入的字符 数据字节和数据字节的回显都需要对方确认   rlogin 每次只发送一个字节到服务器,而Telnet 可以 ...

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

    事件回放 使用OpenVPN传输虚拟桌面流量,终端上有明显逐帧刷屏现象,网络环境为百兆局域网. 分析 1.首先将OpenVPN改为TCP模式,因为局域网环境下TCP和UDP差别不大,不会引起重传叠加问 ...

  5. TCP Nagle算法简述

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

  6. 糊涂窗口综合症和Nagle算法

    本篇文章转载自:http://www.cnblogs.com/zhaoyl/archive/2012/09/20/2695799.html,用于记录自己对于TCP网络中糊涂窗口综合症和Nagle算法的 ...

  7. 禁用 Nagle 算法

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

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

    一.延迟确认(延迟ACK) 在许多情况下,TCP并不对每个到来的数据包都返回ACK,利用TCP的累积ACK字段(参见TCP报文格式https://blog.csdn.net/qq_41453285/a ...

  9. TCP之Nagle算法延迟ACK

    1. Nagle算法: 是为了减少广域网的小分组数目,从而减小网络拥塞的出现: 该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组,在该分组ack到达之前不能发送其他的小分组,tcp需要 ...

最新文章

  1. 【转】C#对象的深拷贝与浅拷贝
  2. python md5加密_Python MD5加密实例详解
  3. 树莓派、debian 下安装 phantomjs casperjs
  4. java案例代码19--二分查找排序
  5. [雪峰磁针石博客]接口测试面试题
  6. Springboot集成Activiti7
  7. RadASM配色方案工具fix
  8. 清理redis集群的所有数据
  9. pdf转换成jpg图片不清晰怎么办?
  10. 短除法(求最大公约数)
  11. 如何坚持看书、跑步、写作?
  12. JIRA实践系列-JIRA与teambition对接指南
  13. vue-cli3.0以上 + typeScript 教程学习指导(一) 入门typeScript
  14. Java培训班靠谱吗?
  15. linux ida和idr分配机制
  16. 如何用计算机算ln,如何用计算器算LN(对数)?
  17. Topk实现(C++)
  18. 2020-03-05
  19. Test Case Design Method - OATS
  20. 当GCN遇见NLP(三) Tensor Graph Convolutional Networks for Text Classification,AAAI2020

热门文章

  1. Java粗浅认识-java简介
  2. 【JAVA】如何判断对象已经死亡?
  3. 2022.03.10
  4. 游戏中的AI玩伴,会是“神队友”吗?
  5. C# - WPF loaded事件和Initialized的区别。
  6. 【毕业设计之python系列】基于Flask的在线学习笔记的设计与实现
  7. 极米H5亮度如何?极米H5智能投影评测
  8. Pid控制算法-模糊算法简介
  9. oracle 怎么注释代码,oracle代码段注释符号是什么
  10. 2020年3月25日阿里笔试题