主要有两个原因:
1)为了确保两端能完全关闭连接。
假设A服务器是主动关闭连接方,B服务器是被动方。如果没有TIME_WAIT状态,A 服务器发出最后一个 ACK 就进入关闭状态,如果这个 ACK 对端没有收到,对端就不能完成关闭。对端没有收到 ACK,会重发 FIN,此时连接关闭,这个 FIN 也得不到 ACK,而有 TIME_WAIT,则会重发这个 ACK,确保对端能正常关闭连接。
2)为了确保后续的连接不会收到“脏数据”。
刚才提到主动端进入 TIME_WAIT 后,等待 2MSL 后 CLOSE,这里的 MSL是指(maximum segment lifetime,我们内核一般是 30s,2MSL 就是 1 分钟),网络上数据包最大的生命周期。这是为了使网络上由于重传出现的 old duplicate segment 都消失后,才能创建参数(四元组,源 IP/PORT,目标 IP/PORT)相同的连接,如果等待时间不够长,又创建好了一样的连接,再收到old duplicate segment,数据就错乱了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。