当前位置: 首页 > 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。

http://www.lryc.cn/news/13350.html

相关文章:

  • 智能拣配单解决方案
  • 如何防御入侵服务器
  • [软件工程导论(第六版)]第4章 形式化说明技术(课后习题详解)
  • Premiere基础操作
  • Prometheus监控案例-tomcat、mysql、redis、haproxy、nginx
  • 如何寻找SAP中的增强
  • 算法刷题打卡第95天: 最大平均通过率
  • Springboot扩展点系列之终结篇:Bean的生命周期
  • OnGUI Color 控件||Unity 3D GUI 简介||OnGUI TextField 控件
  • 【日刻一诗】
  • 设计模式 状态机
  • React源码分析(二)渲染机制
  • Object.defineProperty 和 Proxy 的区别
  • Python基础4——面向对象
  • Hive 核心知识点灵魂 16 问
  • 聊聊探索式测试与敏捷实践
  • 社区宠物诊所管理系统
  • Vue项目创建首页发送axios请求
  • Nginx
  • 2049. 统计最高分的节点数目
  • Docker 架构简介
  • 玄子Share-BCSP助学手册-JAVA开发
  • 利用React实现多个场景下的鼠标跟随框提示框
  • 【安全知识】——如何绕过cdn获取真实ip
  • JavaScript内存泄露和垃圾回收机制
  • Kubernetes02:知识图谱
  • nginx-服务器banner泄漏风险
  • GCC 同名符号冲突解决办法
  • 下一代视频编码技术2023
  • 最新最全中小微企业研究数据:海量创业公司信息与获取投资信息(1985-2021年)