Skip to content

Nagle拥塞控制算法

TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。

Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。

工作原理

  • 数据积累:当一个小的数据包准备发送时,如果之前的包还没有收到ACK(确认信息),Nagle算法会将当前的数据缓存在发送端,而不是立即发送。
  • 触发条件:缓冲区内的累计数据量达到MSS(最大报文段)大小,或收到前一个包的ACK时,会将缓存的数据合并成一个数据包一并发送。
  • 发送限制:只允许一个未被确认的小数据包在网络中传输,直到该包收到确认信息后,才会发送下一个数据包。

上图中开启Nagle算法后,"ELL" 被当做一个整体一并发送

算法规则

(1)如果包长度达到MSS,则允许发送。

(2)如果该包含有FIN,则允许发送。

(3)设置了TCP_NODELAY选项,则允许发送。

(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送。

(5)上述条件都未满足,但发生了超时(一般为200ms),则立即发送。

优点

  • 降低网络拥堵:减少小数据包的数量,减轻网络负担。
  • 提高传输效率:通过合并多个小数据包发送,提高了网络资源的利用率。

缺点

增加延迟:对于需要实时传输的应用(例如在线游戏、即时通信),Nagle算法可能会增加传输延迟,因为它会等待ACK或足够的数据量才发送。

应用场景

  • 适合:数据传输频率不高或对实时性要求不高的应用,例如文件传输或HTTP请求。
  • 不适合:对延迟敏感的应用,例如在线游戏或实时通信。对此类场景,可以通过禁用Nagle算法(通过设置TCP_NODELAY选项)来避免延迟。

粤ICP备20009776号