TCP/IP Delay ack 和 Nagle算法

Delay ack(延迟确认)

正常情况下服务器收到一个请求时就会立即回复ACK确认给客户端,然后客户端再发送下一个包,服务器再进行回复。有时候服务器回复的ACK包有长度,但实际内容长度为0,这也没关系属于正常的。不过一次发送一次确认效率比较低,能不能收多次批量确认一次呢?这就是延迟确认。

Delay ack是说收到包不立即回复ack,而是等一会儿默认200毫秒,看看这段时间是否有还有包发过来(属于同一客户端)如果有就一起发送ACK确认,如果超时了还没有等到那么就直接发送这一个确认包。在延迟确认期间ack不是立即发送而是等待200毫秒,如果有就一起发送,或者如果凑够2个ack包就一起发送;如果在等200毫秒还没有就发送者一个ACK包。

所以正常情况下抓包都是一个数据包后面紧跟一个ACK确认包。

Nagle算法

如果服务器接收窗口大于MSS并且客户端要发送的数据大于一个MSS长度(1460)的就立即发送;否则就等待前面发出去包是不是还没有ACK,如果没有剩下的小包就等前面的ack返回之后再发送。也就是说包很小,然后又有包发给服务器而且还没有收到ack,那么就等等ack返回之后再发送剩下的包。

如果客户端启用Nagle并且服务器启用了delay ack会怎么样?

比如客户端发送一个HTTP请求给服务器,这个请求有1560个字节,握手的MSS是1460个字节。那么这1560个字节就会分成2个TCP包,第一个1460,第二个100。第一个发送出去后,服务器收到,因为延迟确认,服务器等待200毫秒,客户端开启了Nagle(默认开启)由于第二个包100字节很小,所有它就等待前一个包的ack返回后再进行发送,这时双方就进入互相等待的阶段,直到200毫秒超时,服务器发送ack,然后客户端再发送剩余的一个包。

再说一个例子引用自:http://www.stuartcheshire.org/papers/nagledelayedack/

传输数据是99,900字节,速度5.2M每秒;如果传输数据是100,000字节速度是2.7M每秒。多了10字节为什么速度下降这么多?

99,900 bytes = 68 全尺寸包 1448字节每个包,另外剩余1436字节最后一个包
100,000 bytes = 69 全尺寸包 1448字节每个包,另外剩余88字节最后一个包

说明:一个MSS是1460,为什么上面一个包是1448呢?因为那12个字节,因为Windows操作系统是1460,苹果或者其他操作系统多了一个时间戳选项,TCP分段大小就少了所以是1448个字节。上面的例子是按照Linux操作系统来说的。

68个包会立即发发送,因为68是偶数,所以服务器最后肯定收到2个包,然后发送ACK给客户端,然后客户端立即发送剩余的1436字节,整个过程没有等待。如果是69个包由于是奇数,服务器最后一次收到是1个包,所以等待200毫秒,然后客户端由于剩下88个字节也会等待,这样就增加了整体传输时间,超时之后再发送最后一个88个字节。

上图是传输100,000字节

上图是传输99,900字节

原文地址:https://www.cnblogs.com/yunxizhujing/p/9381451.html

时间: 2024-10-30 02:58:52

TCP/IP Delay ack 和 Nagle算法的相关文章

TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK

关于TCP Delay ACK的概念我就不多说了,到处复制粘贴标准文献以及别人的文章只能让本文篇幅加长而降低被阅读完的欲望,再者这也不是什么论文,附录参考文献几乎很少有人去看,所以我把这些都略过了. 和风吹的干皮鞋,吹的断愁绪吗? 写完本文后的补充: 这段话是我写完本文后补上去的.本来我想把这篇文章控制在2000字以内,或者更少的,800-1000字以内,无奈还是说多了...今天心情非常好,因为我竟然在梦里把三亨利之战的细节搞清楚了,迄今,我觉得自己对于西洋史的认知更近了一步,可以说今天是一个里

