这些 网络IO性能监控 工具和技巧,一定要学会

文摘   2024-11-25 09:02   广东  

点击上方【蓝字】关注博主

 详细讲解了Linux系统中用于查看网络配置、套接字信息、协议栈统计信息和网络吞吐情况的命令,例如ifconfig、ip、netstat、ss、sar、ping、mtr、telnet、nc、nslookup、traceroute、iptraf、tcpdump、nmap、lsof、ethtool等。

01

性能指标

通常用带宽、吞吐量、延时、PPS(Packet Per Second)等指标衡量网络的性能。

  • 带宽:表示链路的最大传输速率,单位通常为 b/s (比特 / 秒)。

  • 吞吐量:表示单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽限制,而 吞吐量 / 带宽 ,也就是该网络的使用率。

  • 延时:表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景中,这一指标可能会有不同含义。比如,它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)。

  • PPS 是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力,比如硬件交换机,通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影响。

除了这些指标,网络的可用性(网络能否正常通信)、并发连接数(TCP 连接数量)、丢包率(丢包百分比)、重传率(重新传输的网络包比例)等也是常用的性能指标。    

02

网络信息

2.1、网络配置

使用 ifconfig 或者 ip 命令,来查看网络的配置。ifconfig 和 ip 分别属于软件包 net-tools 和 iproute2iproute2 是 net-tools 的下一代。ifconfig 已经逐渐被 ip 命令替代,因为 ip 命令提供了更全面和现代的功能;通常情况下它们会在发行版中默认安装。如果你找不到 ifconfig 或者 ip 命令,可以安装这两个软件包。

# Debian/Ubuntu及其衍生版:
sudo apt update
sudo apt install net-tools
sudo apt install iproute2

# Red Hat/CentOS/Fedora:
sudo yum install net-tools
sudo yum install iproute
# 或者
sudo dnf install net-tools
sudo dnf install iproute

# Arch Linux及其衍生版:
sudo pacman -S iproute2

以网络接口 eth0 为例。

使用ifconfig:

root@ubuntu:/home/fly# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0c:29:11:82:79
inet addr:192.168.206.134 Bcast:192.168.206.255 Mask:255.255.255.0
inet6 addr: fe80::ceb7:e01f:2d2b:c50e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:48485 errors:0 dropped:0 overruns:0 frame:0
TX packets:124191 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:35666099 (35.6 MB) TX bytes:8827549 (8.8 MB)

使用ip:

root@ubuntu:/home/fly# ip -s addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:11:82:79 brd ff:ff:ff:ff:ff:ff
inet 192.168.206.134/24 brd 192.168.206.255 scope global dynamic ens33
valid_lft 1493sec preferred_lft 1493sec
inet6 fe80::ceb7:e01f:2d2b:c50e/64 scope link
valid_lft forever preferred_lft forever
RX: bytes packets errors dropped overrun mcast
35667821 48505 0 0 0 0
TX: bytes packets errors dropped carrier collsns
8831315 124236 0 0 0 0

RX 是指系统接受到网络包的情况,TX 是指系统发送网络数据包的情况。bytes表示收、发数据的字节数;packets 表示收、发数据包的个数。

以下和网络性能密切相关的指标需要掌握:

  • 网络接口的状态标志。ifconfig 输出中的 RUNNING ,或 ip 输出中的 LOWER_UP ,都表示物理网络是连通的,即网卡已经连接到了交换机或者路由器中。如果你看不到它们,通常表示网线被拔掉了。

  • MTU 的大小。MTU 默认大小是 1500,根据网络架构的不同(比如是否使用了 VXLAN 等叠加网络),你可能需要调大或者调小 MTU 的数值。

  • 网络接口的 IP 地址、子网以及 MAC 地址。这些都是保障网络功能正常工作所必需的,你需要确保配置正确。

  • 网络收发的字节数、包数、错误数以及丢包情况,特别是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,通常表示出现了网络 I/O 问题。其中:

    • errors 表示发生错误的数据包数,比如校验错误、帧同步错误等;

    • dropped 表示丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包;

    • overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包;

    • carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;

    • collisions 表示碰撞数据包数。

2.2、套接字信息

使用netstat 或者 ss 命令来查看套接字、网络栈、网络接口以及路由表的信息。

小技巧:查询网络的连接信息ssnetstat查询速度更快。

netstat 是一个常用的网络监控和故障排除工具,可以显示网络连接、路由表、接口统计以及网络协议的信息。虽然在一些Linux发行版中,netstat 已经被 ss 命令所替代,但它仍然在很多系统中可用。

netstat 命令选项:

