Last Updated: 2023-03-17 09:00:52 Friday
-- TOC --
这是个古老的用来查看各种网络信息的命令,虽然有替代,但它依然好用(越是古老的东西,替代的过程就越缓慢)。较新的是ss命令。
$ netstat --tcp -an4
$ netstat -tan4
--tcp
可以写成-t
,貌似也可以省略不写。
--udp
可以写成-u
,UDP也会绑定端口,固定自己的地址。
--raw
可以写成-w
,表示raw socket。
-a
,all,所有TCP连接信息都会显示,如果没有此参数,只显示所有active的tcp连接。
$ netstat --tcp -an4 | grep LISTEN
-n
,使用ip地址,而不是hostname来输出。
-4
,IPv4。(慎用,监听在IPv6上的socket,也可能支持IPv4)
-p
,可以查看PID/ProcessName,有些进程信息要使用sudo
才能看到,这个参数可以很方便的查看端口号是被哪些进程占用着的,释放端口的方法就是kill
。
$ sudo netstat -anpt4
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1218/dnsmasq
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 672/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 830/sshd: /usr/sbin
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 760/cupsd
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 2998/sshd: xinlin@p
tcp 0 1 192.168.16.104:39170 35.224.170.84:80 LAST_ACK -
tcp 0 0 192.168.16.104:22 192.168.16.101:57503 ESTABLISHED 2910/sshd: xinlin [
tcp 1 1 192.168.16.104:39172 35.224.170.84:80 CLOSING -
tcp 0 96 192.168.16.104:22 192.168.16.101:57502 ESTABLISHED 2894/sshd: xinlin [
-l
,--listening
,显示监听端口,默认这些都不显示(除非用-a
)!
$ netstat -t4l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 K:domain 0.0.0.0:* LISTEN
tcp 0 0 localhost: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:6010 0.0.0.0:* LISTEN
$ netstat -u4l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 0.0.0.0:631 0.0.0.0:*
udp 0 0 0.0.0.0:52306 0.0.0.0:*
udp 0 0 0.0.0.0:mdns 0.0.0.0:*
udp 0 0 K:domain 0.0.0.0:*
udp 0 0 localhost:domain 0.0.0.0:*
udp 0 0 0.0.0.0:bootps 0.0.0.0:*
$ netstat -i
可以把这个命令看做ifconfig
的简化版。
-A
,--protocol
,指定协议,如下命令,用来查看UNIX Domain Socket的信息:
$ netstat -A unix
--statistics, -s,Display summary statistics for each protocol.
如何查看和解读TCP连接的各种统计信息?
在Unix的发展史中,AT&T和BSD是两大主力,在进程间通信方面两者着重点各有不同!
AT&T保留传统的Unix IPC写法,着重对其实现细节加以打磨,形成了SysV IPC通信机制。而BSD则直接将机器内部进程间通信视为不同机器进程间通信的一个特例,将两者在写法上都统一为socket形式。
由于socket在单机实现上与SysV IPC并没有很大差别,而又与跨机器进程间通信的写法相统一,所以socket成为了更常用的通信形式。
另外要注意,socket在单机实现上与SysV IPC并没有很大差别,这就意味着socket单机实现上与socket跨机器实现上是有较大差别的,最直接的一点是由于是在单台机器上报文的传递并不需要复杂的TCP等协议去保证其顺序性,所以从性能等方面分析,IPC使用AF_UNIX会优于AF_INET!。
有一些server地址,用netstat查看时,显示其监听地址在tcp6上,但其实完全可以走IPv4的流量去访问。这是因为,监听在IPv6协议栈上面的socket,默认也可以接收IPv4地址。比如httpd在源码中有一段注释:
// 代码 server/listen.c 的 open_listeners() 函数中
/* If we have the unspecified IPv4 address (0.0.0.0) and
* the unspecified IPv6 address (::) is next, we need to
* swap the order of these in the list. We always try to
* bind to IPv6 first, then IPv4, since an IPv6 socket
* might be able to receive IPv4 packets if V6ONLY is not
* enabled, but never the other way around.
* ... 省略 ...
*/
所以,那些支持双栈的server,可能都是监听在IPv6的unspecified address上,同时支持IPv4和IPv6。但此时用netstat命令,就只能看到tcp6部分有对应的监听信息。当然,也有的server,其监听信息,可以同时在tcp和tcp6上都找到。这完全是代码实现造成的。
本文链接:https://cs.pynote.net/net/tcp/202203261/
-- EOF --
-- MORE --