Linux Socket状态及含义

linux 主机 man netstat 有些是11个状态,有些是12个状态 区别在是否有CLOSED 套接字未用

我们假设都是客户端断开连接

状态 描述
0. LISTEN 服务端建立监听 如java服务 8080
1. SYN_SENT 客户端建立连接 发送SYN
2. SYN_RECV 服务端收到SYN 发送ACK SYN
3. ESTABLISHED 双方连接建立,可进行数据传输
4. FIN_WAIT1 客户端断开连接,发送FIN,此时已经不能发送数据了
5. CLOSE_WAIT 服务器收到客户端的FIN,并且发送ACK
6. FIN_WAIT2 客户端收到服务器的ACK
7. LAST_ACK 服务端数据发送完毕,发送FIN
8. TIME_WAIT 客户端收到服务器的FIN,发送ACK
9. CLOSED 服务器收到客户端的ACK
10. CLOSING 双方都要结束
11. UNKNOWN 未知状态

状态总结

客户端独有的:SYN_SENT 、FIN_WAIT1 、FIN_WAIT2 、CLOSING 、TIME_WAIT
服务器独有的:LISTEN、SYN_RCVD 、CLOSE_WAIT、LAST_ACK
共有的:CLOSED、ESTABLISHED

常见问题

  1. 大量 CLOSE_WAIT => 原因 代码中可能没有关闭连接
  2. 大量TIME_WAIT 客户端建立了大量短连接,在使用完毕后关闭必须要有TIME_WAIT 原因是 防止端口重用发消息。 时间是2msl

查看socket状态统计

一般用来做socket监控

当我们打开的socket数量很多时,netstat就会变得慢了,有什么办法可以快速查看系统中socket状态?

cat /proc/net/sockstat

sockets: used 137
TCP: inuse 49 orphan 0 tw 3272 alloc 52 mem 46
UDP: inuse 1 mem 0
RAW: inuse 0
FRAG: inuse 0 memory 0

说明:
sockets: used:已使用的所有协议套接字总量
TCP: inuse:正在使用(正在侦听)的TCP套接字数量。其值≤ netstat —lnt | grep ^tcp | wc -l
TCP: orphan:无主(不属于任何进程)的TCP连接数(无用、待销毁的TCP socket数)
TCP: tw:等待关闭的TCP连接数。其值等于netstat —ant | grep TIME_WAIT | wc -l
TCP:alloc(allocated):已分配(已建立、已申请到sk_buff)的TCP套接字数量。其值等于netstat —ant | grep ^tcp | wc -l
TCP:mem:套接字缓冲区使用量(单位不详。用scp实测,速度在4803.9kB/s时:其值=11,netstat —ant 中相应的22端口的Recv-Q=0,Send-Q≈400)
UDP:inuse:正在使用的UDP套接字数量
RAW:
FRAG:使用的IP段数量