选项说明
-a, --all显示所有的连接和监听的端口。默认不显示LISTEN相关
-t, --tcp显示TCP连接。
-u, --udp显示UDP连接。
-l, --listening仅显示正在监听的服务的端口。
-p, --program显示使用该连接的程序的PID和名称。
-n, --numeric不进行域名解析,直接显示IP地址和端口号。
-r, --route显示路由信息(路由表)。
-i, --interfaces显示网络接口信息。
-s, --statistics显示网络统计信息(例如每种协议的统计信息)。
-c持续输出,每隔一个固定时间,执行该netstat命令。类似于 top 命令。
-d显示每个连接的延迟(时间)。
-e显示更详细的信息(扩展的信息),例如uid等。
-h, --help显示帮助信息。
-V, --version显示版本信息。
--tcp6显示IPv6 TCP连接。
--udp6显示IPv6 UDP连接。

可以结合head命令一起使用,比如head -n 3 表示只显示前面3行。

示例:

$ netstat -nlp | head -n 3
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:6371 0.0.0.0:* LISTEN 3098/redis-server *

ss 命令是一个用于调查 sockets(套接字)状态的工具,被视为netstat 命令的替代品。支持显示比 netstat 更详细的内容。

ss 命令的一些常用参数和选项:

选项说明
-a, --all显示所有的连接,包括监听和非监听(默认仅显示已连接的)。
-t, --tcp显示TCP连接。
-u, --udp显示UDP连接。
-x, --unix显示Unix域套接字。
-l, --listening显示只在监听状态的连接。
-p, --processes显示与连接相关联的进程ID及其名称。
-n, --numeric不解析为域名或服务名称,直接显示IP地址和端口号。
-r, --route显示路由信息。
-s, --summary显示 socket 统计信息的摘要。
-e, --extended显示详细的socket参数。
-i, --info显示在数据包的交换期间,接口的接收和发送统计。
-m显示内存信息。
-6强制显示IPv6地址。
-4强制显示IPv4地址。
-h, --help显示帮助信息。
-V, --version显示版本信息。
-c, --continuous持续输出,类似于 top 命令。

示例:

# -l 表示只显示监听套接字
# -t 表示只显示 TCP 套接字
# -n 表示显示数字地址和端口(而不是名字)
# -p 表示显示进程信息
$ ss -ltnp | head -n 3
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:6371 *:* users:(("redis-server",pid=3098,fd=6))
LISTEN 0 80 127.0.0.1:3306 *:* users:(("mysqld",pid=1236,fd=39))

netstat 和 ss 的输出是类似的,都展示了套接字的状态、接收队列、发送队列、本地地址、远端地址、进程 PID 和进程名称等。其中,接收队列(Recv-Q)和发送队列(Send-Q)需要特别关注,它们通常应该是 0。当你发现它们不是 0 时,说明有网络包的堆积发生。当然还要注意,在不同套接字状态下,它们的含义不同。

当套接字处于连接状态(Established)时:

  • Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)

  • Send-Q 表示还没有被远端主机确认的字节数(即发送队列长度)

当套接字处于监听状态(Listening)时:
  • Recv-Q 表示全连接队列的长度。

  • Send-Q 表示全连接队列的最大长度。

所谓全连接,是指服务器收到了客户端的 ACK,完成了 TCP 三次握手,然后就会把这个连接挪到全连接队列中。这些全连接中的套接字,还需要被accept() 系统调用取走,服务器才可以开始真正处理客户端的请求。

与全连接队列相对应的,还有一个半连接队列。所谓半连接是指还没有完成 TCP 三次握手的连接,连接只进行了一半。服务器收到了客户端的 SYN 包后,就会把这个连接放到半连接队列中,然后再向客户端发送 SYN+ACK 包。

2.3、协议栈统计信息

可以使用 netstat 或 ss 查看协议栈的信息。

$ netstat -s
Ip:
Forwarding: 2
1995831 total packets received
1 with invalid addresses
0 forwarded
0 incoming packets discarded
1995830 incoming packets delivered
2001017 requests sent out
3 dropped because of missing route
Icmp:
15 ICMP messages received
5 input ICMP message failed
ICMP input histogram:
destination unreachable: 11
timeout in transit: 4
10 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
destination unreachable: 10
IcmpMsg:
InType3: 11
InType11: 4
OutType3: 10
Tcp:
67823 active connection openings
37815 passive connection openings
4990 failed connection attempts
19055 connection resets received
5 connections established
......
InCsumErrors: 3
Udp:
145182 packets received
10 packets to unknown port received
0 packet receive errors
145193 packets sent
0 receive buffer errors
0 send buffer errors
UdpLite:
TcpExt:
4923 resets received for embryonic SYN_RECV sockets
10447 TCP sockets finished time wait in fast timer
9 packetes rejected in established connections because of timestamp
69036 delayed acks sent
......
IpExt:
InOctets: 1178331085
OutOctets: 469568615
InNoECTPkts: 2401061
InECT1Pkts: 2
InECT0Pkts: 251
MPTcpExt:

