了解 Nagle 算法和延迟确认吗?

Nagle 算法和延迟确认是干什么的?

当我们 TCP 报⽂的承载的数据⾮常⼩的时候,例如⼏个字节,那么整个⽹络的效率是很低的,因为每个 TCP 报⽂中都会有 20 个字节的 TCP 头部,也会有 20 个字节的 IP 头部,⽽数据只有⼏个字节,所以在整个报⽂中有效数据占有的比例就会⾮常低。

weixin-mianznxjsjwllsewswztwxxssc-baaa9b39-ba10-4b80-ba4b-d72bb3d22a2b.png

这就好像快递员开着大货车送一个小包裹一样浪费资源。

为了减少小数据包的传输,TCP引入了两种常见的策略:

  • Nagle算法
  • 延迟确认

Nagle算法

Nagle算法的原则是:在任意时刻,最多只能有一个未被确认的小段数据。所谓"小段"是指小于最大段大小(MSS)的数据块,而"未被确认"是指当一个数据块发送出去后,没有收到对方发送的确认(ACK)表示该数据已收到。

Nagle算法的策略如下:

  • 当没有已发送未确认的数据块时,立即发送数据。
  • 当存在未确认的数据块时,直到满足以下条件之一:没有已发送未确认的数据块或数据长度达到MSS大小,然后再发送数据。

只要不满足以上条件之一,发送方会持续积累数据,直到满足发送条件。

延迟确认

事实上,即使是不携带数据的ACK也会导致网络效率较低,因为它仍然会有40字节的IP头和TCP头,但是却没有携带数据报文。

为了解决ACK传输效率低的问题,TCP引入了延迟确认。

TCP延迟确认的策略如下:

  • 当有响应数据要发送时,ACK会立即随响应数据一起发送给对方。
  • 当没有响应数据要发送时,ACK会延迟一段时间,等待是否有响应数据可以一起发送。
  • 如果在延迟等待发送ACK的期间,对方的第二个数据报文到达了,那么立即发送ACK。

通常情况下,Nagle算法和延迟确认不能同时使用,Nagle算法意味着延迟发送,而延迟确认意味着延迟接收,将它们组合在一起会导致更大的延迟,可能会影响性能。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题, 计算机网络, 计算机网络面试题