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

时间:2015-05-05 02:07:26

标签: networking tcp

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

enter image description here

2 个答案:

答案 0 :(得分:2)

当应用程序调用{​​{1}}时,它会移至close

FIN_WAIT_1可以发生多种事情:

  1. 应用程序收到ACK:

    这意味着对等体确认最后发送的数据包。本地申请移至FIN_WAIT_1

  2. 应用程序收到FIN:

    这表示对等方已调用FIN_WAIT_2。当地的申请应该承认这一点。因此,ACK发送给同行。本地申请移至close

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

    您提出的CLOSING意味着对等方已调用FIN+ACK 以及同一TCP段确认最后收到的数据。本地应用程序将确认FIN,并将状态转换为close

答案 1 :(得分:2)

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

  

建立连接后,始终会发送。

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

  • 第一个SYN,因为没有什么可以确认
  • 一个RST,因为这通常意味着连接状态不存在或因此搞砸了ACK没有意义。

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