Nagle算法

用于自动连接许多的小缓冲器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率 优 点 减少拥塞控制 用 于 自动连接许多的小缓冲器消息 简介 Nagle算法是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小缓冲器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率.Nagle算法于1984年定义为福特航空和通信公司IP/TCP拥塞控制方法,这使福特经营的最早的专用TCP/IP网络减少拥塞控制,从那以后这一方法得

TCP/IP具体解释--TCP/UDP优化设置总结& MTU的相关介绍

首先要看TCP/IP协议,涉及到四层:链路层,网络层.传输层,应用层. 当中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在应用层 它们的关系是 数据帧{IP包{TCP或UDP包{Data}}} --------------------------------------------------------------------------------- 在应用程序中我们用到的Data的长度最大是多少,直接取决于底层的限

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

收藏 秋风醉了 发表于 3年前 阅读 1367 收藏 0 点赞 0 评论 0 [腾讯云]买域名送云解析+SSL证书+建站!>>>   摘要: TCP Nagle算法&&延迟确认机制 TCP Nagle算法 http://baike.baidu.com/view/2468335.htm 百度百科:TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认.为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据.

socket.setNoDelay([noDelay]) 用的是Nagle算法

Nagle算法是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小缓冲器消息:这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率.Nagle算法于1984年定义为福特航空和通信公司IP/TCP拥塞控制方法,这是福特经营的最早的专用TCP/IP 网络减少拥塞控制,从那以后这一方法得到了广泛应用.Nagle的文档里定义了处理他所谓的小包问题的方法,这种问题指的是应用程序一次产生一字节数据, 这样会导致网络由于太多的包而过载(一个常见的情况是发送端的"愚蠢

TCP Nagle算法以及延迟确认(即延迟回复ACK)的学习

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

TCP之Nagle算法&&延迟ACK

1. Nagle算法: 是为了减少广域网的小分组数目,从而减小网络拥塞的出现: 该算法要求一个tcp连接上最多只能有一个未被确认的未完成的小分组,在该分组ack到达之前不能发送其他的小分组,tcp需要收集这些少量的分组,并在ack到来时以一个分组的方式发送出去:其中小分组的定义是小于MSS的任何分组: 该算法的优越之处在于它是自适应的,确认到达的越快,数据也就发哦送的越快:而在希望减少微小分组数目的低速广域网上,则会发送更少的分组: 2. 延迟ACK: 如果tcp对每个数据包都发送一个ack确认

解决TCP延迟应答(Delay ACK)问题的3个小Trick-(续:正规的做法)

这个话题确实有点乱,事实就是如此.        在<解决TCP延迟应答(Delay ACK)问题的3个小Trick>中,我描述了一种通过修改发送端协议栈的方式来消解Delay ACK带来的危害的方案,这实属一种无奈的走火入魔的做法,因为你无法控制数据接收端,因为总是有人认为网络上的任何所谓的"延迟"都是坏事,完美主义者总是试图消解任何的延迟!但事实上...        再次重申,不要以为Delay ACK是什么坏事,千万不要!正如不要认为拥塞窗口越大越好一样,任何人都无

TCP/IP详细说明--滑模、拥塞窗口、慢启动、Negle算法

TCP的数据流大致能够分为两类,交互数据流与成块的数据流. 交互数据流就是发送控制命令的数据流.比方relogin,telnet.ftp命令等等.成块数据流是用来发送数据的包,网络上大部分的TCP包都是这样的包. 非常明显.TCP在传输这两种类型的包时的效率是不一样的,因此为了提高TCP的传输效率,应该对这两种类型的包採用不同的算法. 总之.TCP的传输原则是尽量降低小分组传输的数量. TCP的交互式数据流 ? 经受时延的确认技术 TCP的交互式数据流通常使用"经过时延的确认"技术.通