《HTTP 权威指南》阅读随笔
为什么要使用 Nagle 算法
TCP 有一个数据流接口,应用程序可以通过它将任意尺寸的数据放入 TCP 栈中,即使一次只放入一个字节也可以。但是 TCP 段中至少包含了 40 个字节的标记和首部,所以如果 TCP 发送了大量包含少量数据的分组时,网络的性能就会严重下降。此时需要引入 Nagle 算法来解决这种性能问题。
什么是 Nagle 算法
Nagle 算法(以其发明者 John Nagle 命名)试图在发送一个分组之前,将大量 TCP 数据绑定在一起,以提高网路效率。Nagle 算法鼓励发送全尺寸的段,只有当其他分组都被确认之后,Nagle 算法才允许发送非全尺寸的分组,如果其他分组仍然在传输过程中,就将那部分数据缓存起来,只有当挂起分组被确认,或者缓存中积累够一个全尺寸分组数据时,才会将缓存的数据发送出去。
Nagle 算法的弊端以及如何解决
Nagle 算法主要存在两个问题:
- 对于零散的小的 HTTP 报文,可能会因为等待那些永远也不会到来的额外数据而产生时延;
- Nagle 算法会阻止数据发送,直到确认分组抵达为止,但确认分组会被迟延确认算法延迟一小段时间(一般是 100~200 毫米)。
对于上面两种情况,HTTP 应用程序通常可以在栈中设置参数 TCP_NODELAY 来禁用 Nagle 算法以提高性能。如果这么做的话,就要尽量保证发送包含大数据块的 TCP 分组,来避免网络性能的下降。