详细介绍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. 输出信息含义

image-20230606202917776

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:显示当前主机正在监听的端口。

image-20230606195803337

  • netstat -anp:显示所有的网络连接,并禁止解析为主机名和服务名,同时显示该连接对应的进程ID和进程名。

image-20230606200759546

  • netstat -ltn:显示所有处于监听状态的 TCP 连接。

  • netstat -lun:显示所有处于监听状态的 UDP 连接。

image-20230606201112589

根据实际需求,可以灵活组合这些参数,以查询特定的网络信息。

4. 其他网络相关的命令

  1. ifconfig(Linux)/ ipconfig(Windows):查看和配置网络接口信息,如 IP 地址、子网掩码、广播地址等。
  2. ip(Linux):一个功能强大的网络配置工具,用于查看和管理路由、设备、策略路由和隧道。它逐渐取代了 ifconfigroute 和其他旧的网络命令。
  3. ping:测试到特定主机的网络连通性,检查网络延迟和丢包率。
  4. traceroute(Linux)/ tracert(Windows):显示数据包到达目标主机所经过的路由节点,以及每个节点的延迟。
  5. telnet:使用 Telnet 协议远程登录到目标主机,或测试目标主机的指定端口连通性。
  6. ssh:使用 SSH 协议远程登录目标主机,提供加密的安全连接。
  7. netstat:显示网络连接、路由表、接口统计等信息。
  8. ss:类似于 netstat,用于查看网络套接字信息,但性能更优。
  9. nslookup:查询 DNS 服务器,解析域名的 IP 地址。
  10. dig:类似于 nslookup,用于查询 DNS 服务器,提供更详细的信息输出。
  11. route:查看和修改 IP 路由表。
  12. nc(netcat):一个多功能的网络工具,用于读取、写入和转发TCP/UDP连接。
  13. curl:一个命令行工具,用于从或向服务器传输数据,支持多种协议,如 HTTP、FTP、SFTP 等。
  14. wget:一个命令行工具,用于从网络上下载文件,支持 HTTP、HTTPS 和 FTP 协议。
  15. arp:查看和管理 ARP 缓存。
  16. nmap:一个强大的网络扫描工具,用于发现主机、扫描端口、探测服务等。
  17. tcpdump:捕获和分析网络数据包,用于故障排查和网络性能分析。

5. 扩展

  1. 系统最多能创建多少个连接?

系统能创建的最大网络连接数取决于多个因素,包括操作系统限制、系统资源(内存、CPU 等)和系统参数配置。以下是影响系统最多能创建的网络连接数的一些关键因素:

  • 文件描述符限制:每个网络连接都需要一个文件描述符。ulimit 命令可以查看或设置每个用户进程的文件描述符限制。查看当前用户的文件描述符限制:ulimit -n 。通常,这个限制可以通过修改系统配置文件(如 /etc/security/limits.conf)进行调整。
  • TCP 和 UDP 端口范围:对于 TCP 和 UDP 连接,端口范围是有限的。在大多数系统中,可用端口范围是 1024 到 65535(一共有 64512 个可用端口)。这意味着在理论上,每个 IP 地址最多可以创建约 6 万个连接。在实践中,这个数量可能受到其他限制。
  • 系统资源限制:创建和维护网络连接需要消耗系统资源(如内存、CPU、网络带宽等)。根据系统可用资源,实际可创建的网络连接数可能受到限制。

在现代操作系统中,通常能够支持数万个并发网络连接。对于高性能服务器,通过调整系统参数和优化资源使用,可以进一步提高这个限制。需要注意,创建大量网络连接时,可能会遇到其他问题(如网络拥塞、系统性能下降等)。在优化系统的网络连接能力时,需要考虑这些潜在问题,并采取适当的措施来确保系统的稳定性和性能。

  1. 如何判断机器上的网络压力是否较大?
  • 检查网络带宽使用情况:可以使用网络监控工具(如iftopnloadvnstatbmon等)检查当前网络传输速率和带宽使用情况。如果网络流量持续增加、接近或超过了机器的最大带宽,说明网络压力较大。
  • 查看CPU和内存使用情况:高网络压力可能导致CPU和内存使用率较高。可以使用系统性能监控工具(如tophtopvmstatfree等)查看当前的CPU和内存使用状况。如有异常,可能表明网络压力较大。
  • 检查网络连接数:可以使用netstatss等命令查看机器当前的网络连接数。如果网络连接数异常增加、超过了正常范围,也可能是网络压力较大的表现。
  • 监控网络延迟:可以使用ping等工具对目标地址进行网络延迟测试,如果延迟时间过长或者丢包率较高,则可能是网络压力较大的表现。

3.Linux服务器出现网络问题,排查步骤一般是怎样的?

  • 检查网络连接:首先需要确认服务器的网络连接是否正常。可以使用ping 命令检查服务器与其他设备之间的连通性。例如:ping www.baidu.com。如果不能正常通信,请检查服务器的物理连接和交换机等设备。

  • 检查IP地址和子网掩码:使用ifconfigip addr命令查看服务器的IP地址和子网掩码配置是否正确。如果配置错误,请检查网络接口的配置文件(如/etc/sysconfig/network-scripts/ifcfg-eth0)并进行修正。

  • 检查默认网关: 使用route -n 命令查看默认网关设置是否正确。默认网关应该与服务器连接的子网的网关地址相同。如果配置有误,请更正网络接口的配置文件。

  • 检查DNS设置:查看/etc/resolv.conf 文件,检查是否配置了正确的DNS服务器地址。确保服务器能够解析域名。使用nslookupdig 命令测试域名解析功能。

  • 检查防火墙设置:检查服务器是否启用了防火墙,使用iptables --listfirewall-cmd --list-all 命令查看防火墙规则。确保防火墙开放了需要的端口并允许相关服务通行。

  • 检查系统日志:查看/var/log/messages 或其他相关日志文件,寻找与网络问题相关的错误或警告信息。排查日志中发现的异常信息。

See Also