主题
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选项)来避免延迟。