python监控TCP连接数
python监控TCP连接数先来了解下/proc/net/tcp这个文件,这里记录的是ipv4下所有tcp连接的情况,包括下列数值
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
备注:文件中都是用的16进制 我们关注st这列,
状态码对照表
code | 状态码 | 描述 |
---|---|---|
00 | ERROR_STATUS | |
01 | TCP_ESTABLISHED | 代表一个打开的连接 |
02 | TCP_SYN_SENT | 在发送连接请求后等待匹配的连接请求 |
03 | TCP_SYN_RECV | 在收到和发送一个连接请求后等待对方对连接请求的确认 |
04 | TCP_FIN_WAIT1 | 等待远程TCP连接中断请求,或先前的连接中断请求的确认 |
05 | TCP_FIN_WAIT2 | 从远程TCP等待连接中断请求 |
06 | TCP_TIME_WAIT | 等待足够的时间以确保远程TCP接收到连接中断请求的确认 |
07 | TCP_CLOSE | 等待远程TCP对连接中断的确认 |
08 | TCP_CLOSE_WAIT | 等待从本地用户发来的连接中断请求 |
09 | TCP_LAST_ACK | 等待原来的发向远程TCP的连接中断请求的确认 |
0A | TCP_LISTEN | 侦听来自远方的TCP端口的连接请求 |
0B | TCP_CLOSING | 没有任何连接状态 |
python代码如下
#!/usr/bin/python # coding:utf-8 from itertools import dropwhile sys_st = { "00": "ERROR_STATUS", "01": "TCP_ESTABLISHED", "02": "TCP_SYN_SENT", "03": "TCP_SYN_RECV", "04": "TCP_FIN_WAIT1", "05": "TCP_FIN_WAIT2", "06": "TCP_TIME_WAIT", "07": "TCP_CLOSE", "08": "TCP_CLOSE_WAIT", "09": "TCP_LAST_ACK", "0A": "TCP_LISTEN", "0B": "TCP_CLOSING", } tcp_static_dict = {} with open("/proc/net/tcp") as f: for line in dropwhile(lambda line: line.strip().startswith('sl'), f): tcp_status_code = line.split()[3] if sys_st.has_key(tcp_status_code): if tcp_static_dict.get(sys_st[tcp_status_code], None) is None: tcp_static_dict[sys_st[tcp_status_code]] = 1 else: tcp_static_dict[sys_st[tcp_status_code]] += 1 print tcp_static_dict