所以基本上,我在面试中被问到这个问题。问题是:
为什么传输控制协议终止需要4个步骤?
由此我知道,双方都需要发送FIN和确认字符才能完成终止,但另一个我无法回答的后续问题是,为什么服务器必须发送2条消息(每条消息都只设置了FIN和确认字符位)。
为什么不能一起做?
为什么不能一起做?
它可以一起完成,这实际上是实践中的常见情况,即
-> 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
关闭是一个操作,意思是“我没有更多的数据要发送”。参考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来告诉客户端“我没有数据要发送”。这就是为什么它不能像传输控制协议一样工作3步。