time_wait 和 close_wait

时间:2023-12-31 21:45:02

tcp 四次握手状态图:

time_wait 和 close_wait

使用以下命令统计 tcp 连接信息:

netstat -n |awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a]}'

主动关闭会产生 time_wait 状态,被动关闭会产生 close_wait 状态:

如果 time_wait 数量多,需要修改 /etc/sysctl.conf 文件,使操作系统快速回收 time_wait,

如果 close_wait 数量多,是应用程序没有关闭连接。

那么,从应用程序的角度看,如何判断 tcp 连接是否关闭了呢?

Socket socket = ...
InputStream in = socket.getInputStream();
char buf[] = new char[1024];
int len;
while ((len = in.read(buf)) != -1) {
   System.out.println(new String(buf, 0, len));
}
in.close();
socket.close();

InputStream.read 返回 -1,则是对方主动关闭了连接。