首页 > 编程语言 >什么是Nagle 算法和延迟确认

什么是Nagle 算法和延迟确认

时间:2023-10-21 11:31:30浏览次数:41  
标签:ACK 确认 TCP 发送 算法 Nagle 延迟

一、Nagle 算法和延迟确认是干什么的?

当我们 TCP 报⽂的承载的数据⾮常⼩的时候,例如⼏个字节,那么整个⽹络的效率是很低的,因为每个 TCP 报⽂中都会有 20 个字节的 TCP 头部,也会有 20 个字节的 IP 头部,⽽数据只有⼏个字节,所以在整个报⽂中有效数据占有的比例就会⾮常低。

什么是Nagle 算法和延迟确认_TCP

这就好像快递员开着⼤货⻋送⼀个⼩包裹⼀样浪费。

那么就出现了常⻅的两种策略,来减少⼩报⽂的传输,分别是:

Nagle 算法

延迟确认

二、Nagle 算法

Nagle 算法:任意时刻,最多只能有一个未被确认的小段。所谓 “小段”,指的是小于 MSS 尺寸的数据块,所谓 “未被确认”,是指一个数据块发送出去后,没有收到对方发送的 ACK 确认该数据已收到。

Nagle 算法的策略:

没有已发送未确认报⽂时,⽴刻发送数据。

存在未确认报⽂时,直到「没有已发送未确认报⽂」或「数据⻓度达到 MSS ⼤⼩」时,再发送数据。

只要没满⾜上⾯条件中的⼀条,发送⽅⼀直在囤积数据,直到满⾜上⾯的发送条件。

三、延迟确认

事实上当没有携带数据的 ACK,它的⽹络效率也是很低的,因为它也有 40 个字节的 IP 头 和 TCP 头,但却没有携带数据报⽂。

为了解决 ACK 传输效率低问题,所以就衍⽣出了 TCP 延迟确认。

TCP 延迟确认的策略:

当有响应数据要发送时,ACK 会随着响应数据⼀起⽴刻发送给对⽅当没有响应数据要发送时,ACK 将会延迟⼀段时间,以等待是否有响应数据可以⼀起发送

如果在延迟等待发送 ACK 期间,对⽅的第⼆个数据报⽂⼜到达了,这时就会⽴刻发送 ACK

一般情况下,Nagle 算法和延迟确认不能一起使用,Nagle 算法意味着延迟发,延迟确认意味着延迟接收,两个凑在一起就会造成更大的延迟,会产生性能问题。

标签:ACK,确认,TCP,发送,算法,Nagle,延迟
From: https://blog.51cto.com/u_11344924/7965760

相关文章

  • 部分算法总结
    小部分算法总结部分题目请见:https://github.com/ZhangFirst1/Algorithm-problem-code异或运算a^=b相当于a=a^b,将十进制数字转化为二进制进行运算,相同为0,相异为1,0和任何数异或运算都是原来的那个数。可以用来判断数组中哪个数字只出现过一次(通过将所有数与0进行异或运算)快......
  • 10.21算法
    颠倒二进制位颠倒给定的32位无符号整数的二进制位。提示:请注意,在某些语言(如Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在Java中,编译器使用二......
  • 常见密码学算法简介
    1.常见对称加解密算法对称加密算法是一种加密算法,使用相同的密钥来加密和解密数据。这些算法在保护数据安全性方面起着重要作用。下面是一些常用的对称加密算法的介绍:1.1AdvancedEncryptionStandard(AES)简介:AES是一种高级加密标准,用于保护敏感数据。它使用128、192或......
  • 智慧矿山AI算法极速解决皮带问题!
    近年来,随着智能技术的迅速发展与应用,智慧矿山逐渐成为提高生产能力和安全性的重要手段。其中,皮带运输系统作为矿山生产过程中的关键环节,其运行状态的准确判定和及时预警对矿山的安全和效率至关重要。为了实现对皮带运行状态的准确识别,智慧矿山AI算法应运而生。为什么需要皮带运行状......
  • 文心一言 VS 讯飞星火 VS chatgpt (117)-- 算法导论10.3 2题
    二、用go语言,对一组同构对象用单数组表示法实现,写出过程ALLOCATE-OBJECT和FREE-OBJECT。文心一言:在Go语言中,我们通常使用指针和结构体来表示和操作复杂的数据结构。对于一组同构对象,我们可以使用一个数组来存储它们的指针,每个指针指向一个对象。下面是使用Go语言实现ALLOCATE-OBJEC......
  • 文心一言 VS 讯飞星火 VS chatgpt (117)-- 算法导论10.3 2题
    二、用go语言,对一组同构对象用单数组表示法实现,写出过程ALLOCATE-OBJECT和FREE-OBJECT。文心一言:在Go语言中,我们通常使用指针和结构体来表示和操作复杂的数据结构。对于一组同构对象,我们可以使用一个数组来存储它们的指针,每个指针指向一个对象。下面是使用Go语言实现ALLOCATE-OB......
  • celery包结构、celery延迟任务和定时任务、django中使用celery、接口缓存、双写一致性
    celery包结构project├──celery_task#celery包│├──__init__.py#包文件│├──celery.py#celery连接和配置相关文件,且名字必须叫celery.py│└──tasks.py#所有任务函数├──add_task.py#添加任务......
  • 快速排序算法模板+内置函数
    思想:确定分界点调整区间,小于分界点的在左边区间,大于分界点在右边区间。递归处理左右两边。voidquick_sort(intq[],intl,intr){if(l>=r)return;inti=l-1,j=r+1,x=q[l+r>>1];while(i<j){doi++;while(q[i......
  • 算法学习笔记(31): 李超线段树
    李超线段树是一种按照值域维护一次函数最值的数据结构,其核心在于一次函数和值域的双单调性。如果预先对于值域离散也可以维护其最值。也就是说只要满足时一次函数,以及下标的单调性都可以利用李超线段树维护。李超线段树就是利用线段树来维护一次函数的最值,每一个结点对应了一......
  • 查找算法
    顺序查找(线性查找)思想:根据列表下标的顺序,一步步查找列表中的元素是否有与需查找元素相对应,有则返回下标。代码实现#顺序查找deflinear_search(li,e):forind,valinenumerate(li):ifval==e:returnindelse:returnNoneli=......