Skip to content

[!citation] > 4.22 TCP 四次挥手,可以变成三次吗? | 小林coding

计算机网络-延迟确认机制

1. 为什么我们需要延迟确认机制

  • Linux 服务器上,TCP 的延迟确认机制是默认开启的,实际抓包过程当中,发现的三次挥手比四次挥手还要多。
  • TCPACK 报文的网络传输效率并不高,因为有至少 20 个字节的 IP 头加上至少 20 个字节的 TCP 头,仅仅就发送一个 ACK 报文似乎有些浪费了。
  • 为了提高传输效率,需要延迟确认机制。

2. 延迟确认机制和四次挥手

2.1 什么是延迟确认机制

  • 如果有响应数据需要发送,那么 ACK 就会随着响应数据一起发送给对方。
  • 如果没有响应数据需要发送,那么ACK 会等待一段时间,看看是否有响应数据可以一起发送
  • 如果在等待期间,发现对方的第二个数据报文已经到达了,那么就会立刻发送 ACK

image.png|475

2.2 四次挥手变成三次挥手

  • 如果在四次挥手过程当中,被动方开启了延迟确认机制,并且,没有多余的数据需要发送,那么,第二次握手(ACK 消息)和第三次握手(FIN 消息)就会合并到一起,一并发送给对方。

image.png|500

当被动关闭方在 TCP 挥手过程中,如果「没有数据要发送」,同时「没有开启 TCP_QUICKACK(默认情况就是没有开启,没有开启 TCP_QUICKACK,等于就是在使用 TCP 延迟确认机制)」,那么第二和第三次挥手就会合并传输,这样就出现了三次挥手。