Netstat 输出(netstat -an
)包含多个具有相同外部(客户端)ip 和端口的连接,例如:
TCP server_ip:49421 client_ip:4000 TIME_WAIT
TCP server_ip:52772 client_ip:4000 TIME_WAIT
TCP server_ip:56807 client_ip:4000 TIME_WAIT
TCP server_ip:61969 client_ip:4000 TIME_WAIT
并且这种情况在注册表中减少TcpTimedWaitDelay
参数后重复出现。这是否意味着服务器或客户端错误地关闭了套接字,或者这是正常情况?
答案1
TL;DR:TIME_WAIT
这是预期的正常套接字状态,当已建立 TCP 连接的本地端要求先关闭连接时,就会出现这种情况。如果远程端先要求,则不会有本地,TIME_WAIT
而远程端会保留一个TIME_WAIT
。本身来说,大量的连接并没有错TIME_WAIT
,只是意味着最近关闭了大量连接。这取决于您决定这对您的应用程序和工作流程是否正常。
的TIME_WAIT
目标是防止立即重用相同的连接localip:localport - remoteip:remoteport
,在最大段生命周期:如果互联网上前一个连接的游荡/重复数据包恰好具有匹配的序列号,则它们可能会迟到并被视为新连接的一部分。今天很可能有其他措施可以防止这种情况发生,而在 1981 年发布 TCP 规范时还不存在这些措施。
参考:RFC 793:传输控制协议从 1981 年开始,参见3.5. 关闭连接图 13.
另引自3.3. 序列号:
知道何时保持沉默
为了确保 TCP 不会创建带有
可能与网络中剩余的旧段重复的序列号的段,TCP 必须
在启动或
从崩溃中恢复时保持静默,在分配任何序列号之前保持静默,崩溃会导致正在使用的序列号的内存丢失。对于此规范,MSL 取为 2 分钟。这是一个工程选择,如果经验表明这样做是可取的,则可以更改。请注意,如果 TCP 在某种意义上重新初始化,但仍保留其正在使用的序列号的内存,则它根本不需要等待;它只需确保使用 比最近使用的
序列号更大的序列号。
我理解,在此引文中“TCP”的意思是localip:localport - remoteip:remoteport
保持安静是由 强制执行的TIME_WAIT
。