Linux netstat命令详解
详细介绍Linux netstat命令的使用和各个参数的含义。
netstat
是一个用于显示网络连接、路由表、接口统计等信息的命令行工具,它在 Linux、Unix、Windows 等操作系统中都有实现。通过 netstat
命令,用户可以查看本机的网络状态,以便诊断和分析潜在的网络问题和性能瓶颈。netstat
命令的主要作用包括:
- 显示网络连接:netstat 可以显示 TCP 和 UDP 的活动连接,包括本地和远程地址、端口和连接状态(对于 TCP)等信息。
- 显示路由表:netstat 可以显示系统的 IP 路由表,了解数据包在网络中的传输路径。
- 显示接口统计:netstat 可以显示网络接口(如以太网、Wi-Fi 等)的统计信息,包括发送和接收的数据包数量、错误、丢包等。
- 显示协议统计:netstat 可以显示各种网络协议(如 TCP、UDP、ICMP 等)的统计信息,如发送和接收的数据包数量、错误、丢包等。
- 监控网络流量:netstat 可以实时显示网络接口上的数据包传输信息,以监控网络流量。
1. 常用参数
-
netstat -t
:显示所有活动的 TCP 连接。 -
netstat -u
:显示所有活动的 UDP 连接。 -
netstat -a
:显示所有活动连接和监听的套接字。 -
netstat -l
:仅显示处于监听状态的套接字。 -
netstat -n
:以数字形式显示地址和端口,而不是解析为主机名和服务名。 -
netstat -r
:显示路由表。 -
netstat -i
:显示网络接口的统计信息。 -
netstat -s
:显示所有协议(如 TCP、UDP、ICMP 等)的统计信息。 -
netstat -p
:显示进程和进程名称。 -
netstat -c
:连续刷新输出,以实时监视网络状态。 -
netstat -W
:不要缩略IP地址,并将其显示为完整的IP地址。
注意:
netstat
命令并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限方可查看所有的信息。
2. 输出信息含义
2.1 TCP/UDP连接
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 36 192.168.0.129:22 119.147.10.191:6747 ESTABLISHED
udp 0 0 192.168.0.129:68 192.168.0.254:67 ESTABLISHED
Proto
:协议,表示网络协议类型(如 TCP、UDP)。Recv-Q
:接收队列,表示套接字接收缓冲区中尚未被应用程序处理的数据的字节数。Send-Q
:发送队列,表示套接字发送缓冲区中尚未被确认的数据的字节数。Local Address
:本地地址,表示套接字的本地 IP 地址和端口号。Foreign Address
:外部地址,表示套接字的远程 IP 地址和端口号。(state)
:套接字的状态,仅适用于 TCP 协议。状态包括:- LISTEN:服务器上的进程正在监听客户端连接请求,套接字正在等待进入连接。
- SYN_SENT:TCP三次握手的第一步已完成,客户端向服务器发送了SYN包,等待服务器确认包(SYN+ACK)。
- SYN_RECEIVED:服务器收到了客户端的SYN请求,并向客户端发送了SYN+ACK数据包,现在等待客户端的最后一个ACK包以建立连接。
- ESTABLISHED:表示一个有效的TCP连接已经建立,双方的设备正在正常地发送和接收数据。
- FIN_WAIT1:这是一个TCP连接关闭过程中的状态,表示主动关闭连接的一方发送了FIN(结束)包,请求断开连接。
- FIN_WAIT2:这是一个TCP连接关闭过程中的状态,表示主动关闭连接的一方已收到了对方对FIN包的确认(FIN+ACK),仍然等待对方的结束包(FIN)。
- TIME_WAIT:这是一个TCP连接关闭过程中的状态。在收到对方的结束包(FIN)后,主动关闭连接方进入该状态,表示主动关闭连接方等待一定时间以确保对方收到了结束包确认。
- CLOSE_WAIT:这是一个TCP连接关闭过程中的状态,表示被动关闭连接方收到了连接关闭请求(FIN包),但尚未准备好关闭连接(例如,正在等待数据传输完成或应用程序关闭连接)。
- LAST_ACK:这是一个TCP连接关闭过程中的状态。被动关闭连接方发送了FIN包,并等待主动关闭连接方对其确认的最后一个ACK包。
- CLOSED:表示连接已完全关闭。
- CLOSING:这是一个非典型的状态,表示双方都尝试关闭连接,但在关闭之前没有完全交换FIN和对应的ACK包。这个状态并不常见。
2.2 UNIX套接字
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 3 [ ] DGRAM 11550 /run/systemd/notify
unix 2 [ ] DGRAM 11552 /run/systemd/cgroups-agent
unix 6 [ ] DGRAM 11567 /run/systemd/journal/socket
unix 2 [ ] DGRAM 212536 /run/user/0/systemd/notify
Proto
:协议类型,这里是unix
,表示这是 UNIX 域套接字。RefCnt
:引用计数,表示此套接字的引用次数,通常等于与该套接字关联的文件描述符数。Flags
:套接字的标志。在此示例中,标志为空([ ]
),表示没有特定标志设置。Type
:套接字类型。这里是DGRAM
,表示这是一个数据报(datagram)套接字,用于无连接的、不可靠的消息传输。State
:套接字的状态。对于数据报类型的 UNIX 域套接字,状态通常为空,因为它们不需要维护连接状态。I-Node
:套接字关联的 inode 号,用于标识文件系统中的唯一对象。Path
:UNIX 域套接字的路径,也称为套接字文件。这是进程之间通信时使用的标识符。
3.常用参数组合及使用场景
在实际使用中,netstat
命令一般会组合多个参数进行使用,以下是一些组合参数的示例:
netstat -tuln
:显示当前主机正在监听的端口。
netstat -anp
:显示所有的网络连接,并禁止解析为主机名和服务名,同时显示该连接对应的进程ID和进程名。
netstat -ltn
:显示所有处于监听状态的 TCP 连接。
netstat -lun
:显示所有处于监听状态的 UDP 连接。
根据实际需求,可以灵活组合这些参数,以查询特定的网络信息。
4. 其他网络相关的命令
ifconfig
(Linux)/ipconfig
(Windows):查看和配置网络接口信息,如 IP 地址、子网掩码、广播地址等。ip
(Linux):一个功能强大的网络配置工具,用于查看和管理路由、设备、策略路由和隧道。它逐渐取代了ifconfig
、route
和其他旧的网络命令。ping
:测试到特定主机的网络连通性,检查网络延迟和丢包率。traceroute
(Linux)/tracert
(Windows):显示数据包到达目标主机所经过的路由节点,以及每个节点的延迟。telnet
:使用 Telnet 协议远程登录到目标主机,或测试目标主机的指定端口连通性。ssh
:使用 SSH 协议远程登录目标主机,提供加密的安全连接。netstat
:显示网络连接、路由表、接口统计等信息。ss
:类似于netstat
,用于查看网络套接字信息,但性能更优。nslookup
:查询 DNS 服务器,解析域名的 IP 地址。dig
:类似于nslookup
,用于查询 DNS 服务器,提供更详细的信息输出。route
:查看和修改 IP 路由表。nc
(netcat):一个多功能的网络工具,用于读取、写入和转发TCP/UDP连接。curl
:一个命令行工具,用于从或向服务器传输数据,支持多种协议,如 HTTP、FTP、SFTP 等。wget
:一个命令行工具,用于从网络上下载文件,支持 HTTP、HTTPS 和 FTP 协议。arp
:查看和管理 ARP 缓存。nmap
:一个强大的网络扫描工具,用于发现主机、扫描端口、探测服务等。tcpdump
:捕获和分析网络数据包,用于故障排查和网络性能分析。
5. 扩展
- 系统最多能创建多少个连接?
系统能创建的最大网络连接数取决于多个因素,包括操作系统限制、系统资源(内存、CPU 等)和系统参数配置。以下是影响系统最多能创建的网络连接数的一些关键因素:
- 文件描述符限制:每个网络连接都需要一个文件描述符。
ulimit
命令可以查看或设置每个用户进程的文件描述符限制。查看当前用户的文件描述符限制:ulimit -n
。通常,这个限制可以通过修改系统配置文件(如/etc/security/limits.conf
)进行调整。 - TCP 和 UDP 端口范围:对于 TCP 和 UDP 连接,端口范围是有限的。在大多数系统中,可用端口范围是 1024 到 65535(一共有 64512 个可用端口)。这意味着在理论上,每个 IP 地址最多可以创建约 6 万个连接。在实践中,这个数量可能受到其他限制。
- 系统资源限制:创建和维护网络连接需要消耗系统资源(如内存、CPU、网络带宽等)。根据系统可用资源,实际可创建的网络连接数可能受到限制。
在现代操作系统中,通常能够支持数万个并发网络连接。对于高性能服务器,通过调整系统参数和优化资源使用,可以进一步提高这个限制。需要注意,创建大量网络连接时,可能会遇到其他问题(如网络拥塞、系统性能下降等)。在优化系统的网络连接能力时,需要考虑这些潜在问题,并采取适当的措施来确保系统的稳定性和性能。
- 如何判断机器上的网络压力是否较大?
- 检查网络带宽使用情况:可以使用网络监控工具(如
iftop
、nload
、vnstat
、bmon
等)检查当前网络传输速率和带宽使用情况。如果网络流量持续增加、接近或超过了机器的最大带宽,说明网络压力较大。 - 查看CPU和内存使用情况:高网络压力可能导致CPU和内存使用率较高。可以使用系统性能监控工具(如
top
、htop
、vmstat
、free
等)查看当前的CPU和内存使用状况。如有异常,可能表明网络压力较大。 - 检查网络连接数:可以使用
netstat
、ss
等命令查看机器当前的网络连接数。如果网络连接数异常增加、超过了正常范围,也可能是网络压力较大的表现。 - 监控网络延迟:可以使用
ping
等工具对目标地址进行网络延迟测试,如果延迟时间过长或者丢包率较高,则可能是网络压力较大的表现。
3.Linux服务器出现网络问题,排查步骤一般是怎样的?
-
检查网络连接:首先需要确认服务器的网络连接是否正常。可以使用
ping
命令检查服务器与其他设备之间的连通性。例如:ping www.baidu.com
。如果不能正常通信,请检查服务器的物理连接和交换机等设备。 -
检查IP地址和子网掩码:使用
ifconfig
或ip addr
命令查看服务器的IP地址和子网掩码配置是否正确。如果配置错误,请检查网络接口的配置文件(如/etc/sysconfig/network-scripts/ifcfg-eth0
)并进行修正。 -
检查默认网关: 使用
route -n
命令查看默认网关设置是否正确。默认网关应该与服务器连接的子网的网关地址相同。如果配置有误,请更正网络接口的配置文件。 -
检查DNS设置:查看
/etc/resolv.conf
文件,检查是否配置了正确的DNS服务器地址。确保服务器能够解析域名。使用nslookup
或dig
命令测试域名解析功能。 -
检查防火墙设置:检查服务器是否启用了防火墙,使用
iptables --list
或firewall-cmd --list-all
命令查看防火墙规则。确保防火墙开放了需要的端口并允许相关服务通行。 -
检查系统日志:查看
/var/log/messages
或其他相关日志文件,寻找与网络问题相关的错误或警告信息。排查日志中发现的异常信息。