使用 ss

$ ss -s
Total: 199
TCP: 12 (estab 5, closed 1, orphaned 0, timewait 1)

Transport Total IP IPv6
RAW 0 0 0
UDP 4 3 1
TCP 11 10 1
INET 15 13 2
FRAG 0 0 0

这些协议栈的统计信息都很直观。ss 只显示已经连接、关闭、孤儿套接字等简要统计,而 netstat 则提供的是更详细的网络协议栈信息。比如,上面 netstat 的输出示例,就展示了 TCP 协议的主动连接、被动连接、失败重试、发送和接收的分段数量等各种信息。

2.4、网络吞吐

给 sar 命令 增加 -n 参数就可以查看网络的统计信息,比如网络接口(DEV)、网络接口错误(EDEV)、TCP、UDP、ICMP 等等。执行下面的命令,你就可以得到网络接口统计信息:

root@8hjkajd003:~$ sar -n DEV 1
Linux 4.4.0-93-generic (iZbp1h2l856zgoegc8rvnhZ) 11/02/2021 _x86_64_ (1 CPU)

06:38:15 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
06:38:16 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
06:38:16 PM eth0 11.46 10.42 6.35 2.47 0.00 0.00 0.00 0.00

输出指标含义

  • rxpck/s 和 txpck/s 分别是接收和发送的 PPS,单位为包 / 秒。

  • rxkB/s 和 txkB/s 分别是接收和发送的吞吐量,单位是 KB/ 秒。

  • rxcmp/s 和 txcmp/s 分别是接收和发送的压缩数据包数,单位是包 / 秒。

  • %ifutil 是网络接口的使用率,即半双工模式下为 (rxkB/s+txkB/s)/Bandwidth,而全双工模式下为 max(rxkB/s, txkB/s)/Bandwidth。

[root@ubuntu ~]$ sar -n DEV 1 1

Linux 3.10.0-957.5.1.el7.x86_64 (ubuntu) 08/23/2019 x86_64 (1 CPU)

10:57:49 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
10:57:50 AM eth0 9.09 13.13 0.56 1.01 0.00 0.00 0.00
10:57:50 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
10:57:50 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
Average: eth0 9.09 13.13 0.56 1.01 0.00 0.00 0.00
Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00

从输出中可以看到网卡的读写速度和流量,在应急过程中可以用来判断服务器是否上量。

此命令除了可以用于查看网卡的信息,还可以用来收集如下服务的状态信息。

参数内容
-A所有报告的总和
-uCPU利用率
-v进程、I节点、文件和锁表状态
-d硬盘的使用报告
-r没有使用的内存页面和硬盘快
-g串口I/O的情况
-b缓冲区的使用情况
-a文件的读写情况
-c系统的调用情况
-R进程的活动情况
-y终端设备的活动情况
-w系统的交换活动

为什么要统计带宽情况呢?
因为如果开发使用的是云服务器,假设提供的云服务器是百兆的带宽,当部署应用的时候,可能会发现大图片加载特别慢,通过sar命令监控带宽,可以发现txkB/s的值只有几百 KB ,最终确定是因为云服务器限流了。因此,当你发现带宽上不去时,不要轻易相信别人的话,要自己测试看看是不是服务器设置导致的。

所以,sar对带宽检测就非常有用。当然,还有ping命令也是可以测试带宽的。

03

连通性和延时

3.1、ping 命令

ping 命令是一个用于测试网络连接的实用程序。它通过向目标主机发送一系列 ICMP(Internet 控制消息协议)回显请求数据包并等待响应来工作。

通常使用 ping ,来测试远程主机的连通性和延时。ping命令是用于检测网络故障的常用命令,可以用来测试一台主机到另外一台主机的网络是否连通。

语法

ping [选项] <目标主机>

常用选项

参数描述
-d使用 Socket 的 SO_DEBUG 功能
-c <完成次数>设置完成要求回应的次数,默认值为 5。
-f极限检测
-i <间隔秒数>指定收发信息的间隔时间,单位为秒。默认值为 1 秒。
-I <网络界面>使用指定的网络接口送出数据包
-l <前置载入>设置在送出要求信息之前,先行发出的数据包
-n只输出数值
-p <范本样式>设置填满数据包的范本样式
-q不显示指令执行过程,开头和结尾的相关信息除外
-r忽略普通的 Routing Table,直接将数据包送到远端主机上
-R记录路由过程
-s <数据包大小>设置数据包的大小,单位为字节。默认值为 56 字节。
-t <存活数值>设置存活数值 TTL 的大小,默认持续 ping,直到按 Ctrl+C 停止。
-v启用详细输出,显示每个数据包的详细信息。
-w指定在不收到响应时等待响应的时间,单位为秒。默认值为 10 秒。

