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
常见问题
- 大量 CLOSE_WAIT => 原因 代码中可能没有关闭连接
- 大量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段数量