zoukankan      html  css  js  c++  java
  • TCP之Nagle算法与TCP_NODELAY

    1. Nagle 算法

    在一个 Rlogin 连接上客户一般每次发送一个字节到服务器,这就产生了一些 41 字节长的分组:20 字节的 IP 首部、20 字节的 TCP 首部和 1 个字节的数据。在局域网上,这些小分组(被称为微小分组(tinygram))通常不会引起麻烦,因为局域网一般不会出现拥塞。但在广域网上,这些微小分组则会增加拥塞出现的可能。一个简单和好的方法就是采用 Nagle 算法。

    Nagle 算法要求一个 TCP 连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP 收集这些少量的分组,并在确认到来时以一个分组的方式发出去。该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。而在希望减少微小分组数目的低速广域网上,则会发送更少的分组(小分组的含义是小于报文段的大小)。

    2. TCP_NODELAY

    有时我们需要关闭 Nagle 算法。一个典型的例子是 X 窗口系统服务器:小消息(鼠标移动)必须无时延地发送,以便为进行某种操作的交互用户提供实时的反馈。

    另一个例子是:在一个交互注册过程中键入终端的一个特殊功能键。这个功能键通常可以产生多个字符序列,经常从 ASCII 码的转义(escape)字符开始。如果 TCP 每次得到一个字符,它很可能会发送序列中的第一个字符(ASCII 码的 ESC),然后缓存其他字符并等待对该字符的确认。但当服务器接收到该字符后,它并不发送确认,而是继续等待接收序列中的其他字符。这就会经常触发服务器的经受时延地确认算法,表示剩下的字符没有在 200ms 内发送。对交互用户而言,这将产生明显的时延。

    TCP/IP 协议栈提供了 TCP_NODELAY 选项来关闭 Nagle 算法。

  • 相关阅读:
    前端开发者也可以酷酷地开发桌面程序
    手把手教你怎么搭建angular+gulp的项目(一)
    在Angular中,如果权限值是异步请求所得,如何将其设置为HTTP请求头的Authorization?
    AngularJs ng-repeat指令中怎么实现含有自定义指令的动态html
    第一篇随笔,练练手
    我参与 Seata 开源项目的一些感悟
    一次 kafka 消息堆积问题排查
    图解 Kafka 水印备份机制
    Seata 动态配置订阅与降级实现原理
    记一次 Kafka 集群线上扩容
  • 原文地址:https://www.cnblogs.com/jimodetiantang/p/9094804.html
Copyright © 2011-2022 走看看