tcp 四次握手状态图:
使用以下命令统计 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,则是对方主动关闭了连接。