ping 命令的输出包括以下信息:

  • 目标主机: 已 ping 的主机名或 IP 地址。

  • 数据包统计信息: 已发送、已接收、丢失的数据包数量以及数据包丢失率。

  • 往返时间 (RTT): 数据包从发送到接收再返回所需时间的最小、平均和最大值。RTT 以毫秒为单位测量。

  • TTL (生存时间): 数据包在网络中传输之前被路由器丢弃之前允许经过的跳数。

示例:

root@ubuntu:/home/fly$ ping -c 3 baidu.com
PING baidu.com (220.181.38.251) 56(84) bytes of data.
64 bytes from 220.181.38.251: icmp_seq=1 ttl=128 time=32.0 ms
64 bytes from 220.181.38.251: icmp_seq=2 ttl=128 time=31.7 ms
64 bytes from 220.181.38.251: icmp_seq=3 ttl=128 time=34.3 ms

--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 31.740/32.717/34.324/1.154 ms

说明:

  1. ping 目标主机的域名和IP(ping会自动将域名转换为IP)。

  2. 不带包头的包大小和带包头的包大小(参考“-s”参数)。

  3. icmp_seqping序列,从1开始;如果数字不是按顺序递增也就意味着丢包了 。

  4. ttl剩余的ttl见下面的TTL解释 。

  5. time: 响应时间,数值越小,连通速度越快。

  6. 发出去的包数,返回的包数,丢包率,耗费时间。

  7. 最小/最大/平均响应时间和本机硬件耗费时间;

TTL:每经过一个‘路由点‘,就把预先设定的这个TTL数值减1,直到最后TTL=1时报文就被扔掉,不向下转发。ping显示的TTL是指:被ping主机那里返回的报文,到了你这里,从它自己预设的TTL减小到还剩下多少。

mdev 往返时延:mdev是 Mean Deviation 的缩写, 表示 ICMP包的RTT(Round-Trip Time,往返时延)偏离平均值的程度, 主要用来衡量网速的稳定性。mdev 的值越大说明 网速越不稳定。另外,不同的操作系统的mdev的名字也有所不同, 在mac下它叫作 stddev, 而在 Windows 下则根本没有这个统计指标。

RTT参考值:

场景参考值
本机0.001ms
同机房0.1ms
同城1ms
不同城20ms
中国北方到南方50ms
国内到国外200ms

范例:

  1. 指定ping的次数: -c 次数。

    ping -c 4 www.baidu.com
  2. 只显示结果:-q。

    fly@ubuntu:~$ ping -c 4 www.baidu.com -q

    PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.

    --- www.a.shifen.com ping statistics ---

    4 packets transmitted, 4 received, 0% packet loss, time 3008ms

    rtt min/avg/max/mdev = 20.471/21.141/21.678/0.444 ms
  3. 制定ping数据包的大小:默认ping命令的数据包大小是64 Bytes,通过-s选项可以制定数据包的大小。范围:1 Byte 到 65507 Byte。

    root@ubuntu:/home/fly$ ping  -s 254 127.0.0.1
    PING 127.0.0.1 (127.0.0.1) 254(282) bytes of data.
    262 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.054 ms
    262 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.056 ms
    262 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.026 ms
    262 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.042 ms
    262 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.025 ms

    补充:如果以最大值去 ping 服务器,并且以多进程多终端的方式,可能会造成服务器响应迟缓,可以认为是一种网络攻击手段。

  4. TTL 生成时间:TTL(Time to Live) 即生存时间,指的是数据包被路由器丢弃之前允许通过的路由器的跳数,为了防止数据包在路由器之间无限转发,必须设置一个TTL值,每次路由器转发后都会将这个值减1,直到TTL的值为0,这个数据包的生命就被终结了。例如:

    ping -t 255 www.baidu.com

若不指定ttl的值,系统会默认给定一个值,不同的操作系统有不同的默认TTL值:

