简介

Delayed ACK 算法是通过将几个ACK响应合并成一个响应,从而减少协议的开销,提高网络效率的算法

虽然该算法可以提高网络的效率,但是某些情况下会降低应用的性能。

实现方法

参考 RFC 1122 中描述,一个 host 收到TCP包后,可以延迟发送 ACK 响应最大到 500ms。此外,对于全尺寸的数据包,应每两段发送一个 ACK 响应。

延迟ACK 可以给应用一个机会去更新 TCP 接收窗口,possibly to send an immediate response along with the ACK(在返回包中携带一个 ACK,而不用发送一个单独的 TCP ACK 包)。

隐患-和 Nagle 算法配合使用的问题

案例:Bob 发送数据给 Tom。

  1. Bob 发送第一段数据给 Tom,之后剩余的数据小于MSS,即需要进行 queued,或等待 Tom ACK
  2. Tom 接收到第一段数据后,由于开启了 delayed ack,不会立刻发送 ACK,直到 500ms 超时。同时,由于 Tom 还没有收到完整的数据包,因此也不能做出 response,即ACK包也无法通过顺带的方式进行回复。

其中,Bob 开启了 Nagle 算法,Tom 开启了 delayed ack。

参考

https://en.wikipedia.org/wiki/TCP_delayed_acknowledgment