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

了解 Nagle 算法和延迟确认吗?
Nagle 算法和延迟确认是干什么的?
当我们 TCP 报⽂的承载的数据⾮常⼩的时候,例如⼏个字节,那么整个⽹络的效率是很低的,因为每个 TCP 报⽂中都会有 20 个字节的 TCP 头部,也会有 20 个字节的 IP 头部,⽽数据只有⼏个字节,所以在整个报⽂中有效数据占有的比例就会⾮常低。
这就好像快递员开着大货车送一个小包裹一样浪费资源。
为了减少小数据包的传输,TCP引入了两种常见的策略:
- Nagle算法
- 延迟确认
Nagle算法
Nagle算法的原则是:在任意时刻,最多只能有一个未被确认的小段数据。所谓"小段"是指小于最大段大小(MSS)的数据块,而"未被确认"是指当一个数据块发送出去后,没有收到对方发送的确认(ACK)表示该数据已收到。
Nagle算法的策略如下:
- 当没有已发送未确认的数据块时,立即发送数据。
- 当存在未确认的数据块时,直到满足以下条件之一:没有已发送未确认的数据块或数据长度达到MSS大小,然后再发送数据。
只要不满足以上条件之一,发送方会持续积累数据,直到满足发送条件。
延迟确认
事实上,即使是不携带数据的ACK也会导致网络效率较低,因为它仍然会有40字节的IP头和TCP头,但是却没有携带数据报文。
为了解决ACK传输效率低的问题,TCP引入了延迟确认。
TCP延迟确认的策略如下:
- 当有响应数据要发送时,ACK会立即随响应数据一起发送给对方。
- 当没有响应数据要发送时,ACK会延迟一段时间,等待是否有响应数据可以一起发送。
- 如果在延迟等待发送ACK的期间,对方的第二个数据报文到达了,那么立即发送ACK。
通常情况下,Nagle算法和延迟确认不能同时使用,Nagle算法意味着延迟发送,而延迟确认意味着延迟接收,将它们组合在一起会导致更大的延迟,可能会影响性能。