操作系统TCP传输UDP传输
AIX6030
DEC Patchworks V530 30
FreeBSD 2.16464
HP/UX 9.0x3030
HP/UX 10.016464
Irix 5.36060
Irix 6.x6060
UNIX255255
Linux6464
MacOS/MacTCP 2.0.x6060
OS/2 TCP/IP 3.06464
OSF/1 V3.2A6030
Solaris 2.x255255
SunOS 4.1.3/4.1.46060
Ultrix V4.1/V4.2A6030
VMS/Multinet6464
VMS/TCPware6064
VMS/Wollongong 1.1.1.112830
VMS/UCX (latest rel.)128128
MS Windows 95/98/NT 3.513232
Windows NT 4.0/2000/XP/2003128128

补充:通过TTL设定值我们可以找到某主机到某主机的最小跳跃次数,即路由转发次数,如下,可以看到我的主机到百度的最小跳至少是11,因为ttl为10是显示跳跃超限,说明数据包在传给百度服务器的路上已经死了。

root@ubuntu:/home/fly$ ping -t 11 www.baidu.com
PING www.a.shifen.com (14.215.177.38) 56(84) bytes of data.
^C 按Ctrl +C 退出ping
--- www.a.shifen.com ping statistics ---
79 packets transmitted, 0 received, 100% packet loss, time 79045ms

3.2、mtr 连通性测试

mtr命令是Linux系统中的网络连通性测试工具,也可以用来检测丢包率。它通过周期性地发送数据包并测量每个路由跳跃的延迟和丢包率来实现这一点。

这个命令平常使用比较少,主要是做音视频开发的使用比较多,适合在流媒体做区间服务器的选择。也可以检测链路经过情况。

使用方式:

mtr [选项] <目标主机>

常用选项

  • -r:报告模式。指定报告的详细信息级别。

  • -c <次数>发送数据包的次数。默认值为 10。

  • -i <间隔>发送数据包之间的间隔(以秒为单位)。默认值为 1。

  • -p <端口>指定要使用的端口。默认值为 33434。

  • -v启用详细输出。

用途:云服务器选点、声网做音视频通话节点选取测试。

范例:

mtr  baidu.com

输出说明:

  • Host:跳跃点的主机名或 IP 地址。

  • Loss%丢包率,可以用来判断网络中两台机器的连通质量。

模拟丢包:
sudo tc qdisc add dev eth0 root netem loss 10%
04

其他常用的网络相关命令

4.1、telnet

telnet是TCP/IP协议族的一员,是网络远程登录服务的标准协议,帮助用户在本地计算机上连接远程主机。

语法

telnet [选项] <主机名或 IP 地址> [端口号]

常用选项

  • -l <用户名>:指定要用于登录远程计算机的用户名。

  • -p <端口号>指定要连接的端口号。默认端口号为 23。

  • -a尝试使用 Kerberos 身份验证。

  • -e <转义字符>指定要用于转义 Telnet 命令的转义字符。默认转义字符为 Control+Shift+]。

  • -r启用 remote echo。这会导致远程计算机上的输入和输出在本地计算机上回显。

要退出 Telnet 会话,键入 “quit” 命令或按 Control+Shift+] 并输入 “q”。

由于 Telnet 使用明文传输数据,因此不建议在不安全的网络上使用 Telnet。对于安全连接,建议使用 SSH 协议。

telnet 和 SSH 的区别:

  • 端口区别:telnet是23,ssh是22。

  • 本质:telnet是明码传输,ssh是加密传输。

4.2、nc (新手必备)

用的最多的是去验证服务器端口有没有开放nc是NetCat的简称,在网络调试工具中享有“瑞士军刀”的美誉,此命令功能丰富、短小精悍、简单实用,被设计成一款易用的网络工具,可通过TCP/LJDP传输数据。

常用参数:

参数描述
-l用于指定 nc 将处于侦听模式。指定该参数,则意味着 nc 被当作 server,侦听并接受连接,而非向其他地址发起连接。
-p暂未用到(老版本的 nc 可能需要在端口号前加 -p 参数,下面测试环境是 centos6.6,nc 版本是 nc-1.84,未用到 -p 参数)
-s指定发送数据的源 IP 地址,适用于多网卡机
-u指定 nc 使用 UDP 协议,默认为 TCP
-v输出交互或出错信息,新手调试时尤为有用
-w超时秒数,后面跟数字

常用示例:

nc -l 9999             # 开启一个本地9999的TCP协议端口,由客户端主动发起连接,一旦连接必须由服务端发起关闭

nc -vw 2 129.204.197.215 11111 # 通过nc去访问129.204.197.215主机的11111端口,确认是否存活;可不加参数

nc -ul 9999 # 开启一个本地9999的UDP协议端口,客户端不需要由服务端主动发起关闭

nc 129.204.197.215 9999 < test # 通过129.204.197.215的9999TCP端口发送数据文件

