当前位置: 首页 > news >正文

TCP的Nagle算法和delayed ack---延时发送和延时应答与稍带应答选项

本文目录

  • 提高TCP的网络利用率的二个思考
  • 解决方案:Nagle算法和delayed ack(延时发送和延时应答与稍带应答选项)
  • Nagle算法和delayed ack算法同时启动可能会导致的问题

提高TCP的网络利用率的二个思考

我们都知道,TCP是一个基于字节流的可靠传输协议。意思着TCP本身把所有要发送的数据当做一个字节流来处理,而上层应用发送的数据,总是一段段有长有短,有开始有结束的有意义的有限长度数据报。然后TCP只知道这是个字节流,它并不知道哪些字节能组成一个完整的有意义的数据报。然而TCP底下的IP层又是一个基于数据报文的协议,所以TCP根据自己的算法来截断和组合字节流形成一个个IP报文。

  • 提高有效数据和TCPIP首部数据长度比:
    如果网络上大量的发送小包(比如40个字节的IP+TCP头部+1个字节有有效数据)的情况下,大部分的网络资源都用来传输对应用层没有意义的TCPIP首部了,所以网络的利用率是很低的,要提高利用率,就可以减少小包的比率,尽量让每个TCP报文所携带的用户数据变长,比如,将多个用户数据报文组合成一个TCP报文后再发送。
  • 减少ACK的数量:
    如果给每一个TCP发送请求都回复一个ACK,而TCP的每个ACK通告发送的端的是在此序列之前的所有TCP数据都已经传送完成,那么如何减少ACK这种不传送有效用户 数据的报文的数量,就成为了提高网络利用率考虑的另外一个方面。

解决方案:Nagle算法和delayed ack(延时发送和延时应答与稍带应答选项)

  • Nagle算法-延时发送
    Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。Nagle算法的核心定义是: 任意时刻,最多只能有一个未收对确认报文(发送端没有收到接收端发回的确认本报文的ACK消息)的小于MSS尺寸的报文。
    具体如以下规则,以保证发送方不会过于频繁的发送小报文:
    (1)如果等待发送的数据的长度达到MSS,则允许发送;
    (2)设置了TCP_NODELAY选项(关闭Nagle算法),则允许发送;
    (3)如果所有的小于MSS的报文都已经被确认,则允许发送;
    (4)如果发生了超时(一般为200ms),则允许发送。
    Nagle算法的目标是发送端做控制,以达到避免网络拥塞并提高网络有效利用率的目标。

  • delayed ack-延时应答与稍带应答
    我们知道TCP是双向通信的。所以延时应答和稍带应答的逻辑很简单,收到TCP报文后,并不立刻发回应答,而是等待一段时间,等某些条件满足后再发回应答。
    这样个延时提供了三个可能性:
    (1)多个数据一起收全后合并多个应答成一个应答,从而减少了应答数量
    (2)延时这段时间里应用层收走了更多的TCP报文,可以给发送发通告一个更大的发送窗口,从而提高了网络利用率
    (3)应答和窗口更新通告以及接收发发送给发送方的反向应用层数据在一个报文里发送,从而减少了报文数量

具体规则如下:
(1)每到达200ms ---------发送应答
(2)每两个数据包----------发送应答
(3)接收方应用层有数据要求发送回发送方,并且有接收方要发送的数据包达到发送条件–由数据发送带回应答。

Nagle算法和delayed ack算法同时启动可能会导致的问题

这在某些应用场景下会导致一个典型的“发-发-收”的场景问题,即:接收方要在收到二个TCP小报文,并在应用层将二个报文合并后再完成应用层处理后,然后再把应用层响应结果发送回发送方的场景

