TCP之延时Nagle算法实验详解

news2025/1/11 16:58:46

TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
当 TCP 报文的承载的数据非常小的时候,例如几个字节,那么整个网络的效率是很低的,因为每个 TCP 报文中都会有 20 个字节的 TCP 头部,也会有 20 个字节的 IP 头部,而数据只有几个字节,所以在整个报文中有效数据占有的比重就会非常低。
在这里插入图片描述
在这里插入图片描述
nagle 算法讲的是减少发送端频繁的发送小包给对方。
Nagle 算法要求:当一个 TCP 连接中有在传数据(已经发出但还未确认的数据)时,小于 MSS 的报文段就不能被发送,直到所有的在传数据都收到了 ACK。同时收到 ACK 后,TCP 还不会马上就发送数据,会收集小包合并一起发送。
在这里插入图片描述
在这里插入图片描述
可以看到前后对比:
在这里插入图片描述

packetdrill 演示

packetdrill 脚本

--tolerance_usecs=100000
0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
// 0.010 setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
0.100...0.200 connect(3, ..., ...) = 0
// Establish a connection.
0.100 > S 0:0(0) <mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 7>
0.200 < S. 0:0(0) ack 1 win 32792 <mss 1100,nop,wscale 7>
0.200 > . 1:1(0) ack 1
+0 write(3, ..., 10) = 10
+0 write(3, ..., 10) = 10
+0 write(3, ..., 10) = 10
+0 write(3, ..., 10) = 10
+0 write(3, ..., 10) = 10
+0.030 < . 1:1(0) ack 11 win 257
+0.030 < . 1:1(0) ack 21 win 257
+0.030 < . 1:1(0) ack 31 win 257
+0.030 < . 1:1(0) ack 41 win 257
+0.030 < . 1:1(0) ack 51 win 257
+0 `sleep 1000000`

数据量比较小的场景:
在这里插入图片描述

Nagle 算法的意义

Nagle 算法的作用是减少小包在客户端和服务端直接传输,一个包的 TCP 头和 IP 头加起来至少都有 40 个字节,如果携带的数据比较小的话,那就非常浪费了。就好比开着一辆大货车运一箱苹果一样。
在这里插入图片描述

Nagle 算法是时代的产物

Nagle 算法在通信时延较低的场景下意义不大。在 Nagle 算法中 ACK 返回越快,下次数据传输就越早。假设 RTT 为 10ms 且没有延迟确认,那么你敲击键盘的间隔大于 10ms 的话就不会触发 Nagle 的条件。如果你想触发 Nagle 的停等(stop-wait)机制,1s 内要输入超过 100 个字符。因此如果在局域网内,Nagle 算法基本上没有什么效果。
如果客户端到服务器的 RTT 较大,比如多达 200ms,这个时候你只要1s 内输入超过 5 个字符,就有可能触发Nagle 算法了。Nagle 算法出现的时候网络带宽都很小,当有大量小包传输时,很容易将带宽占满,出现丢包重传等现象。因此对 ssh 这种交互式的应用场景,选择开启 Nagle 算法可以使得不再那么频繁的发送小包,而是合并到一起,代价是稍微有一些延迟。现在的 ssh 客户端已经默认关闭了 Nagle 算法。

总结

Nagle 算法是应用在发送端的,简而言之就是,对发送端而言:
• 当第一次发送数据时不用等待,就算是 1byte 的小包也立即发送
• 后面发送数据时需要累积数据包直到满足下面的条件之一才会继续发送数
据:

  1. 数据包达到最大段大小MSS
  2. 接收端收到之前数据包的确认 ACK

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/715957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统盘崩溃挂盘进入救援模式选择continue无法进入

问题&#xff1a; 系统盘崩溃挂盘进入救援模式选择continue无法进入&#xff0c;始终读码或者黑屏。 原因&#xff1a; 出现这个界面一般是在选择 "1 Continue" 后&#xff0c;某些文件系统没有成功 mount导致 解决方法&#xff1a; 再次进入救援模式&#xff0c…

