TCP详解 (三)Nagle算法和延迟确认

article/2025/7/23 11:03:56

文章目录

    • 延迟确认
    • Nagle算法
    • Nagle算法遇上延迟确认
    • 关闭Nagle算法

一些有关TCP通信量的研究如[Caceresetal.1991]发现,如果按照分组数量计算,约有一半的TCP报文段包含成块数据(如 FTP、电子邮件和 Usenet新闻),另一半则包含交互数据(如Telnet和Rlogin)。如果按字节计算,则成块数据与交互数据的比例约为 90 %和10 %。这是因为成块数据的报文段基本上都是满长度的,而交互数据则小得多。

为了同时处理上述两类数据,

延迟确认

对于键入一个交互命令时所产生的数据流,通常情况下每一个交互按键都会产生一个数据分组,也就是说,每次从客户传到服务器的是一个字节的按键。这样对每一个按键都会产生4个报文段:(1)来自客户的交互按键;(2)来自服务器的按键确认;(3)来自服务器的按键回显;( 4)来自客户的按键回显确认。
一种可能的处理远程交互按键回显的方法

通过延迟确认的技术,可以将按键确认与按键回显合并发送,以减少网络的负载。
使用延迟确认时,通常TCP在接收到数据时并不立即发送ACK;相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带 ACK)。绝大多数实现采用的时延为 200 ms,也就是说,TCP将以最大200 ms的时延等待是否有数据一起发送。

Nagle算法

Nagle算法是一种解决小包问题的方法,这种问题指的是应用程序一次产生一字节数据,这样会导致网络由于太多的包而过载。例如,如果应用程序一次发送1字节,那么一次实际上会有20字节的IP首部+20字节的TCP首部+1字节的数据被传输,这些小分组会增加出现拥塞的可能。

该算法要求一个 TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。 TCP会收集这些少量的小分组,并在确认到来时以一个分组的方式发出去。该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。而在希望减少微小分组数目的低速广域网上,则会发送更少的分组。

Nagle算法的规则如下:

  1. 如果包长度达到MSS,则允许发送;
  2. 如果该包含有FIN,则允许发送;
  3. 设置了TCP_NODELAY选项,则允许发送;
  4. 未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;
  5. 上述条件都未满足,但发生了超时(一般为200ms),则立即发送。

举个例子,这其实就像拼车,几十个人一起旅游,要是一人一辆车,那就得好几十辆车,开到哪哪要堵,但要是叫个大巴,一两辆就足够了,也不妨碍交通。

Nagle算法遇上延迟确认

为什么会变成这样呢……第一次,减少了网络负载;第一次解决了小包问题。这两件愉快的事情交织在了一起。而这两份喜悦,又会给我带来许许多多的喜悦。我本应该获得了这种如梦一般的幸福时光才对。可是,为什么,会变成现在这样呢……

Nagle算法与延迟确认机制有共存的情况下就会有一些非常糟糕的状况,如果进行write-write-read操作,也就是向对端连续发送两次小片数据时,就会陷入超时等待。比如举一个场景:1P和2P进行通信,1P使用Nagle算法,2P有延迟确认机制。

  1. 首先1P发送一个数据包给2P,2P因为延迟确认机制先不回复,等待新数据过来再发送捎带ACK

  2. 1P第二次发送数据小于MSS,因为Nagle算法,要等待收到2P对之前发送数据的确认才发送当前数据。

  3. 这时候就出现了这样的情况:1P等待2P的确认,2P等待1P发送数据。

从上面的描述看,显然已经死锁了,因为有超时机制,所以死锁最终会解除,但是这却会浪费一个等待超时的时间。

关闭Nagle算法

默认情况下Nagle算法是开启的,以降低传输包的数量。但有时我们也需要关闭 Nagle算法:

  1. 对端不会向本端发送数据,或是对时延比较敏感的操作,如一些用户的交互命令,这时候就无法捎带ACK
  2. 如上,Nagle算法和延迟确认相遇且有write-write-read操作的时候,但是对于这种情况,推荐优先使用其他方法:
    (1)使用writev,而不是两次调用write,单个writev调用会使tcp输出一次而不是两次,只产生一个tcp分节,这是首选方法;
    (2)把两次写操作的数据复制到单个缓冲区,然后对缓冲区调用一次write;

因为关闭Nagle算法对网络不太好,通常不考虑

接口API提供了TCP_NODELAY选项来关闭Nagle算法。


http://chatgpt.dhexx.cn/article/13pqMA68.shtml

相关文章

复指数信号正交性的简单证明

复指数信号为: . 写成矢量形式: 复指数信号两两正交,也就是两个复指数信号的内积有如下表示: 将上式内积形式展开: 当kl时,所有cos项1,sin项0,求和为N。 当时,将求和符…

三角函数正交性的推导

定理: 一个三角函数系:1 cosx sinx cos 一个三角函数系:1,cosx , sinx , cos2x , sin2x , … , cosnx , sinnx , … 如果这一堆函数(包括常数1)中任何两个不同函数的乘积在区间[-π, π]上的积分等于…

OFDM时频脉冲形状与子载波正交性的理解

从多载波调制的角度来理解子载波间正交,首先要明确OFDM默认的脉冲成型是时域矩形窗,时域上每个子载波 e j 2 π f n t e^{j2πf_nt} ej2πfn​t 都被一个矩形窗脉冲 g T ( t ) g_T(t) gT​(t)成型。其次,OFDM子载波间隔 等于 OFDM符号周期的…