如下图所示:
1)发送方发送第一个小报文给接收方
2)接收方应用层收到第一个报文,并等待第二个小报文的到来
3)接收方delayed ack,不发回TCP应答
4)发送放Nagle算法,没有等到第一个小报文的TCP应答,则不发送第二个小报文
5) 接收方和发送方相互等待死锁,直到接收方的delayer ack的200ms定时器超时,发送回TCP应答ACK
6)发送方发送第二个小报文给接收方
7)接收方应用层收到第一和第二两个小报文,处理后发回应用层响应(捎带回TCP应答ACK)
则相比于不开启nagle或者不开启delayed ack(二者只要有一个不开启,或者二个都不开启),则我们可以看到第5步这里,我们白白的多等待了200ms。

相关文章:

TCP的Nagle算法和delayed ack---延时发送和延时应答与稍带应答选项

本文目录提高TCP的网络利用率的二个思考解决方案:Nagle算法和delayed ack(延时发送和延时应答与稍带应答选项)Nagle算法和delayed ack算法同时启动可能会导致的问题提高TCP的网络利用率的二个思考 我们都知道,TCP是一个基于字节流…...

智能拣配单解决方案

电子货架标签系统(ESLs),是一种放置在货架上、可替代传统纸质价格标签的电子显示装置, 每一个电子货架标签通过有线或者无线网络与商场计算机数据库相连, 并将最新的商品价格通过电子货架标签上的屏显示出来。 电子…...

如何防御入侵服务器

根据中华人民共和国刑法: 第二百八十六条违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的&#xff…...

[软件工程导论(第六版)]第4章 形式化说明技术(课后习题详解)

文章目录1. 举例对比形式化方法和欠形式化方法的优缺点。2. 在什么情况下应该使用形式化说明技术?使用形式化说明技术时应遵守哪些准则?3. 一个浮点二进制数的构成是:一个可选的符号(+或-)&…...

Premiere基础操作

一:设置缓存二:ctrI导入素材三:导入图像序列四:打开吸附。打开吸附后素材会对齐。五:按~键可以全屏窗口。六:向前选择轨道工具。在时间线上点击,向前选中时间线上素材。向后选择轨道工具&#x…...

Prometheus监控案例-tomcat、mysql、redis、haproxy、nginx

监控tomcat tomcat自身并不能提供监控指标数据,需要借助第三方exporter实现:https://github.com/nlighten/tomcat_exporter 构建镜像 基于tomcat官方镜像,重新制作一个镜像,将tomcat-exporter和tomcat整合到一起。Ddockerfile如…...

如何寻找SAP中的增强

文章目录0 简介1 寻找一代增强2 寻找二代增强2.2 在包里也可以看到2.3 在出口对象里输入包的名字也可以找到2.4 通过以下函数可以发现已有的增强2.5 也可以在cmod里直接找2.6 总结3 寻找第三代增强0 简介 在SAP中,对原代码的修改最不容易的是找增强,以下…...

算法刷题打卡第95天: 最大平均通过率

最大平均通过率 难度:中等 一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组 classes ,其中 classes[i] [passi, totali] ,表示你提前知道了第 i 个班级总共有 totali…...

Springboot扩展点系列之终结篇:Bean的生命周期

前言关于Springboot扩展点系列已经输出了13篇文章,分别梳理出了各个扩展点的功能特性、实现方式和工作原理,为什么要花这么多时间来梳理这些内容?根本原因就是这篇文章:Spring bean的生命周期。你了解Spring bean生命周期&#xf…...

OnGUI Color 控件||Unity 3D GUI 简介||OnGUI TextField 控件

Unity 3D Color 控件与 Background Color 控件类似,都是渲染 GUI 颜色的,但是两者不同的是 Color 不但会渲染 GUI 的背景颜色,同时还会影响 GUI.Text 的颜色。具体使用时,要作如下定义:public static var color:Color;…...

【日刻一诗】

