详解netstat命令

Last Updated: 2023-03-17 09:00:52 Friday

-- TOC --

这是个古老的用来查看各种网络信息的命令,虽然有替代,但它依然好用(越是古老的东西,替代的过程就越缓慢)。较新的是ss命令

netstat命令的使用

$ 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 Domain Sockets

在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!

用socket.AF_UNIX做进程间通信

tcp6的疑惑

有一些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 --