正交性原理与维纳霍夫(正则)方程

有期望信号d(n),纯净信号x(n),以及噪声信号g(n); 有滤波器h(m),以及滤波器输出信号y(n),滤波器输出纯净信号x的估计值y&a…

三大变换与自控(五)三角函数的正交性证明

在本系列文章的第一篇中,我们提到任何信号都可以被分解为三角函数,是因为三角函数的正交性,因此在三角函数构建的坐标系中可以绘制任何图形。现在我们就来证明一下三角函数的正交性,以完善我们整个推导过程。 教材上的三角函数系…

机器学习的数学基础(3):正交性原理(orthogonality principle)

思考这样一个问题,令S为一个希尔伯特空间,而空间S的一个子空间 当我们给定了,如何求最近上距离x最近的点。 则我们用数学语言表示该问题为一个优化问题: 该问题的解可以直接通过一个定理给出,即正交性定理&#xff0…

傅里叶级数与傅里叶变换_Part1_三角函数系的正交性

傅里叶级数与傅里叶变换_Part1_三角函数系的正交性 参考链接: DR_CAN老师的原视频 0、复习Part0的内容 参考链接:傅里叶级数与傅里叶变换_Part0_欧拉公式证明三角函数和差公式证明 三角函数的和差公式如下 sin ⁡ ( α β ) sin ⁡ ( α ) cos ⁡ …

09 正交性

09 正交性 9-1 空间,向量空间和欧几里得空间 9-2 广义向量空间 9-3 子空间 9-4 维度 9-5 行空间和矩阵的行秩 9-6 列空间 9-7 矩阵的秩和矩阵的逆 9-8 零空间与看待零空间的三个视角 9-9 零空间与秩-零化度定理 9-10 左零空间,四大子空间和研究子空间的…

CSS正交性分析

Refer: 为什么 CSS 这么难学? 我先来解释一下什么是正交。你调过显示器的「亮度」、「色调」和「饱和度」吧。 「亮度」就是明暗程度,值越大,屏幕越亮。 「色调」就是颜色,你通过调色调,可以把红色调成绿色。 「饱和度…

勒让德多项式的正交性和归一化

罗德里格斯公式正交性归一化应用 这学期上数学课时老师布置了一道习题:计算勒让德多项式的模。翻看本科数学物理方法教材,发现计算方法较复杂,且用到了生成函数 为了方便理清整个计算过程,这一博客直接从罗德里格斯公式出发并避免…

向量组的正交性

向量的内积定义 运算: 向量的正交性: 正交向量组的性质: 向量组的正交规范化 正交矩阵 定义: 正交矩阵的判定

拉盖尔多项式的正交性

标准拉盖尔多项式 拉盖尔多项式可以表示为: 拉盖尔多项式的正交性是指 当 时 上式的积分运算结果为0。这是一种加权的正交性。 证明: (1) 采用变换 容易得到,当 上式的结果为0是因为在进行微分运算后,各项均包含 , 各项的上下限均为0。 …

三角函数系的正交性

参考资料: https://zhuanlan.zhihu.com/p/341796771https://www.bilibili.com/video/BV1Et411R78v

1 三角函数的正交性

三角函数的正交性 三角函数的正交性三角函数系证明 三角函数的正交性 三角函数系 集合 { s i n 0 x , c o s 0 x , s i n x , c o s x , s i n 2 x , c o s 2 x , . . . } \lbrace sin0x, cos0x, sinx,cosx,sin2x,cos2x,... \rbrace {sin0x,cos0x,sinx,cosx,sin2x,cos2x,...…

正交的概念

“正交性”是从几何学中借来的术语。如果两条直线相交成直角,它们就是正交的,比如图中的坐标轴。用向量术语说,这两条直线互不依赖。沿着某一条直线移动,你投影到另一条直线上的位置不变。 在计算技术中,该术语用于表示…

正交性,从內积开始到施密特正交化

正交性 前言內积、长度和正交性[1]內积长度和距离正交向量非正交向量 正交集,正交基和正交投影正交集基定理1 正交基定理2 正交投影非零向量投影直线上的投影空间投影正交分解定理 格拉姆-施密特正交化参考 前言 多维空间,向量和矩阵,以及正…

三角函数正交性理解与Matlab分析

1.什么是正交性? “正交性”是从几何中借来的术语。如果两条直线相交成直角,他们就是正交的。在空间向量中,两个向量的标量积为零即两个向量正交。 如果两个函数满足,则称这两个函数正交。 2.什么是三角函数正交信号集&#xf…

mysql初期密码修改方式

1、适用解压版本的mysql 2、初始化mysql后,会随机生成一个密码,但比较复杂,(#一定记住) 初始化命令 mysqld -initialize 3、初始化后必须修改初始密码才能对mysql进行操作,这个时候操作就会报错误消息。 …

ubuntu20.04安装Mysql8.0以及mysql密码修改

前言 网上找到的这些关于这类的博客要么就是mysql版本过时了要么就完全没有用,浪费了我好多时间,于是我就把自己成功的经历分享给大家,希望能减少大家走弯路的时间。 Mysql的安装 很简单,一句话 sudo apt install mysql-serve…