(五)人工智能应用--深度学习原理与实战--Linux系统Tensorflow平台搭建

作为使用最广泛的深度学习框架,TensorfLow支持Windows、Linux、MacOs等多种操作系统。Linux系统作为服务器部署环境十分常见&#xff0c;本章我们将学习在Linux操作系统下Tensorflow的安装及基于NVIDIA GPU的Cuda(GPU并行计算框架)、cudnn(深度学习加速平台)的安装配置。 主要…

CV多模态和AIGC的原理解析:从CLIP、BLIP到Stable Diffusion、Midjourney

前言 终于开写本CV多模态系列的核心主题&#xff1a;stable diffusion相关的了&#xff0c;为何执着于想写这个stable diffusion呢&#xff0c;源于三点 去年stable diffusion和midjourney很火的时候&#xff0c;就想写&#xff0c;因为经常被刷屏&#xff0c;但那会时间错不…

Apache组件POI,勾选导出Excel文件。

如果对 POI组件、Maven依赖不了解的小伙伴&#xff0c;在观看本篇文章之前可以先观看我上一篇文章&#xff1a; Apache组件POI&#xff0c;将图片下载到Excel文件中并导出。 。 本篇文章主要讲解Excel文件如何实现勾选导出。 我们先看一下勾选导出时的入参参数&#xff0c;其中…

【调试】vscode远程连接服务器

概述 windows远程连接linux服务器进行操作&#xff0c;有多种方式。可以借助ssh客户端&#xff0c;MobaXterm&#xff0c;finalshell等&#xff0c;这两个我觉得是不错的软件。当然如果需要在服务器编写代码&#xff0c;我还是建议使用vscode这个神奇的工具。怎么用vscode远程…

Spring Boot 中的 TCC 事务

Spring Boot 中的 TCC 事务 在分布式系统中&#xff0c;事务一直是一个棘手的问题。传统的 ACID 事务无法满足分布式系统的需求&#xff0c;因为它们需要强一致性、单点故障和网络延迟等问题。近年来&#xff0c;随着微服务架构的普及&#xff0c;TCC 事务成为了一种非常流行的…

SpringMVC入门篇4 --- SSM整合案例

目录 SSM整合小案例 源码 1.整合配置(config目录) Spring - SpringConfigMyBatis - MyBatisConfig、JdbcConfig、jdbc.propertiesSpringMVC - ServletConfig、SpringMvcConfig 2.功能模块 模型(domain目录)&#xff1a;Book.java数据层(dao目录)&#xff1a;.BookDao.ja…

windows11安装Linux子系统

个人博客地址: https://cxx001.gitee.io Windows在10之后自带了虚拟机子系统功能&#xff0c;可以和本地磁盘共享&#xff0c;默认挂载到/mnt/目录下面。比起传统的VM方便多了。下面是搭建流程&#xff1a; 一 开启子系统服务 控制面板 -> 程序 -> 程序与功能 -> 启动…

学会vue3,仅需这一篇

V3-组合式API setup/reactive/ref/computed/watch/生命周期/父子通信/模板引用/provide和inject数据传输 vue3的优势** 组合式 API (Composition API) 是一系列 API 的集合&#xff0c;使我们可以使用函数而不是声明选项的方式书写 Vue 组件。 使用create-vue搭建Vue3项目…

Apikit 自学日记:API 变更历史

系统会自动保存API的每一次编辑内容。进入API详情页面&#xff0c;点击 编辑历史 &#xff0c;在弹窗中会列出API的每次改动&#xff0c;您可以点击 详情 了解编辑的概况信息。 如果您想对比当前版本和历史的某个版本的差别&#xff0c;点击 对比 按钮&#xff0c;会在新窗口中…

springboot整合shiro实现认证和授权(非常详细)

