TCP/IP之(四)Delay ack 和 Nagle算法

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介:

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个字节。


wKiom1nAd2ixUKNiAADCmJLKP4o553.jpg

上图是传输100,000字节

wKiom1nAd2iBHCZeAAC569fDWNE219.jpg

上图是传输99,900字节







      本文转自linuxjavachen  51CTO博客,原文链接:http://blog.51cto.com/littledevil/1966546,如需转载请自行联系原作者





相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
机器学习/深度学习 人工智能 网络协议
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
110 4
|
3月前
|
Kubernetes 算法 调度
在k8S中,Scheduler使用哪两种算法将Pod绑定到worker节点?
在k8S中,Scheduler使用哪两种算法将Pod绑定到worker节点?
|
4月前
|
监控 网络协议 安全
使用 Scapy 库编写 TCP ACK 洪水脚本
使用 Scapy 库编写 TCP ACK 洪水脚本
|
4月前
|
监控 网络协议 网络安全
使用 Scapy 库编写 TCP SYN-ACK 反射脚本
使用 Scapy 库编写 TCP SYN-ACK 反射脚本
|
6月前
|
算法 网络协议 数据建模
【计算机网络】—— IP协议及动态路由算法(下)
【计算机网络】—— IP协议及动态路由算法(下)
|
6月前
|
算法 网络协议 数据建模
【计算机网络】—— IP协议及动态路由算法(上)
【计算机网络】—— IP协议及动态路由算法(上)
|
6月前
|
网络协议 算法 Linux
TCP 中的 Delay ACK 和 Nagle 算法
TCP 中的 Delay ACK 和 Nagle 算法
|
6月前
|
算法 网络协议 网络架构
【网络层】动态路由算法、自治系统AS、IP数据报格式
【网络层】动态路由算法、自治系统AS、IP数据报格式
63 0
|
算法
代码随想录算法训练营第二十七天 | LeetCode 93. 复原 IP 地址、78. 子集、90. 子集 II
代码随想录算法训练营第二十七天 | LeetCode 93. 复原 IP 地址、78. 子集、90. 子集 II
58 0