查看一个网络端口是否被使用,我们可以通过netstat命令获取当前Linux系统下网络端口的使用信息,如果里面包含我们查询的端口,说明此端口被使用;反之,说明此端口没有被使用。netstat使用如下:
// 查看UDP使用信息,其中包含了端口的使用信息
$ netstat -au
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp 0 0 0.0.0.0:53001 0.0.0.0:*
udp 0 0 zrk-xxxx:domain 0.0.0.0:*
udp 0 0 0.0.0.0:bootps 0.0.0.0:*
udp 0 0 0.0.0.0:sunrpc 0.0.0.0:*
udp 0 0 localhost:323 0.0.0.0:*
udp 0 0 0.0.0.0:56070 0.0.0.0:*
udp 0 0 localhost:804 0.0.0.0:*
udp6 0 0 [::]:mdns [::]:*
udp6 0 0 [::]:60681 [::]:*
udp6 0 0 [::]:40404 [::]:*
udp6 0 0 [::]:sunrpc [::]:*
udp6 0 0 localhost:323 [::]:*
// 查看TCP使用信息,其中包含了端口的使用信息
$ netstat -at
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 zrk-xxxx:domain 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 localhost:ipp 0.0.0.0:* LISTEN
tcp 0 0 localhost:33125 0.0.0.0:* LISTEN
tcp 0 0 localhost:10248 0.0.0.0:* LISTEN
tcp 0 0 localhost:10249 0.0.0.0:* LISTEN
tcp 0 0 localhost:9099 0.0.0.0:* LISTEN
......
进一步思考netstat是如何得知端口的占用情况的呢?查看netstat源码可以看出它是通过解析/proc/net路径下对应的文件得知对应的端口使用情况的。不同的网络协议对应不同的文件。例如,/proc/net/udp文件存放的就是udp协议相关的网络使用信息。
$ ls /proc/net/
anycast6 fib_trie igmp6 ip_tables_matches ip_vs_conn netfilter protocols rpc sockstat udp
arp fib_triestat ip6_flowlabel ip_tables_names ip_vs_conn_sync netlink psched rt6_stats sockstat6 udp6
connector icmp ip6_mr_cache ip_tables_targets ip_vs_stats netstat ptype rt_acct softnet_stat udplite
dev icmp6 ip6_mr_vif ipv6_route ip_vs_stats_percpu nf_conntrack raw rt_cache stat udplite6
dev_mcast if_inet6 ip_mr_cache ip_vs mcfilter nf_conntrack_expect raw6 snmp tcp unix
dev_snmp6 igmp ip_mr_vif ip_vs_app mcfilter6 packet route snmp6 tcp6 xfrm_stat
// upd使用信息
$ cat /proc/net/udp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
436: 00000000:14E9 00000000:0000 07 00000000:00000000 00:00000000 00000000 70 0 29973 2 00000000dcd009eb 54
980: 00000000:CF09 00000000:0000 07 00000000:00000000 00:00000000 00000000 70 0 29975 2 00000000b8175bcd 0
1280: 017AA8C0:0035 00000000:0000 07 00000000:00000000 00:00000000 00000000 0 0 35039 2 00000000cb5140c4 0
......
其中local_address列就是udp使用的地址,‘:’后面的就是其使用的端口的十六进制表示。例如00000000:CF09,CF09==53001,在上面使用netstat -au查看的信息里就有53001端口信息。
网友评论