nc -l 9999 > test.file # 开启一个本地9999的TCP端口,用来接收文件内容

用 nc 来测试网速:

  1. A机器操作如下:

    nc -l 9999 > /dev/null
  2. B机器开启数据传输

    nc 129.204.197.215 9999 </dev/zero
  3. A机器进行网络监控:

    sar -n DEV 2 100000

在不熟悉公司的防火墙设置时,也可以通过监听端口来确定指定的端口是否被封。

4.3、nslookup

这是一款检测网络中DNS服务器能否正确解析域名的工具命令,并且可以输出。

使用方式:

nslookup [选项] <域名或 IP 地址> [DNS 服务器]

常用选项

  • -type <类型>:指定要查询的 DNS 记录类型。默认类型为 A(地址记录)。

  • -d启用调试模式。

  • -q以简洁的格式显示结果。

  • -mx查询邮件交换记录。

  • -ns查询名称服务器记录。

示例:
[root@ubuntu ~]$ nslookup sina.com
Server: 183.60.83.19
Address: 183.60.83.19#53
Non-authoritative answer:
Name: sina.com
Address: 66.102.251.33

从输出中可以看到,sina.com域名被正确解析到IP地址66.102.251.33

4.4、traceroute

traceroute可以提供从用户的主机到互联网另一端的主机的路径,虽然每次数据包由同一出发点到达同一目的地的路径可能会不一样,但通常来说大多数情况下路径是相同的。

语法

traceroute [选项] <目标主机>

常用选项

  • -n:使用数字地址而不是主机名。

  • -q <次数>发送数据包的次数。默认值为 3。

  • -w <超时>等待每个数据包响应的超时时间(以秒为单位)。默认值为 5。

  • -p <端口>指定要使用的端口。默认值为 33434。

  • -v启用详细输出。

示例:
[root@ubuntu ~]$ traceroute sina.com

traceroute to sina.com (66.102.251.33), 30 hops max, 60 byte packets
1 100.119.162.130 (100.119.162.130) 1.462 ms 2.200 ms 3.004 ms
2 100.119.170.58 (100.119.170.58) 1.060 ms 1.457 ms 1.852 ms
3 10.200.135.213 (10.200.135.213) 0.596 ms 0.794 ms 10.200.135.197 (10.200.135.197) 0.678 ms
4 14.18.199.78 (14.18.199.78) 1.008 ms 14.18.199.58 (14.18.199.58) 0.986 ms 0.951 ms
5 * * *
6 113.96.6.42 (113.96.6.42) 7.938 ms 121.14.50.25 (121.14.50.25) 2.913 ms 113.96.6.18 (113.96.6.18) 7.852 ms
7 113.96.4.157 (113.96.4.157) 4.799 ms 113.96.0.114 (113.96.0.114) 9.306 ms 113.96.4.157 (113.96.4.157) 4.547 ms
8 202.97.67.46 (202.97.67.46) 1.633 ms 2.392 ms 202.97.94.138 (202.97.94.138) 24.012 ms
9 202.97.94.77 (202.97.94.77) 4.379 ms 202.97.94.102 (202.97.94.102) 11.375 ms 11.335 ms
10 202.97.51.134 (202.97.51.134) 160.060 ms 160.058 ms 160.048 ms
11 203.14.186.238 (203.14.186.238) 181.185 ms 181.146 ms 181.088 ms
12 218.30.41.245 (218.30.41.245) 157.970 ms 157.110 ms 157.156 ms
13 218.30.41.234 (218.30.41.234) 156.973 ms 159.204 ms 157.517 ms
14 66.102.251.33 (66.102.251.33) 157.370 ms * 168.266 ms

在输出中记录按序列号从1开始,每个记录代表网络一跳,每跳一次表示经过一个网关或者路由;我们看到每行有三个个时间,单位是毫秒,指的是这一跳需要的时间。

4.5、iptraf 强大的网络监控

iptraf是一个实时监控网络流量的交互式的彩色文本屏幕界面。它监控的数据比较全面,可以输出TCP连接、网络接口、协议、端口、网络包大小等信息,但是耗费的系统资源比较多,且需要管理员权限。

iptraf相对来说比较复杂,不然sar那么简单。

使用方式:

sudo iptraf

在进入主界面之前可以选择不同的选项,在不同的选项下可以查看不同维度的网络信息。

安装方法:

# centos
yum -y install ncurses
yum -y install iptraf

# ubuntu
sudo apt-get install iptraf

4.6、tcpdump

tcpdump是网络状况分析和跟踪工具,是可以用来抓包的实用命令,使用前需要对TCP/IP有所熟悉,因为过滤使用的信息都是TCP/IP格式。