Shiro和Spring Sercurity应该是我们比较常用的权限框架了&#xff0c;这篇文章教大家怎么通过springboot整合shiro从0开始搭建一个包含权限控制的后台管理系统。 第一步&#xff1a;创建一个springboot项目 创建springboot项目&#xff0c;这里项目就命名为shiro 第二步&#…

如何用一键抠图工具在线压缩PNG图片

我们会发现&#xff0c;现在用的很多图片格式都是PNG&#xff0c;它通常以无损压缩的方式存储图像。然而&#xff0c;有时候我们可能会遇到PNG文件过大的问题&#xff0c;这样会导致文件传输、存储和加载速度变慢。怎么才能解决这个问题&#xff0c;有什么好用的工具推荐么&…

Linux--多个源文件编译:gcc -o 目标文件 源文件1 源文件2 ...

分析编译过程&#xff1a; 我们编译&#xff0c;实际上是针对.c文件。这里是main.c和test.c。 编译器在预处理的时候会将.h拷贝进.c文件。这里是test.h拷贝到test.c中 .c文件编译后变成.o目标文件。这里main.c和test.c文件编译后变成main.o和test.o 生成的.o文件再和lib.so…

CAD版本转换器有哪些?这些工具轻松转换CAD版本

当我们共享CAD文件时&#xff0c;如果接收人使用的CAD软件版本与发送人不同&#xff0c;则需要将CAD文件转换为接收人能够打开的版本。例如&#xff0c;当您使用的CAD软件版本为AutoCAD 2019&#xff0c;而接收人使用的CAD软件版本为AutoCAD 2017时&#xff0c;您需要将CAD文件…

【PCBA方案设计】电子体温计技术解决方案

体温计&#xff0c;是一种常用于医疗的小型测量产品&#xff0c;体温计通常分为汞体温计和电子体温计&#xff0c;汞体温计的原理非常简单&#xff0c;当汞加热时&#xff0c;它会膨胀&#xff0c;沿着非常狭窄的玻璃管上升。因此&#xff0c;我们将玻璃按一定比例划分&#xf…

windows 如何ping ip 加端口号

先在系统中找到 勾选上 和平时的pingip命令不一样了 现在是telnet ip 端口号 先看一组无法ping通端口号的案例 若telnet 127.0.0.1 6379 跳转至一个空白界面 代表ping此ip的端口号成功

搭建高性能数据库集群之二:MySQL读写分离(基于mycat)

一、MyCat概述 Mycat是数据库中间件。 使用场景&#xff1a; 高可用性与Mysql读写分离 业务数据分级存储大表水平拆分&#xff0c;集群并行计算数据库连接池整合多个数据源整合 安装 下载地址&#xff1a;http://dl.mycat.org.cn 安装Mycat之前&#xff0c;需要安装Mysq…

拜托!电梯机房还不会用这个技巧,就真的晚啦!

电梯是现代社会中不可或缺的交通工具之一&#xff0c;为了确保乘客的安全和顺畅运行&#xff0c;电梯机房的监控是至关重要的环节之一。 电梯机房烟感监控是现代建筑安全管理中非常重要的一环。随着城市高楼大厦的不断增多&#xff0c;电梯作为垂直交通的主要方式&#xff0c;其…

一篇文章告诉你VR全景展示的优势

引言 随着科技的不断进步&#xff0c;VR全景展示作为一项创新的技术应用&#xff0c;正以其独特的优势引领着营销行业的发展潮流。通过虚拟现实技术&#xff0c;VR全景展示为消费者带来了身临其境的观展体验&#xff0c;打破了传统展览的时空限制。 一&#xff0e;沉浸式体验 …

CH32V3xx CAN接口基本使用

1、CH32V3xx CAN简介 CH32V307具有2路CAN控制器,CAN控制器提供了完整的CAN协议实现方案,兼容CAN 规范2.0 A和2.0 B。可编程的传输速率,最高可达1Mbit/s。支持时间触发功能,可避免低优先级消息阻塞。支持3个发送邮箱,发送报文优先级可由报文标识或发送请求次序决定。支持3级…