TCP 中的 Nagle 算法

《HTTP 权威指南》阅读随笔

为什么要使用 Nagle 算法
TCP 有一个数据流接口,应用程序可以通过它将任意尺寸的数据放入 TCP 栈中,即使一次只放入一个字节也可以。但是 TCP 段中至少包含了 40 个字节的标记和首部,所以如果 TCP 发送了大量包含少量数据的分组时,网络的性能就会严重下降。此时需要引入 Nagle 算法来解决这种性能问题。
什么是 Nagle 算法
Nagle 算法(以其发明者 John Nagle 命名)试图在发送一个分组之前,将大量 TCP 数据绑定在一起,以提高网路效率。Nagle 算法鼓励发送全尺寸的段,只有当其他分组都被确认之后,Nagle 算法才允许发送非全尺寸的分组,如果其他分组仍然在传输过程中,就将那部分数据缓存起来,只有当挂起分组被确认,或者缓存中积累够一个全尺寸分组数据时,才会将缓存的数据发送出去。
Nagle 算法的弊端以及如何解决
Nagle 算法主要存在两个问题:

  1. 对于零散的小的 HTTP 报文,可能会因为等待那些永远也不会到来的额外数据而产生时延;
  2. Nagle 算法会阻止数据发送,直到确认分组抵达为止,但确认分组会被迟延确认算法延迟一小段时间(一般是 100~200 毫米)。

对于上面两种情况,HTTP 应用程序通常可以在栈中设置参数 TCP_NODELAY 来禁用 Nagle 算法以提高性能。如果这么做的话,就要尽量保证发送包含大数据块的 TCP 分组,来避免网络性能的下降。

你可能感兴趣的:(TCP 中的 Nagle 算法)