As per title. Sorry if this is a duplicate question, but in the numerous posts online, I could only find how a connection is torn down, but not (convincingly) why it is done in such a way.
1. A -----FIN-----> B
2. A <----ACK------ B
3. A <----FIN------ B
4. A -----ACK-----> B <====== Why is this one necessary?
======if 3 or 4 lost=======
5. A <....FIN...... B
6. A .....ACK.....> B
It seems B can shutdown the socket as soon as it sends out its FIN(3)
because
- if the
FIN(3)
is not lost, all is well. - if it is lost, A can timeout anyway and close the connection. One can argue that if this does happen, A will have to wait for a very long time. But B bears some risk with this last
ACK(4)
as well. Suppose the connection suddenly goes down (though with low probability) right after A sends out the lastACK(4)
, causing B unable to receive it. Then B will have to wait and timeout, too. Since both approaches are flawed, why not save this lastACK
?
My guess
I think the only exception is that there is a reasonably high chance of packet loss such that both FIN(3)
and ACK(4)
won't arrive.
If FIN(3)
is lost, receiving nothing back from A, B will resend its new FIN(5)
.
Similarly, if ACK(4)
is lost, B will think that its FIN(3)
is lost and resend the FIN(5)
as well. A, though having sent out ACK(4)
, is supposed in the TIME-WAIT
status, will hopefully receive this new FIN(5)
and resend an ACK(6)
.
It seems only if the scenario described above happens reasonably frequently, will the last ACK(4)
have a significant impact.