timewait先发起close的一端的第二阶段:
a fin b,b ack a,b fin a 此时a收到b的fin之后,a处于time_wait,a无法确定自己接下来的ack of fin是否被b收到,所以time_wait还是会持续一段时间。接着可能发生两件事情:
第一种,那么a可以确定第一次的ack没有及时到达b,继续发送ack,直到发生第二种。此时a可以关闭连接,因为在第一个MSL内,a收到的最后一次fin包发送之前的数据包都已经从网络消失,因为这些数据包到此时已经超过了MSL;又继续等待第二个MSL,确保a收到的最后一个fin包后面的所有重传fin包都不会存在网络了——如果约定最后一个fin包发送方控制重传时间窗口不超过1个MSL,那么a只要等待2MSL就可以确保所有的fin都已从网络消失。
再看b的close,应用层在socketclose之后,可能已经进程退出了,只不过内核还有socket的状态在维护,当然进程可能没有退出。
原文:https://www.cnblogs.com/linlei2099/p/10689792.html