【问题标题】:Why does TCP connection termination require 4 steps?为什么 TCP 连接终止需要 4 个步骤?
【发布时间】:2020-02-24 16:47:08
【问题描述】:

所以基本上,我被问到这个问题是为了面试。问题是:

为什么 TCP 连接终止需要 4 个步骤?

来自this我知道,FIN和ACK需要双方发送才能完成终止,但另一个我无法回答的后续问题是为什么服务器必须发送2条消息(每条只有FIN 和 ACK 位分别设置)。

为什么不能一起做呢?

【问题讨论】:

  • 来自一侧的 FIN 只是简单地告诉另一侧它已完成发送,但它仍然愿意收听。另一方对此表示赞同。当对方发送完毕时,它会发送一个 FIN 告诉对方它现在已经完成发送,并且第一方 ACKs 。如果一侧完成了发送和监听,它会发送一个 RST 立即关闭连接。

标签: networking tcp


【解决方案1】:

为什么不能一起做呢?

它可以一起完成,这实际上是实践中常见的情况,即

-> FIN
<- FIN, ACK to FIN
-> ACK to FIN

但也可以单独完成,尤其是当对端没有立即关闭但仍然发送数据时:

-> FIN
<- DATA, ACK to FIN
.... <- more DATA (+ again ACK to FIN)
<- FIN (+ again ACK to FIN)
-> ACK to FIN 

【讨论】:

    【解决方案2】:

    关闭是一个操作,意思是“我没有更多数据要发送”。参考RFC793

             TCP A                                                TCP B
      1.     ESTABLISHED                                          ESTABLISHED
    
      2.     (Close)
             FIN-WAIT-1  --> <SEQ=100><ACK=300><CTL=FIN,ACK>  --> CLOSE-WAIT
    
      3.     FIN-WAIT-2  <-- <SEQ=300><ACK=101><CTL=ACK>      <-- CLOSE-WAIT
    
      4.                                                          (Close)
             TIME-WAIT   <-- <SEQ=300><ACK=101><CTL=FIN,ACK>  <-- LAST-ACK
    
      5.     TIME-WAIT   --> <SEQ=101><ACK=301><CTL=ACK>      --> CLOSED
    
      6.     (2 MSL)
             CLOSED
    

    所以你可以看到客户端在第2步时已经没有数据要发送,但服务器直到第4步才有数据要发送。服务器需要另一个 FIN 来告诉客户端“我没有数据要发送”。这就是为什么它不能像 TCP 连接一样通过 3 个步骤工作。

    【讨论】:

      猜你喜欢
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 2022-08-15
      相关资源
      最近更新 更多