通常,为了关闭TCP连接,客户端执行active close
并保持TIME_WAIT。服务器执行passive close
并将状态从LAST_ACK更改为关闭。为什么服务器也不会停留TIME_WAIT?是不是必须?
例如,如果之后在同一地址上建立了新连接(相同的源IP,源端口,dst IP,dst端口),如果服务器不能保持TIME_WAIT,则延迟数据包会使服务器混淆吗? / p>
答案 0 :(得分:0)
TIME_WAIT的目的是确保发送的ACK到达目的地。如果ACK被丢弃,则对等方可能选择重传FIN。 TIME_WAIT状态允许正确处理该重传。
在LAST_ACK的情况下,它正在等待对发送FIN的ACK,如果ACK尚未到来,则可以重新传输FIN。但是,在ACK到达后,再无其他操作。
现在,假设“服务器”(例如S)是它的TIME_WAIT,而“客户端”(例如C)是int LAST_ACK,但是现在已经收到了S发送的ACK。理论上,C可以立即重用绑定的套接字并立即发出另一个SYN。在这种情况下,服务器会做什么?
通常,TCP堆栈会丢弃或拒绝连接尝试,因为将新连接添加到表中会发现已经存在一个条目。可以将某些堆栈配置为在TIME_WAIT中“快速回收”套接字。这意味着S用新的连接替换了现有的TIME_WAIT条目。这样做的理由是它表明C已从LAST_ACK过渡出来。该假设是否有效取决于是否使用NAT,以及如何配置NAT设备。