• TCP之Nagle算法与延迟ACK


    (一)Nagle算法

    为了减少网络中小分组的数目,减少网络拥塞的情况。Nagle算法要求在一条TCP连接上最多只能有一个未被确认的未完成小分组,在该分组ACK到达之前不能够发送其他的小分组,发送端需要收集需要发送的小分组,在接收端的ACK响应到来的时候将所有收集的小分组以一个大分组的形式发送出去。其中小分组被定义为小于MSS的任何分组。

    该算法的优点是自适应的,确认到达的越快,则数据发送的也将会越快。

    (二)延迟ACK

    如果TCP连接上,接收端对每一个数据包都响应一个ACK确认并发送,而了一个ACK响应则发送一个单独的数据包造成的代价比较高,所以TCP会延迟一段时间(一般为40

    ms),如果在延迟的这段时间之内有数据发送给对端(接收端发送给发送端),则会连带着这次的ACK响应将数据包发送。而如果在延迟时间到达的时候,仍然没有数据包要发送,则将ACK单独发送。

    延迟ACK的好处:

    (1)避免了糊涂窗口综合征;

    (2)发送数据的时候将ACK捎带发送,而不用单独发送ACK

    (3)如果在延迟时间内有多个数据包到达,那么接收端可以发送最后一个数据包的ACK以确认多个报文段。

    (三)发送端采用Nagle算法,接收端采用延迟ACK

    一种典型场景:客户端写-写-读。客户端先发送一个数据包(小包),当第一次数据包发送后,对端延迟ACK,不发送ACK应答,而本端由于第一次发送的数据包没有确认,第二次将要发送的数据包(也是小包)会由于Nagle算法,等待第一次的ACK后才能发送。而服务端由于没有数据包发送,只能在延迟ACK的触发器时间到达时(40ms),才会发送第一次数据包的响应,从而造成网络延迟。

    (四)关闭Nagle算法

    对于上述(三)讨论的情况,使用套接字选项TCP_NODELAY可以关闭套接字选项。或者是将两次写操作的数据复制到单个缓冲区,然后对缓冲区进行一次发送。

  • 相关阅读:
    Appium1.6启动ios9.3报错Original error: Sdk '9.3.5' was not in list of simctl sdks
    Appium,安装WebDriverAgent(WDA)
    Charles界面介绍及使用方法
    手机通过Charles抓取https包
    jacoco统计server端功能测试覆盖率
    Android学习路-activity活动
    Android学习路-Android Studio的工程目录
    js实现多级复选框的交互
    python3使用paramiko操作远程机器
    ubuntu中查看各种设备和资源的命令汇总
  • 原文地址:https://www.cnblogs.com/scu-cjx/p/8605096.html
Copyright © 2020-2023  润新知