[Linux]Network Troubleshooting

Network TroubleShooting

1 Internet Control Message Protocol (ICMP)

Internet控制消息协议(ICMP)是TCP/IP协议簇的一部分,用于发送更新和错误消息。它是调试网络问题(如数据包传输失败)的极为有用的工具。

每个ICMP消息包含类型、代码和校验和字段。类型字段表示ICMP消息的种类;代码作为子类型,提供有关消息的更多信息;校验和用于检测消息完整性方面的问题。

以下是一些常见的ICMP类型:

  • 类型0:Echo应答
  • 类型3:目标不可达
  • 类型8:Echo请求
  • 类型11:超时

当数据包无法到达目的地时,会生成类型3的ICMP消息。在类型3中,有16个代码值进一步描述为何无法到达目的地:

  • 代码0:网络不可达
  • 代码1:主机不可达

2 Ping工具介绍

Ping是网络诊断中最基本的工具之一,用于测试数据包是否能够到达目标主机。它通过向目标主机发送ICMP Echo请求(类型8)数据包,并等待ICMP Echo应答(类型0)来工作。当主机发出请求数据包并收到目标返回的响应时,Ping操作成功。

以下是一个示例:

1
2
3
4
5
pete@icebox:~$ ping -c 3 www.google.com
PING www.google.com (74.125.239.112) 56(84) bytes of data.
64 bytes from nuq05s01-in-f16.1e100.net (74.125.239.112): icmp_seq=1 ttl=128 time=29.0 ms
64 bytes from nuq05s01-in-f16.1e100.net (74.125.239.112): icmp_seq=2 ttl=128 time=23.7 ms
64 bytes from nuq05s01-in-f16.1e100.net (74.125.239.112): icmp_seq=3 ttl=128 time=15.1 ms

在这个例子中,使用ping命令检查是否能访问www.google.com。`-c`标志(计数)用于在达到指定数量后停止发送Echo请求数据包。

输出的第一部分表示正在向74.125.239.112(google.com)发送64字节的数据包,其余部分显示了这些数据包往返的详细信息。默认情况下,每秒发送一个数据包。

关键字段解释

  • icmp_seq:显示发送的数据包序列号。本例中,共发送了3个数据包,并且所有数据包都已返回。如果Ping过程中发现某些序列号缺失,则表明存在连接问题,不是所有数据包都能顺利通过。若序列号乱序,可能意味着连接速度非常慢,导致数据包超过了默认的一秒间隔。

  • ttl:生存时间(Time To Live),作为跳数计数器。每次经过一跳,该值减一,直至变为零,此时数据包将被丢弃。这确保了数据包不会在网络中无限循环。

  • time:从发送Echo请求到接收Echo应答的往返时间。

通过分析Ping命令的结果,可以有效地评估网络连接的质量和稳定性。

3 Traceroute工具介绍

Traceroute命令用于查看数据包的路由路径。它通过发送具有递增TTL(生存时间)值的数据包来工作,从1开始。第一个路由器接收到数据包时会将TTL值减一,导致数据包被丢弃,并向源主机返回一个ICMP超时消息。然后,下一个数据包的TTL设置为2,这样它就能通过第一个路由器,但到达第二个路由器时TTL再次变为0,从而再次触发ICMP超时消息的返回。Traceroute以此方式运作,随着数据包的发送和丢弃,逐步构建出一条从源到目的地所经过的路由器列表,直到最终接收到目标主机的ICMP Echo应答。

以下是Traceroute的一个示例输出:

1
2
3
4
5
$ traceroute google.com
traceroute to google.com (216.58.216.174), 30 hops max, 60 byte packets
1 192.168.4.254 (192.168.4.254) 0.028 ms 0.009 ms 0.008 ms
2 100.64.1.113 (100.64.1.113) 1.227 ms 1.226 ms 0.920 ms
3 100.64.0.20 (100.64.0.20) 1.501 ms 1.556 ms 0.855 ms