Ubuntu安装:

sudo apt-get install tcpdump

捕获及停止条件

  • -D 列举所有网卡设备

  • -i 选择网卡设备

  • -c 抓取多少条报文

  • --time-stamp-precision 指定捕获时的时间精度,默认微妙micro,可选纳秒nano

  • -s 指定每条报文的最大字节数,默认262144字节

tcpdump是一个非常强大的工具,这里先简单介绍它的使用,后面单独整理一篇文章详细介绍它。主要是使用tcpdump抓包,然后通过wareshark工具来分析。

常用示例:

sudo tcpdump -r a -e

sudo tcpdump -r a -q

sudo tcpdump -r a -v

sudo tcpdump -r a -n

sudo tcpdump -r a -S

sudo tcpdump -r a -A

sudo tcpdump -r a -x

sudo tcpdump -r a -xx

sudo tcpdump -r a -X

sudo tcpdump -r a -XX

4.7、nmap

扫描某一主机打开的端口及端口提供的服务信息,通常用于查看本机有哪些端口对外提供服务,或者服务器有哪些端口对外开放。目标可以是单个 IP 地址、主机名、IP 范围或网络。

安装 :

# ubuntu安装
sudo apt install nmap

#centos安装
yum install nmap

常用选项

  • -sT:使用 TCP SYN 扫描(快速且隐蔽)。

  • -sU使用 UDP 扫描(适用于某些服务)。

  • -sS使用 TCP SYN stealth 扫描(更隐蔽)。

  • -p <端口>指定要扫描的端口。

  • -Pn不执行 ping 扫描(假设主机已开启)。

  • -v启用详细输出。

注意事项
  • nmap 命令需要 root 权限才能运行。

  • nmap 命令可能会被防火墙或网络设备阻止。

  • nmap 命令可以对目标网络产生影响,因此请谨慎使用。

云服务器示例:
$ nmap -v -A localhost

Initiating SYN Stealth Scan at 16:12
Scanning localhost (127.0.0.1) [1000 ports]
Discovered open port 22/tcp on 127.0.0.1
Discovered open port 80/tcp on 127.0.0.1
Discovered open port 3306/tcp on 127.0.0.1
Discovered open port 554/tcp on 127.0.0.1
Discovered open port 10009/tcp on 127.0.0.1
Discovered open port 10000/tcp on 127.0.0.1
Discovered open port 10004/tcp on 127.0.0.1
Discovered open port 1935/tcp on 127.0.0.1
Discovered open port 9000/tcp on 127.0.0.1
Discovered open port 10003/tcp on 127.0.0.1
Discovered open port 10001/tcp on 127.0.0.1

但实际能否进行连通还要看防火墙的设置。

常见示例:

nmap localhost  #查看主机当前开放的端口

nmap -p 1024-65535 localhost #查看主机端口(1024-65535)中开放的端口

nmap -PS 192.168.56.101 #探测目标主机开放的端口

nmap -PS 22,80,3306 192.168.56.101 #探测所列出的目标主机端口

nmap -O 192.168.56.101 #探测目标主机操作系统类型

nmap -A 192.168.56.101 #探测目标主机操作系统类型

4.8、lsof

lsof是系统管理/安全的尤伯工具。将这个工具称之为lsof真实名副其实,因为它是指“列出打开文件(lists openfiles)”。而有一点要切记,在Unix中一切(包括网络套接口)都是文件。

查看帮助文档:

 lsof -h

你可以使用它来获得你系统上设备的信息,你能通过它了解到指定的用户在指定的地点正在碰什么东西,或者甚至是一个进程正在使用什么文件或网络连接。具体可以使用man lsof查看帮助文档。

关键选项:

选项描述
-a结果进行“与”运算(而不是“或”)
-l在输出显示用户ID而不是用户名
-h获得帮助
-t仅获取进程ID
-U获取UNIX套接口地址
-F格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)

默认 : 没有选项,lsof列出活跃进程的所有打开文件

组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数。

