Linux网络性能常用工具指标

性能指标:
带宽 ,表示链路的最大传输速率,单位通常为 b/s (比特 / 秒)。
吞吐量 ,表示单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽限制,而吞吐量 / 带宽,也就是该网络的使用率。
延时 ,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景中,这一指标可能会有不同含义。比如,它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)。
PPS ,是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力,比如硬件交换机,通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影响。
网络的可用性(网络能否正常通信) 、可用性是指网络在特定时间内保持正常运行的能力,即网络能够提供服务而不遭受不可预测的中断。
并发连接数(TCP 连接数量) 、并发连接数指同时存在于网络中的活动连接数量,通常与TCP(传输控制协议)连接相关。
丢包率(丢包百分比) 、丢包率是指在数据传输过程中丢失的数据包的百分比。丢包可能由网络拥塞、错误的路由、设备故障等原因引起。
重传率(重新传输的网络包比例)、重传率是指由于数据包未能正常到达目的地而需要重新传输的数据包的比例。

1.ifconfig和ip

显示网络接口收发数据包的统计信息。

bash 复制代码
root@node02:~# ifconfig ens33 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.91.152  netmask 255.255.255.0  broadcast 192.168.91.255
        inet6 fe80::20c:29ff:fe3b:1de3  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:3b:1d:e3  txqueuelen 1000  (Ethernet)
        RX packets 47472  bytes 8314819 (8.3 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 65623  bytes 38703021 (38.7 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# -s: 这个选项表示"statistics"(统计),它告诉命令显示有关网络接口的统计信息。
# addr: 这是"address"的缩写,表示要显示有关网络接口地址的信息。
# show: 这个选项指示命令显示指定网络接口的详细信息。
# dev ens33: 这部分指定要显示信息的网络接口,其中 ens33 是网络接口的名称。
root@node02:~# ip -s addr show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:3b:1d:e3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.152/24 brd 192.168.91.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe3b:1de3/64 scope link 
       valid_lft forever preferred_lft forever
    RX: bytes  packets  errors  dropped overrun mcast   
    8317859    47508    0       0       0       0       
    TX: bytes  packets  errors  dropped carrier collsns 
    38705795   65644    0       0       0       0   

跟网络性能的性能指标:

第一,网络接口的状态标志。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.netstat

查看套接字、网络栈、网络接口以及路由表的信息。

bash 复制代码
root@node02:~# netstat -anpl | head -3 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      2296/docker-proxy   

指标解释:

Proto:

表示协议类型,可以是 tcp(TCP协议)或 udp(UDP协议)等。

Recv-Q:

表示接收队列的大小,即等待应用程序接收的数据包数量。如果这个值不为零,表示接收缓冲区中有等待处理的数据。

Send-Q:

表示发送队列的大小,即等待发送的数据包数量。如果这个值不为零,表示发送缓冲区中有等待传输的数据。

Local Address:

表示本地地址和端口号。对于TCP连接,这是本地主机的IP地址和端口号;对于UDP连接,这是本地主机的IP地址和端口号。

Foreign Address:

表示远程地址和端口号。对于TCP连接,这是远程主机的IP地址和端口号;对于UDP连接,这是远程主机的IP地址和端口号。

State:

表示连接的当前状态。对于TCP连接,这可以是 ESTABLISHED(已建立)、CLOSE_WAIT(等待关闭)等;对于UDP连接,此列通常为空。

PID/Program name:

表示与连接关联的进程的进程ID(PID)和程序名称。这列的内容提供了与网络连接相关联的进程信息。在一些情况下,这列可能显示为 -,表示没有关联的进程信息。

其中,接收队列(Recv-Q)和发送队列(Send-Q)需要你特别关注,它们通常应该是 0。当你发现它们不是 0 时,说明有网络包的堆积发生。当然还要注意,在不同套接字状态下,它们的含义不同。

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

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

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

当套接字处于监听状态(Listening)时,

Recv-Q 表示全连接队列的长度。

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

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

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

常用参数:

-a, --all:显示所有连接,包括侦听和非侦听连接。

-t, --tcp:显示TCP协议相关的连接。

-u, --udp:显示UDP协议相关的连接。

-n, --numeric:以数字形式显示地址和端口号,而不解析为域名和服务名。

-p, --program:显示每个连接的进程信息(需要具有足够权限)。

-c, --continuous:持续输出,实时显示网络状态的变化。

-r, --route:显示路由表信息。

-s, --statistics:显示网络统计信息,如传输的数据包数、错误数等。

-l, --listening:显示仅处于侦听状态的连接。

-p, --protocol [protocol]:仅显示指定协议的连接,如 -p tcp 或 -p udp。

-e, --extend:显示更详细的信息,包括用户和进程信息。

-W, --wide:显示宽格式,适用于显示更多的信息。

3.ss

查看套接字、网络栈、网络接口以及路由表的信息。

bash 复制代码
root@node02:~# ss -tnlp | head -n 3 
State    Recv-Q    Send-Q        Local Address:Port        Peer Address:Port                                                                                    
LISTEN   0         128                 0.0.0.0:9100             0.0.0.0:*        users:(("docker-proxy",pid=2296,fd=4))                                         
LISTEN   0         128           127.0.0.53%lo:53               0.0.0.0:*        users:(("systemd-resolve",pid=918,fd=13))  

指标解释:

netstat 和 ss 的输出也是类似的,都展示了套接字的状态、接收队列、发送队列、本地地址、远端地址、进程 PID 和进程名称等。可以参考netstat。

常用参数:

-t, --tcp:仅显示TCP协议相关的连接。

-u, --udp:仅显示UDP协议相关的连接。

-a, --all:显示所有连接,包括侦听和非侦听连接。

-l, --listening:仅显示处于侦听状态的连接。

-p, --processes:显示与每个连接相关的进程信息,包括进程ID和程序名称。

-n, --numeric:以数字形式显示地址和端口号,而不解析为域名和服务名。

-r, --resolve:尝试解析数值为主机名。

-e, --extended:显示更详细的信息,包括内核套接字信息。

-o, --options:显示附加的信息,如TCP连接的 TCP_INFO 选项。

-s, --summary:显示套接字统计摘要,包括总连接数、侦听端口数等。

-4, --ipv4:仅显示IPv4地址的连接。

-6, --ipv6:仅显示IPv6地址的连接。

-t4, --tcp4:仅显示IPv4地址的TCP连接。

-t6, --tcp6:仅显示IPv6地址的TCP连接。

4.sar

查看系统当前的网络吞吐量和 PPS。

bash 复制代码
root@node02:~# sar -n DEV 1 
Linux 4.15.0-213-generic (node02) 	02/04/2024 	_x86_64_	(2 CPU)

11:02:21 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
11:02:22 AM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:02:22 AM     ens33      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:02:22 AM vethefb6de4      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:02:22 AM vethc50f9b4      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:02:22 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:02:22 AM veth4aa95d8      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:02:22 AM vethd4da19a      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

指标解释:

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

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

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

常用参数:

-u, --cpu:显示CPU使用情况的统计信息,包括用户态、系统态和空闲时间。

-r, --memory:显示内存使用情况的统计信息,包括空闲内存、缓存、缓冲区等。

-b, --io:显示块设备I/O活动的统计信息,包括读写速率、等待时间等。

-n, --network:显示网络活动的统计信息,包括网络接口的数据传输速率、错误等。

-q, --queue:显示队列长度和负载平均值的统计信息。

-d, --disk:显示磁盘活动的统计信息,包括磁盘读写速率、I/O等。

-A, --all:显示所有可用的报告。

-f, --file [filename]:从指定的文件中读取 sar 报告。

-s [hh:mm:ss], --start [hh:mm:ss]:指定开始时间,只显示从指定时间开始的报告。

-e [hh:mm:ss], --end [hh:mm:ss]:指定结束时间,只显示在指定时间之前的报告。

-p, --interval [seconds]:设置采样间隔,即多长时间收集一次数据。

-y, --activity:显示系统活动的摘要,包括用户活动、终端活动等。

5.ethtool

bash 复制代码
root@node02:~# ethtool ens33
Settings for ens33:
	Supported ports: [ TP ]
	Supported link modes:   10baseT/Half 10baseT/Full 
	                        100baseT/Half 100baseT/Full 
	                        1000baseT/Full 
	Supported pause frame use: No
	Supports auto-negotiation: Yes
	Supported FEC modes: Not reported
	Advertised link modes:  10baseT/Half 10baseT/Full 
	                        100baseT/Half 100baseT/Full 
	                        1000baseT/Full 
	Advertised pause frame use: No
	Advertised auto-negotiation: Yes
	Advertised FEC modes: Not reported
	Speed: 1000Mb/s
	Duplex: Full
	Port: Twisted Pair
	PHYAD: 0
	Transceiver: internal
	Auto-negotiation: on
	MDI-X: off (auto)
	Supports Wake-on: d
	Wake-on: d
	Current message level: 0x00000007 (7)
			       drv probe link
	Link detected: yes

指标解释:

Supported ports: [ TP ]:支持的端口类型是 Twisted Pair(双绞线)。

Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full:支持的连接模式包括 10Mbps 半双工、10Mbps 全双工、100Mbps 半双工、100Mbps 全双工、1000Mbps 全双工。

Supported pause frame use: No:不支持暂停帧的使用。

Supports auto-negotiation: Yes:支持自动协商。

Supported FEC modes: Not reported:不支持报告前向纠错(FEC)模式。

Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full:广告的连接模式与支持的相同,包括 10Mbps 半双工、10Mbps 全双工、100Mbps 半双工、100Mbps 全双工、1000Mbps 全双工。

Advertised pause frame use: No:不广告暂停帧的使用。

Advertised auto-negotiation: Yes:广告支持自动协商。

Advertised FEC modes: Not reported:不广告前向纠错(FEC)模式。
Speed: 1000Mb/s:当前连接速度为 1000Mbps。
Duplex: Full:当前工作模式为全双工。

Port: Twisted Pair:端口类型是双绞线。

PHYAD: 0:物理层(PHY)地址为 0。

Transceiver: internal:放置在适配器内部的收发器。

Auto-negotiation: on:自动协商功能开启。

MDI-X: off (auto):自动 MDI-X 功能关闭(auto 表示自动检测)。

Supports Wake-on: d:支持唤醒功能,字母 'd' 可能指示对于唤醒的支持。

Wake-on: d:当前的唤醒设置。

Current message level: 0x00000007 (7) drv probe link:当前消息级别,显示驱动、探测和连接方面的信息。

Link detected: yes:检测到链路,表示网络连接是活动的。

常用参数:

-a, --show-pause:显示流控配置。

-A, --adaptive-rx:启用或禁用自适应接收中断节流。

-c, --show-coalesce:显示协同处理设置,包括收发包的协同处理。

-g, --show-ring:显示环的大小。

-i, --identify:启动适配器身份识别。

-k, --show-offload:显示接口卸载的功能,如校验和、大分帧卸载等。

-n, --show-nfc:显示网络流分类。

-p, --phy-status:显示物理层(PHY)状态。

-t, --show-test:显示适配器的自检测试。

-S, --statistics:显示适配器的统计信息,包括错误计数、丢包计数等。

-s, --speed:显示接口的连接速度。

-r, --show-regs:显示寄存器的内容。

-u, --show-udp-encap:显示UDP封装配置。

-w, --phy-tunable [name]:显示或更改指定的PHY可调参数。

-W, --change-wol:更改唤醒LAN(Wake-on-LAN)设置。

6.ping

bash 复制代码
root@node02:~# ping -c3 114.114.114.114
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=1 ttl=128 time=36.8 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=128 time=33.1 ms
64 bytes from 114.114.114.114: icmp_seq=3 ttl=128 time=24.6 ms

--- 114.114.114.114 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 24.660/31.564/36.892/5.120 ms

指标解释:

第一部分,是每个 ICMP 请求的信息,包括 ICMP 序列号(icmp_seq)、TTL(生存时间,或者跳数)以及往返延时。 第二部分,则是三次 ICMP 请求的汇总。

常用参数:

-c [count], --count [count]:指定发送的数据包数量。例如,ping -c 4 表示发送4个数据包。

-i [interval], --interval [interval]:设置发送数据包之间的时间间隔(秒)。默认是1秒。

-s [size], --size [size]:设置数据包的大小(字节)。默认情况下,数据包大小为56字节(包括8字节的 ICMP 头)。

-t [ttl], --ttl [ttl]:设置数据包的生存时间(Time To Live),即数据包在网络中允许传输的最大跳数。

-W [timeout], --timeout [timeout]:设置超时时间,即等待响应的最大时间(秒)。

-r:忽略默认的源路由,直接使用目标主机。

-n:不进行域名解析,直接显示IP地址。

7.traceroute

bash 复制代码
root@node02:~# traceroute www.baidu.com
traceroute to www.baidu.com (110.242.68.3), 30 hops max, 60 byte packets
 1  _gateway (192.168.91.2)  0.169 ms  0.135 ms  0.115 ms
 2  * * *
 ......

解释:

目标主机信息:traceroute 指定了目标主机为 www.baidu.com,对应的 IP 地址是 110.242.68.3。

最大跃点数:输出中指定了最大跃点数为 30,表示 traceroute 将尝试跟踪数据包经过的最多跃点数。

数据包大小:每个数据包的大小为 60 字节。

跃点信息:每一行表示一个跃点,其中包含了跃点的序号、跃点的 IP 地址或主机名称,以及往返时间(RTT)。

第一个跃点:第一个跃点显示了本地路由器或网关的信息。在这个例子中,本地路由器的 IP 地址为 192.168.91.2。

星号(*):在第二个跃点及之后的跃点中,出现了一系列星号 (* * *),表示在尝试到达下一个跃点时发生了超时或数据包丢失。
常用参数:

-n:使用数字格式显示 IP 地址,而不是进行反向 DNS 查询。

-w [timeout]:设置超时时间,即等待每个回复的最大时间(单位为毫秒)。

-m [max-hops]:设置最大跳数(最大 TTL 值),即数据包的最大生存时间。

-q [nqueries]:设置每个跳点的查询次数(即发送的数据包数量)。

-p [port]:设置目标端口号,默认为 UDP 的端口号33434。

-T:使用 TCP 协议而不是默认的 UDP。

-I:使用 ICMP 协议而不是默认的 UDP。

-l:输出每跳的 IP 地址和主机名称。

-r:不进行反向 DNS 查询,直接显示 IP 地址。

8.nslookup

bash 复制代码
root@node02:~# time nslookup www.baidu.com
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
www.baidu.com	canonical name = www.a.shifen.com.
Name:	www.a.shifen.com
Address: 110.242.68.4
Name:	www.a.shifen.com
Address: 110.242.68.3
Name:	www.a.shifen.com
Address: 2408:871a:2100:3:0:ff:b025:348d
Name:	www.a.shifen.com
Address: 2408:871a:2100:2:0:ff:b09f:237


real	0m0.691s
user	0m0.004s
sys	0m0.008s

结果分析:

该查询使用的 DNS 服务器是 127.0.0.53,这是默认的 systemd-resolved DNS 缓存服务器。

查询结果显示了 www.baidu.com 的规范名称为 www.a.shifen.com

非权威回答(Non-authoritative answer)意味着 DNS 服务器不是权威的 www.baidu.com 的服务器,而是从其他服务器获取的缓存结果。

查询结果显示了 www.a.shifen.com 的多个 IP 地址:

IPv4 地址:110.242.68.4 和 110.242.68.3。

IPv6 地址:2408:871a:2100:3:0:ff:b025:348d 和 2408:871a:2100:2:0:ff:b09f:237。

根据查询结果,www.baidu.com 实际上被解析为 www.a.shifen.com,并且它有多个 IPv4 和 IPv6 地址。

关于时间统计(real、user、sys):

real:实际经过的时间,包括程序运行的总时间。

user:CPU 执行用户态程序的时间。

sys:CPU 执行内核态程序的时间。

在这个示例中,总时间(real)是 0.691 秒,其中用户态程序的 CPU 执行时间(user)是 0.004 秒,内核态程序的 CPU 执行时间(sys)是 0.008 秒。

常用参数:

[hostname]:要查询的域名或主机名。如果不提供此参数,则进入交互模式。

-query=[type]:指定查询类型,例如 A 表示查询主机的 IPv4 地址,AAAA 表示查询主机的 IPv6 地址,MX 表示查询邮件交换记录等。

-type=[type]:与 -query 参数相同,指定查询的类型。

-timeout=[seconds]:设置查询超时时间,即等待响应的最大时间(单位为秒)。

-retry=[attempts]:设置查询重试次数,即在超时后重新发送查询的次数。

-port=[port]:指定用于查询的 DNS 服务器的端口号。

-server=[server]:指定用于查询的 DNS 服务器的 IP 地址或主机名。

-debug:显示调试信息,用于诊断 DNS 查询问题。

-version:显示 nslookup 命令的版本信息。

-help:显示 nslookup 命令的帮助信息。
9.tcpdump

tcpdump结果输出格式:

bash 复制代码
时间戳 协议 源地址.源端口 > 目的地址.目的端口 网络包详细信息
bash 复制代码
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:02:31.100564 IP 172.16.3.4.56669 > 114.114.114.114.53: 36909+ A? geektime.org. (30)
14:02:31.507699 IP 114.114.114.114.53 > 172.16.3.4.56669: 36909 1/0/0 A 35.190.27.188 (46)
14:02:31.508164 IP 172.16.3.4 > 35.190.27.188: ICMP echo request, id 4356, seq 1, length 64
14:02:31.539667 IP 35.190.27.188 > 172.16.3.4: ICMP echo reply, id 4356, seq 1, length 64
14:02:31.539995 IP 172.16.3.4.60254 > 114.114.114.114.53: 49932+ PTR? 188.27.190.35.in-addr.arpa. (44)
14:02:36.545104 IP 172.16.3.4.60254 > 114.114.114.114.53: 49932+ PTR? 188.27.190.35.in-addr.arpa. (44)
14:02:41.551284 IP 172.16.3.4 > 35.190.27.188: ICMP echo request, id 4356, seq 2, length 64
14:02:41.582363 IP 35.190.27.188 > 172.16.3.4: ICMP echo reply, id 4356, seq 2, length 64
14:02:42.552506 IP 172.16.3.4 > 35.190.27.188: ICMP echo request, id 4356, seq 3, length 64
14:02:42.583646 IP 35.190.27.188 > 172.16.3.4: ICMP echo reply, id 4356, seq 3, length 64

这次输出中,前两行,表示 tcpdump 的选项以及接口的基本信息;从第三行开始,就是抓取到的网络包的输出。这些输出的格式,都是 时间戳 协议 源地址.源端口 > 目的地址.目的端口 网络包详细信息(这是最基本的格式,可以通过选项增加其他字段)。 前面的字段,都比较好理解。但网络包的详细信息,本身根据协议的不同而不同。所以,要理解这些网络包的详细含义,就要对常用网络协议的基本格式以及交互原理,有基本的了解。 当然,实际上,这些内容都会记录在 IETF( 互联网工程任务组)发布的 RFC(请求意见稿)中。 比如,第一条就表示,从本地 IP 发送到 114.114.114.114 的 A 记录查询请求,它的报文格式记录在 RFC1035 中,你可以点击这里查看。在这个 tcpdump 的输出中, 36909+ 表示查询标识值,它也会出现在响应中,加号表示启用递归查询。 A? 表示查询 A 记录。 geektime.org. 表示待查询的域名。 30 表示报文长度。 接下来的一条,则是从 114.114.114.114 发送回来的 DNS 响应------域名 geektime.org. 的 A 记录值为 35.190.27.188。 第三条和第四条,是 ICMP echo request 和 ICMP echo reply,响应包的时间戳 14:02:31.539667,减去请求包的时间戳 14:02:31.508164 ,就可以得到,这次 ICMP 所用时间为 30ms。这看起来并没有问题。 但随后的两条反向地址解析 PTR 请求,就比较可疑了。因为我们只看到了请求包,却没有应答包。仔细观察它们的时间,你会发现,这两条记录都是发出后 5s 才出现下一个网络包,两条 PTR 记录就消耗了 10s。 再往下看,最后的四个包,则是两次正常的 ICMP 请求和响应,根据时间戳计算其延迟,也是 30ms。 到这里,其实我们也就找到了 ping 缓慢的根源,正是两次 PTR 请求没有得到响应而超时导致的。PTR 反向地址解析的目的,是从 IP 地址反查出域名,但事实上,并非所有 IP 地址都会定义 PTR 记录,所以 PTR 查询很可能会失败。 所以,在你使用 ping 时,如果发现结果中的延迟并不大,而 ping 命令本身却很慢,不要慌,有可能是背后的 PTR 在搞鬼。

格式:

bash 复制代码
tcpdump [选项] [过滤表达式]

常用参数:

-i: 指定要监听的网络接口。

bash 复制代码
tcpdump -i eth0

-n: 使用 IP 地址而不是主机名。

bash 复制代码
tcpdump -n

-nn: 不解析主机名和端口号,只显示 IP 地址和端口号。

bash 复制代码
tcpdump -nn

-c: 指定捕获数据包的数量。

bash 复制代码
tcpdump -c 100

-s: 指定要捕获的数据包的大小。

bash 复制代码
tcpdump -s 1500

-A: 以 ASCII 格式显示数据包内容。

bash 复制代码
tcpdump -A

-X: 以十六进制和 ASCII 格式显示数据包内容。

bash 复制代码
tcpdump -X

port: 指定要捕获的数据包的端口号。

bash 复制代码
tcpdump port 80

host: 指定要捕获的数据包的主机 IP。

bash 复制代码
tcpdump host 192.168.1.100

tcp, udp, icmp: 指定要捕获的数据包的协议类型。

bash 复制代码
tcpdump tcp
tcpdump udp
tcpdump icmp

-w: 将捕获的数据包保存到文件中。

bash 复制代码
tcpdump -w capture.pcap

-r: 从保存的文件中读取数据包进行分析。

bash 复制代码
tcpdump -r capture.pcap

逻辑操作符 或(or)和 与非(and not)

或(or)操作符:用于指定多个条件中的任意一个满足时,数据包就会被捕获。

bash 复制代码
tcpdump condition1 or condition2

例如:

bash 复制代码
tcpdump src 192.168.1.100 or dst 192.168.1.100

与非(and not)操作符:用于指定一个条件满足而另一个条件不满足时,数据包才会被捕获。

bash 复制代码
tcpdump condition1 and not condition2

例如,要捕获源地址为 192.168.1.100 且目标地址不是 192.168.1.200 的数据包:

bash 复制代码
tcpdump src 192.168.1.100 and not dst 192.168.1.200

src :指定数据包的源地址。

bash 复制代码
tcpdump src 192.168.1.100

dst :指定数据包的目标地址。

bash 复制代码
tcpdump src 192.168.1.100 and dst port 80

net :指定数据包的源或目标网络。

bash 复制代码
tcpdump src net 192.168.1.0/24

not :排除符合指定条件的数据包。

bash 复制代码
tcpdump src not 192.168.1.100

10.dig 用于查询 DNS(域名系统)记录。

安装

bash 复制代码
sudo apt-get install dnsutils

基本查询

bash 复制代码
dig example.com

指定记录类型:

bash 复制代码
dig A example.com

使用特定的DNS服务器:

使用 @ 符号后跟 DNS 服务器地址来指定使用特定的 DNS 服务器进行查询。

bash 复制代码
dig @8.8.8.8 example.com

显示所有记录:

使用 +all 选项可以显示与查询域名相关的所有记录。

bash 复制代码
dig +all example.com
相关推荐
C-cat.20 分钟前
Linux|环境变量
linux·运维·服务器
yunfanleo34 分钟前
docker run m3e 配置网络,自动重启,GPU等 配置渠道要点
linux·运维·docker
hakesashou41 分钟前
Python中常用的函数介绍
java·网络·python
C++忠实粉丝1 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
九州ip动态1 小时前
做网络推广及游戏注册为什么要换IP
网络·tcp/ip·游戏
Estar.Lee1 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
蝶开三月1 小时前
php:使用socket函数创建WebSocket服务
网络·websocket·网络协议·php·socket
糖豆豆今天也要努力鸭1 小时前
torch.__version__的torch版本和conda list的torch版本不一致
linux·pytorch·python·深度学习·conda·torch
Winston Wood1 小时前
Perfetto学习大全
android·性能优化·perfetto
G丶AEOM1 小时前
SSL/TLS,SSL,TLS分别是什么
网络·网络协议·网络安全