日刻一诗 1)LeetCode总结(线性表)_链表类 2)LeetCode总结(线性表)_栈队列类 3)LeetCode总结(线性表)_滑动窗口 4)LeetCode总结(线性表&#x…...

设计模式 状态机

前言 本文梳理状态机概念,在实操中状态机和状态模式类似,只是被封装起来,可以很方便的实现状态初始化和状态转换。 概念 有限状态机(finite-state machine)又称有限状态自动机(英语:finite-s…...

React源码分析(二)渲染机制

准备工作 为了方便讲解&#xff0c;假设我们有下面这样一段代码&#xff1a; function App(){const [count, setCount] useState(0)useEffect(() > {setCount(1)}, [])const handleClick () > setCount(count > count)return (<div>勇敢牛牛, <sp…...

Object.defineProperty 和 Proxy 的区别

区别:Object.defineProperty是一个用来定义对象的属性或者修改对象现有的属性的函数&#xff0c;&#xff0c;而 Proxy 是一个用来包装普通对象的对象的对象。Object.defineProperty是vue2响应式的原理, Proxy 是vue3响应式的原理1)参数不同Object.defineProperty参数obj: 要定…...

Python基础4——面向对象

目录 1. 认识对象 2. 成员方法 2.1 成员方法的定义语法 3. 构造方法 4. 其他的一些内置方法 4.1 __str__字符串方法 4.2 __lt__小于符号比较方法 4.3 __le__小于等于符号比较方法 4.4 __eq__等号比较方法 5. 封装特性 6. 继承特性 6.1 单继承 6.2 多继承 6.3 pas…...

Hive 核心知识点灵魂 16 问

本文目录 No1. 请谈一下 Hive 的特点No2. Hive 底层与数据库交互原理&#xff1f;No3. Hive 的 HSQL 转换为 MapReduce 的过程&#xff1f;No4. Hive 的两张表关联&#xff0c;使用 MapReduce 怎么实现&#xff1f;No5. 请说明 hive 中 Sort By&#xff0c;Order By&#xff0…...

聊聊探索式测试与敏捷实践

这是鼎叔的第五十二篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。欢迎关注本专栏和微信公众号《敏捷测试转型》&#xff0c;大量原创思考文章陆续推出。探索式测试在敏捷测试象限中处于右上角&#xff0c;即面向业务且评价产品&#xff0c;这篇补充一下探索…...

社区宠物诊所管理系统

目录第一章概述 PAGEREF _Toc4474 \h 21.1引言 PAGEREF _Toc29664 \h 31.2开发背景 PAGEREF _Toc3873 \h 3第二章系统总体结构及开发 PAGEREF _Toc19895 \h 32.1系统的总体设计 PAGEREF _Toc6615 \h 32.2开发运行环境 PAGEREF _Toc13054 \h 3第三章数据库设计 PAGEREF _Toc2852…...

Vue项目创建首页发送axios请求

这是个全新的Vue项目,引入了ElementUI 将App.vue里的内容干掉,剩如下 然后下面的三个文件也可以删掉了 在views文件下新建Login.vue组件 到router目录下的index.js 那么现在的流程大概是这样子的 启动 写登陆页面 <template><div><el-form :ref"form"…...

Nginx

NginxNginxNginx可以从事的用途Nginx安装Nginx自带常用命令Nginx启动Nginx停止Nginx重启Nginx配置概要第一部分&#xff1a;全局块第二部分&#xff1a;events 块&#xff1a;第三部分&#xff1a;http块&#xff1a;Nginx Nginx是一个高性能的http和反向代理服务器&#xff0…...

OpenPAI存储管理完全手册:支持NFS、SMB等多种存储方案

OpenPAI存储管理完全手册&#xff1a;支持NFS、SMB等多种存储方案 【免费下载链接】pai Resource scheduling and cluster management for AI 项目地址: https://gitcode.com/gh_mirrors/pa/pai OpenPAI作为开源AI平台&#xff0c;提供了完整的存储管理解决方案&#xf…...

Zynq PS端I2C避坑指南:为什么你的读操作总是失败?

Zynq PS端I2C读操作失败排查手册&#xff1a;从时序分析到实战修复 在嵌入式系统开发中&#xff0c;I2C总线因其简单性和多设备支持能力而广受欢迎。然而&#xff0c;当我们在Zynq SoC的PS端实现I2C通信时&#xff0c;特别是进行读操作时&#xff0c;经常会遇到各种意料之外的失…...

OpenClaw性能优化指南:千问3.5-35B-A3B-FP8长任务处理技巧

OpenClaw性能优化指南&#xff1a;千问3.5-35B-A3B-FP8长任务处理技巧 1. 长任务处理的痛点与优化思路 当我第一次尝试用OpenClaw对接千问3.5-35B-A3B-FP8模型处理复杂多模态任务时&#xff0c;遇到了几个典型问题&#xff1a;一个包含20张产品图片的分析任务&#xff0c;运行…...

FPGA图像处理核心:构建可配置的通用滑动窗口IP核

1. 为什么需要通用滑动窗口IP核 做FPGA图像处理的朋友应该都深有体会&#xff0c;每次新项目来了都要重新写滑动窗口模块&#xff0c;简直让人头大。我去年做过一个统计&#xff0c;在图像处理项目中&#xff0c;光是滑动窗口相关的代码就占了总开发时间的30%以上。这还只是写代…...

Spotless许可证头管理终极指南:如何自动化年份更新与版权保护

Spotless许可证头管理终极指南&#xff1a;如何自动化年份更新与版权保护 【免费下载链接】spotless Keep your code spotless 项目地址: https://gitcode.com/gh_mirrors/sp/spotless Spotless是一款强大的代码格式化工具&#xff0c;能够帮助开发者自动管理许可证头&a…...

fflate错误处理完全指南:如何优雅处理压缩异常

fflate错误处理完全指南&#xff1a;如何优雅处理压缩异常 【免费下载链接】fflate High performance (de)compression in an 8kB package 项目地址: https://gitcode.com/gh_mirrors/ff/fflate fflate是一个高性能的JavaScript压缩解压库&#xff0c;但在处理压缩数据时…...

从CH341A编程器、SPI Flash到Linux+STM32理解

前言最近在折腾路由器刷机时入手了一款CH341A编程器&#xff0c;本以为它只能刷刷BIOS芯片&#xff0c;深入研究后发现这简直是“宝藏工具”。更有意思的是&#xff0c;在弄明白了存储芯片的底层操作后&#xff0c;我对嵌入式系统中Linux和STM32的协作关系有了全新的理解。本文…...

双系统安装OpenClaw全攻略:Windows+Mac对接Qwen2.5-VL-7B图文模型

双系统安装OpenClaw全攻略&#xff1a;WindowsMac对接Qwen2.5-VL-7B图文模型 1. 为什么需要双系统部署OpenClaw 作为一个经常在Windows办公机和MacBook之间切换的技术博主&#xff0c;我一直在寻找能跨平台无缝衔接的AI助手方案。直到发现OpenClaw支持对接Qwen2.5-VL-7B这样的…...

深入解析Kubernetes中的Custom Resource Definitions(CRD):构建云原生“自定义积木”的终极武器

摘要Custom Resource Definition&#xff08;CRD&#xff09;是Kubernetes扩展API的核心机制&#xff0c;它允许用户在不修改Kubernetes核心代码的情况下&#xff0c;向集群中注入自定义的资源类型。自Kubernetes 1.7引入以来&#xff0c;CRD已成为云原生生态系统的基石技术&am…...

号令天下专业版手机尾号是五鬼好吗

在数字能量学的趣味研究领域中&#xff0c;手机号码的数字组合被赋予了各种独特的意义&#xff0c;其中“尾号五鬼”的磁场组合常常引发人们的关注。在数字能量学的认知体系里&#xff0c;“尾号五鬼”被视作一种带有负面能量的磁场组合&#xff0c;通常与不稳定、变化频繁、财…...