范例:

  1. 显示端口被某个程序占用:lsof -i:port。

    [root@VM_0_ubuntu msg_server]# lsof -i:80
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    nginx 24614 root 10u IPv4 67976659 0t0 TCP *:http (LISTEN)
    nginx 24615 root 10u IPv4 67976659 0t0 TCP *:http (LISTEN)

    [root@VM_0_ubuntu msg_server]# lsof -i:8000
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    msg_serve 17967 root 5u IPv4 18955252 0t0 TCP *:irdmi (LISTEN)
  2. 看进程号为12的进程打开了哪些文件:

    lsof -p 12 
  3. lsof -c abc 显示abc进程现在打开的文件,可以使用less进行分页,b 向后翻一页,d 向后翻半页。

    [root@VM_0_ubuntu msg_server]$ lsof -c msg_server

    # 显示的部分内容
    msg_serve 17967 root 3w REG 253,1 7005733 525212 /root/im/0voice_im/auto_setup/im_server/im-server-1/msg_server/log/default.log
    msg_serve 17967 root 4w REG 253,1 0 564603 /root/im/0voice_im/auto_setup/im_server/im-server-1/msg_server/log/TEST.log
    msg_serve 17967 root 5u IPv4 18955252 0t0 TCP *:irdmi (LISTEN)
  4. lsof abc.txt 显示打开文件abc.txt的进程:

    [root@VM_0_ubuntu msg_server]$ lsof log/default.log
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    msg_serve 17967 root 3w REG 253,1 7016015 525212 log/default.log
    tail 21816 root 3r REG 253,1 7016015 525212 log/default.log

4.9、ethtool

ethtool用于查看网卡的配置情况。

安装:

sudo apt install ethtool

命令使用格式:

ethtool [option] interface

示例,查看网卡:

ethtool ens33  # PS在云主机检测不到网卡信息

范例:

(1)查看网卡的接口信息

ethtool eth1 #查看网络接口eth1的信息

(2)关闭网卡eth1的自动协商

ethtool -s eth1 autoneg off

(3)修改网卡速率为 100Mb/s

ethtool -s eth4 speed 100

(4)查看网卡驱动信息

ethtool -i eth0

(5)查看网卡的一些工作统计信息

ethtool –S eth0

(6)停止和查看网卡的发送模块TX的状态

ethtool -A tx off eth0 #修改tx的状态

ethtool -a eth0 #查看tx的状态

(7)关闭网卡对收到的数据包的校验功能

ethtool -K rx off eth0 #关闭校验

ethtool –k eth0 #查看校验启动状态
05

netstat的其他用途

此命令显示网络连接、端口信息等。

根据进程查找端口:

  1. 根据进程名查找进程ID:ps -elf | grep 进程。

    [root@ubuntu ~]$ ps -elf | grep nginx
    0 S root 6875 2674 0 80 0 - 28178 pipe_w 11:02 pts/3 00:00:00 grep --color=auto nginx
    1 S root 24614 1 0 80 0 - 8524 sigsus Jul27 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
    5 S root 24615 24614 0 80 0 - 14563 ep_pol Jul27 ? 00:00:13 nginx: worker process
  2. 根据进程ID查找进程开启的端口:

    [root@VM_0_ubuntu ~]$ netstat -nap | grep 24614
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 24614/nginx: master
    tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 24614/nginx: master
    tcp 0 0 0.0.0.0:8088 0.0.0.0:* LISTEN 24614/nginx: master
    tcp 0 0 0.0.0.0:9080 0.0.0.0:* LISTEN 24614/nginx: master
    tcp 0 0 0.0.0.0:444 0.0.0.0:* LISTEN 24614/nginx: master
    tcp 0 0 0.0.0.0:10080 0.0.0.0:* LISTEN 24614/nginx: master
    unix 3 [ ] STREAM CONNECTED 67976664 24614/nginx: master
    unix 3 [ ] STREAM CONNECTED 67976665 24614/nginx: master

根据端口查找进程:

  1. 根据使用端口

    [root@ubuntu ~]# netstat -nap | grep 8080
    tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 25901/./login_serve
  2. 根据进程ID查找进程的详细信息

    [root@ubuntu ~]# ps -elf | grep 25901
    0 R root 7646 2674 0 80 0 - 28178 - 11:06 pts/3 00:00:00 grep --color=auto 25901
    0 S root 25901 1 0 80 0 - 42506 ep_pol Jul20 ? 00:10:33 ./login_server
06

总结

本文介绍了常用的网络性能监控指标,包括带宽、吞吐量、延迟、PPS、可用性、并发连接数、丢包率和重传率等。文章详细讲解了Linux系统中用于查看网络配置、套接字信息、协议栈统计信息和网络吞吐情况的命令,例如ifconfig、ip、netstat、ss、sar、ping、mtr、telnet、nc、nslookup、traceroute、iptraf、tcpdump、nmap、lsof、ethtool等。此外,介绍了使用netstat命令查找进程和端口的方法。

公众号: Lion 莱恩呀

微信号: 关注获取

扫码关注 了解更多内容

点个 在看 你最好看


Lion 莱恩呀
专注分享高性能服务器后台开发技术知识,涵盖多个领域,包括C/C++、Linux、网络协议、设计模式、中间件、云原生、数据库、分布式架构等。目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。
 最新文章