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://blog.51cto.com/littledevil/1966546

TCP/IP之(四)Delay ack 和 Nagle算法相关推荐

  1. TCP/IP学习笔记(六)Nagle算法

    在TCP传输数据流中,存在两种类型的TCP报文段,一种包含成块数据(通常是满长度的,携带一个报文段最多容纳的字节数),另一种则包含交互数据(通常只有携带几个字节数据). 对于成块数据的报文段,TCP采 ...

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

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

  3. TCP/IP原理 (四) IP编址

    1.IP地址的基本概念:作用.结构.类型 2.特殊地址:作用.特征 网络地址.广播地址(直接.受限) 0.0.0.0 环回地址 3.单播.多播.广播地址:特征 4.专用地址:作用.范围 5.计算和应用 ...

  4. TCP/IP(四):TCP 与 UDP 协议简介

    从本章开始,我们开始介绍最重要的传输层.传输层位于 OSI 七层模型的第四层(由下往上).顾名思义,传输层的主要作用是实现应用程序之间的通信.网络层主要是保证不同数据链路下数据的可达性,至于如何传输数 ...

  5. TCP/IP第四章笔记ARP协议

    四.ARP:地址解析协议 4.1 引言 数据链路如以太网或令牌网都有自己的寻址机制(通常48bit的MAC地址),使用数据链路的任何网络都必须遵守.也就是说当一台主机把以太网数据帧发送到同一局域网上的 ...

  6. TCP/IP 标志位 SYN ACK RST UTG PSH FIN

    三次握手:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手:接收端收到请求并且允许连接的话,就会发送一个 SYN=1,ACK=1标志的数据包给发送端,告诉它,可以 ...

  7. TCP/IP(四) —— TCP可靠传输的实现

            我们知道TCP的传输是全双工的,不过下面的例子,为了研究的方便,假定数据传输只在一个方向上进行,即A发送数据,B接收数据.         TCP的滑动窗口是以"字节&quo ...

  8. 腾讯面试题 TCP/IP协议四个层次

    网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能.一个协议族,比如 T C P / I P,是一组不同层次上的多个协议的组合. T C P / I P通常被认为是一个四层协议系统,每一层负 ...

  9. TCP-IP详解:Nagle算法

    参考书籍:TCP/IP详解,卷1:协议 Small Packet Problem 在使用一些协议通讯的时候,比如Telnet,会有一个字节字节的发送的情景,每次发送一个字节的有用数据,就会产生41个字 ...

最新文章

  1. bzoj 2186: [Sdoi2008]沙拉公主的困惑
  2. 手把手教你代码重构,是时候告别屎一样的代码了!
  3. 解决:此错误(HTTP 500 内部服务器错误)意味着您正在访问的网站出现了服务器问题,此问题阻止了该网页的显示...
  4. Pair Project: API设计 by Xiao Li and Yishi Xing
  5. java ee io_JAVAEE细细看 进阶 14 - IO总结-Go语言中文社区
  6. mysql先排序再分组筛选_mysql 怎样先排序再分组
  7. 袁亚湘委员:加强对数学等基础科学领域支持,技术与科学并重
  8. 一加7 Pro 5G版也来了:入网工信部 售价将破5000元
  9. ROS学习——2编写简单的发布者和订阅者
  10. 除了写代码,程序员还能做哪些副业呢?
  11. 关于MFC对话框程序如何接收命令行传递过来的参数问题
  12. delphi 获取操作系统版本_Ubuntu 20.04 LTS已可通过Windows 10应用商店获取
  13. 适合英语学习的100部电影
  14. 做一个有批判性思维的程序员
  15. linux 更新系统命令,Linux系统自动更新时间命令的详细说明
  16. vue 下载本地文件
  17. 坚果云+Typora+vscode 参考notion 进行个人知识管理
  18. docx 2003 的补丁
  19. 一些常用的第三方平台和开放平台
  20. 自学IT和接受IT培训两者的优缺点分析

热门文章

  1. Python中OpenCV2. VS. CV1
  2. Linux中如何运行.AppImage文件
  3. scrapy爬虫值Items
  4. 30%企业定位平台型,不会出现类似BAT巨头
  5. Vagrant+VirtualBox版本的坑
  6. MongoDB日志文件过大
  7. 回溯法求解N皇后问题(Java实现)
  8. 《Swift开发实战》——导读
  9. Ant远程部署到Tomcat
  10. php中 $$str 中 $$ 的解释