什么是 TCP 中的 FIN+ACK 消息?

Chr*_*oba 5 networking tcp

我正在为一个班级项目自己实现 TCP,有一个细节我似乎无法理解。什么是FIN+ACK消息?在我在这里包含的图表中,收到 FIN+ACK 将使主机从 FIN_WAIT_1 状态进入 TIME_WAIT 状态。然而,整个图中没有状态转换发送 FIN+ACK。那么如果没有任何东西发送它,怎么可能收到 FIN+ACK 呢?

在此处输入图片说明

Pra*_*bhu 5

当应用程序调用时,close它会移动到FIN_WAIT_1

可能FIN_WAIT_1发生多种事情:

  1. 应用程序收到ACK:

    这意味着对等方已确认最后发送的数据包。本地应用程序移至FIN_WAIT_2

  2. 应用程序收到FIN:

    这表明对等方已调用close。本地应用程序应该承认这一点。因此 ACK 会发送到对等点。本地应用程序移至CLOSING

  3. 应用程序收到FIN + ACK:

    正如FIN+ACK您所说,这意味着对等方已调用close 并且在同一 TCP 段中正在确认最后收到的数据。本地应用程序将确认 FIN,这会将状态带到TIME_WAIT


Kil*_*nDS 5

TCP 不仅仅由状态图定义,基本规范可以在RFC 793中找到。一项具体声明如下(第 15 页,ACK字段描述):

一旦建立连接,就会始终发送该连接。

基本上,这表示在初始三向握手之后(包括四向断开阶段)必须始终存在 ACK。随后只有 2 条消息不包含 ACK:

  • 第一个 SYN,因为没有任何内容需要 ACK
  • RST 通常意味着连接状态不存在或者混乱到 ACK 没有意义。

所以回答你的问题:在该图中,每当发送 FIN 时,ACK 标志也将被设置,并且 ACK nr 将出现,即使没有明确说明。