为什么 TCP/IP 堆栈会发送单独的 ACK 数据包?

网络工程 tcp
2022-03-02 06:33:41

我一直在阅读有关 TCP 的更多信息,并发现由于可以一次设置多个标志,因此基本上在初始 SYN 之后的每个数据包都设置了 ACK 标志,并用作对截至该点的所有数据包的确认。

这听起来像是一个伟大而有效的想法!但是等等,为什么我通常会看到在 TCP 对话中发送的单个 ACK​​ 数据包?事实上,我经常看到发送一个单独的 ACK,然后同一台机器立即发送一个也设置了 ACK 的数据包,具有相同的确认号!单独的 ACK 和数据包似乎有相同的目的!

将 ACK 数据包与数据分开发送的原因是什么?他们是否更有可能更快地通过网络拥塞?

1个回答

接收段和发送确认是一个持续的过程。发送方可以汇总 ACK 段,但不能过多延迟 ACK 以保持数据流动——只有当数据被确认后,发送方才能推进滑动窗口并发送更多数据。

WAN 路由器(流量整形)通常首选单独的 ACK(= 在出口队列中优先),因此使用它们来最大化吞吐量可能是有意义的。主机栈如何使用 TCP 机制取决于它的实现。