每行代表了从本地主机到目标主机之间的一个路由器或设备。它显示了该节点的名称及其IP地址,最后三列分别对应了数据包往返该节点所需的时间。默认情况下,Traceroute沿路由发送三个数据包以获取平均往返时间,从而帮助评估网络路径的质量与效率。通过分析这些信息,可以识别网络延迟的原因及可能存在的瓶颈。

4 netstat

常见端口

可以通过查看/etc/services文件来获取常见端口的列表:

1
2
3
4
5
6
ftp             21/tcp
ssh 22/tcp
smtp 25/tcp
domain 53/tcp # DNS
http 80/tcp
https 443/tcp

第一列是服务名称,接着是端口号和所使用的传输层协议。

Netstat工具详解

Netstat是一个非常实用的工具,可以提供详细的网络信息,包括网络连接、路由表、网络接口信息等。

套接字和端口

套接字是允许程序发送和接收数据的接口,而端口用于标识哪个应用程序应发送或接收数据。套接字地址是IP地址和端口的组合。主机与目标之间的每个连接都需要一个唯一的套接字。例如,HTTP服务运行在80端口上,但可以拥有多个HTTP连接,为了维护每个连接,每建立一个连接就会创建一个套接字。

以下是一个使用netstat -at命令的输出示例:

1
2
3
4
5
6
7
8
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp 0 0 icebox:domain *:* LISTEN
tcp 0 0 localhost:ipp *:* LISTEN
tcp 0 0 icebox.lan:44468 124.28.28.50:http TIME_WAIT
tcp 0 0 icebox.lan:34751 124.28.29.50:http TIME_WAIT
tcp6 0 0 ip6-localhost:ipp [::]:* LISTEN
tcp6 1 0 ip6-localhost:35094 ip6-localhost:ipp CLOSE_WAIT
tcp6 0 0 ip6-localhost:ipp ip6-localhost:35094 FIN_WAIT2

netstat -a命令显示了所有监听和非监听的网络套接字,-t标志仅展示TCP连接。各列含义如下:

  • Proto:使用的协议,TCP或UDP。
  • Recv-Q:已排队等待接收的数据量。
  • Send-Q:已排队等待发送的数据量。
  • Local Address:本地连接的主机地址。
  • Foreign Address:远程连接的主机地址。
  • State:套接字的状态。

常见的套接字状态包括:

  • LISTENING:套接字正在监听传入连接。
  • SYN_SENT:套接字正尝试主动建立连接。
  • ESTABLISHED:套接字已经建立了连接。
  • CLOSE_WAIT:远程主机已关闭连接,等待本地套接字关闭。
  • TIME_WAIT:套接字在关闭后仍处于等待状态,以处理网络中可能残留的数据包。

5 数据包分析简介

Wireshark和tcpdump是两种非常流行的数据包分析工具。它们能够扫描网络接口、捕获数据包活动、解析数据包并输出信息供我们查看,使我们能够深入进行网络分析,触及底层细节。

安装tcpdump

1
$ sudo apt install tcpdump

在指定接口上捕获数据包

以下是在wlan0接口上捕获数据包的示例:

1
2
3
4
5
6
7
8
9
pete@icebox:~$ sudo tcpdump -i wlan0

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes

11:28:23.958840 IP icebox.lan > nuq04s29-in-f4.1e100.net: ICMP echo request, id 1901, seq 2, length 64

11:28:23.970928 IP nuq04s29-in-f4.1e100.net > icebox.lan: ICMP echo reply, id 1901, seq 2, length 64

运行数据包捕获时,会注意到大量的网络活动。

理解输出

  • 时间戳:记录网络活动的时间。
  • IP:包含协议信息。
  • 源地址与目的地址:例如icebox.lan > nuq04s29-in-f4.1e100.net
  • 序列号(seq):TCP数据包的起始和结束序列号。
  • 长度:数据包长度(字节)。

将tcpdump输出写入文件

1
$ sudo tcpdump -w /some/file

这将把捕获的数据直接写入指定文件,便于后续分析。


[Linux]Network Troubleshooting
https://erlsrnby04.github.io/2025/03/22/Linux-Network-Troubleshooting/
作者
ErlsrnBy04
发布于
2025年3月22日
许可协议