【问题标题】:What is a FIN+ACK message in TCP?TCP 中的 FIN+ACK 消息是什么?
【发布时间】:2015-05-05 16:10:55
【问题描述】:

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

【问题讨论】:

  • 传说清楚地表明了这一点:当应用程序在 TCP 套接字上发出close() 操作时会发生这种情况。
  • 什么意思?看起来如果应用程序在ESTABLISHED 状态下发出close() 操作,它会发送FIN,而不是FIN+ACK。我错过了什么?
  • 客户端发送FIN,这个包上设置的ACK是最后一个数据包发送的ACK。远程以 FIN+ACK 响应,这个 ACK​​ 是指客户端的 FIN - Ack 号将递增。大多数实现也将在随后立即 RST。
  • @BadZen 真的吗?发送 FIN-ACK-RST 的实现将被破坏。它应该将端口保持在 LAST_ACK 中,直到它收到对自己 FIN 的 ACK。

标签: networking tcp


【解决方案1】:

当应用程序调用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

【讨论】:

    【解决方案2】:

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

    一旦建立连接,它就会一直发送。

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

    • 第一个 SYN,因为没有要 ACK 的东西
    • RST,因为这通常意味着连接状态不存在或非常混乱,以至于 ACK 没有意义。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 2013-02-17
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 2013-04-27
      相关资源
      最近更新 更多