网络可达与网络路由探测
大杂烩,关于网络可达性与路由探测相关的命令与工具,使用笔记总结。
网络延迟tcping和httping
类比ping之基于icmp,用于探测网络层的延迟;tcping基于tcp,用于探测tcp三次握手;httping基于http/https用于测试真实的http/https数据返回延迟。
tcping
使用的是开源的tcping,使用golang实现。
linuxmint安装:
bash
wget https://github.com/pouriyajamshidi/tcping/releases/latest/download/tcping_amd64.deb -O /tmp/tcping.deb
sudo apt install -y /tmp/tcping.deb
或者下载后直接双击打开安装。
httping
使用的是httping,官网的说明:
读取header返回,计算真实的http延迟,包括服务器处理和网络传输。
ping、telnet、nc
ECMP与nc命令排查
bash
nc -p 30000 -w 5 -vz www.baidu.com 80
bash
while true;do nc -vz www.baidu.com 80; sleep 1; done
各个参数的解释:
- nc:Netcat 的命令。
- -p 30000:指定源端口为 30000。即从本地的 30000 端口发起连接。
- -w 5:设置超时时间为 5 秒。如果连接在 5 秒内没有建立,将会超时。
- -vz:-v 表示详细模式(verbose),会输出更多的连接信息;-z 表示零输入/输出模式,只检查连接,不发送数据。
- www.baidu.com:目标主机名。
- 80:目标端口号。
这条命令的作用是从本地的 30000 端口尝试连接到 www.baidu.com 的 80 端口,并在 5 秒内返回连接结果。
网络层的一个重要概念 ECMP。ECMP 的最大作用是用多条链路实现更大的传输带宽。
而为了提升可用性,ECMP 一般会启用基于哈希的转发策略,实现网络流量在多个链路间的有状态的转发。
因为 ECMP 多路径的存在,网络排查变得更加复杂。而了解它的哈希转发策略,对我们的排查工作很有帮助。特别是 ICMP 报文会走固定线路,而 TCP/UDP 的不同连接会因为五元组的变化而走不同的线路。
在排查技巧方面,我们学习了一个实用的小工具 nc。
如果你怀疑 ECMP 的某个节点有问题,可以尝试用 nc 命令来发起不同哈希值的连接,也就是使用 -p 参数指定源端口做测试。
如果发现某些源端口的表现跟其他端口不同,那么很可能就是 ECMP 的节点问题。
另外,我们也学习了一个 tcpdump 的小知识点。在 tcpdump 的命令行输出中:
[S]代表 SYN;
[.]代表 ACK;
[F.]代表 FIN+ACK;
[P.]代表 PUSH+ACK;
[R.]代表 RST+ACK。
网络路径问题的排查是比较复杂的。当路径中某个节点的问题比较严重时,用 nc 工具相对容易复现出问题。
当问题比较隐蔽,比如出错率比较低的时候,可能单纯用 nc 就不够方便了,我们需要另外一个工具 mtr。 它是加强版的 traceroute,可以做持续的三层可达性的探测。
nc命令常用参数
nc 命令来自英文词组 net cat 的缩写,其功能是扫描与连接指定端口。nc 命令是一个功能丰富的网络实用工具,被誉为网络界的“瑞士军刀”,短小精悍,功能实用。
它支持 TCP 和 UDP 协议,能够基于命令行在网络上读取和写入数据,连接与扫描指定端口号,为用户提供无限的潜在用途。
mtr、traceroute/tracert
关于路由探测的工具和命令有很多,比如tracert/traceroute、hping3、pathping、mtr、tracepath等。
常用的总结,下面这些类比理解比较容易记住。
- ping:道路通不通
- tracert/traceroute:道路怎么走
- pathping/mtr:道路怎么走以及道路的路况如何(丢包率等)
traceroute与tracert
linux上traceroute 默认使用udp协议,很多网络设备不会对udp做出回应,可以加上-I参数
(i大写,代表icmp),就有回应了,下面是加不加-I参数
的区别:
windows上对应的tracert默认使用icmp协议,所以tracert不用加参数就是icmp了。
tracert的-dR参数:不解析主机名,使用『参考路由』。
hping3、traceroute
ping 基于 ICMP 协议,它通过计算 ICMP 回显响应报文与 ICMP 回显请求报文的时间差,来获得往返延时。
这个过程并不需要特殊认证,常被很多网络攻击利用,比如端口扫描工具 nmap、组包工具 hping3 等等。
所以,为了避免这些问题,很多网络服务会把 ICMP 禁止掉,这也就导致我们无法用 ping ,来测试网络服务的可用性和往返延时。这时,你可以用 traceroute 或 hping3 的 TCP 和 UDP 模式,来获取网络延迟。
比如,以 baidu.com 为例,你可以执行下面的 hping3 命令,测试你的机器到百度搜索服务器的网络延迟:
hping3 -c 3 -S -p 80 baidu.com
从 hping3 的结果中,你可以看到,往返延迟 RTT 为 20.9ms。
当然,我们用 traceroute ,也可以得到类似结果:
traceroute 工作原理:traceroute 会在路由的每一跳发送三个包,并在收到响应后,输出往返延时。如果无响应或者响应超时(默认 5s),就会输出一个星号。
最实用工具mtr
上面所说的traceroute/tracert不能多次探测,也就是没办法统计丢包,但mtr可以多次探测丢包:
mtr一般用法:
mtr -rn www.baidu.com
没有-c参数限制次数,默认会一直统计。
bash
mtr -rnc 10 baidu.com
参数解释:
-r(--report)启用报告模式:mtr 默认以交互式实时更新界面运行(动态显示每个节点的丢包率和延迟)。使用 -r 参数后,mtr 会关闭交互模式,改为生成一次性的统计报告(类似于 traceroute 的输出形式)。
-n(--no-dns)禁用 DNS 反向解析:默认情况下,mtr 会尝试将 IP 地址解析为域名(如 203.0.113.1 → router.example.com)。使用 -n 后,所有节点直接显示 IP 地址,跳过 DNS 查询。
用途:加速输出(避免 DNS 查询耗时),或在 DNS 解析不稳定时确保结果准确性。
mtr 默认使用 ICMP 协议探测路径,而实际访问网站时使用的是 TCP 协议(如 HTTP/HTTPS)。网络设备可能对 ICMP 和 TCP 采取不同的策略,TCP 流量通常优先级更高且更少被限制。
通过 mtr --tcp -P 80 baidu.com
或 mtr --tcp -P 443 baidu.com
使用 TCP 协议(模拟实际 HTTP/HTTPS 流量)进行探测,观察丢包率是否降低。
bash
mtr --tcp -P 443 baidu.com
同理,也有--udp
参数。
mtr进阶用法:
指定数据包大小,通过 -s 参数自定义探测包的大小,模拟不同场景下的网络传输。
使用场景:
- 诊断 MTU(最大传输单元)问题(如 IP 分片导致的丢包)。
- 模拟大文件传输时的网络表现。
bash
mtr -s 1500 baidu.com # 发送 1500 字节的包(测试 MTU)
mtr -s 1024 baidu.com # 发送 1024 字节的包
通过 --aslookup 参数显示路径中节点的自治系统编号(ASN)和归属信息。
使用场景:快速识别网络路径中的运营商或国际链路问题(例如某个 AS 的节点延迟异常)。
bash
mtr --aslookup baidu.com
调整探测间隔和超时时间。
自定义探测间隔(默认 1 秒):
bash
mtr -i 0.5 baidu.com # 每 0.5 秒发送一次探测
设置超时时间(默认 1 秒):
bash
mtr -u 2 baidu.com # 等待响应超时时间设为 2 秒
过滤特定节点。
通过 -g 参数指定忽略某些节点(例如已知无问题的网关):
bash
mtr -g 192.168.1.1 baidu.com # 跳过对 192.168.1.1 的探测
使用 -B 参数启动分屏模式,同时监控多个目标:
bash
mtr -B # 输入目标地址(如 baidu.com 和 google.com),按 Tab 切换窗口。
自定义输出格式:
bash
mtr -o "LDR SNBAW" baidu.com
L(丢包率)、D(延迟)、R(接收状态)、S(发送数量)、N(节点)、B(ASN)、A(平均延迟)、W(最差延迟)。
显示完整主机名,通过 -C 参数强制显示完整主机名(而非缩写)。在 DNS 解析正常时,更清晰地识别路径中的节点归属:
bash
mtr -C baidu.com
显示 IPv6 地址:
bash
mtr -6 baidu.com
结合其他工具增强分析。
dig/nslookup:先解析目标域名的 IP,再用 mtr 测试具体 IP。
bash
dig baidu.com +short | xargs mtr -rn
tcpdump:抓包分析 mtr 探测流量。
bash
tcpdump -i eth0 icmp and host baidu.com
mtr的输出解释:
- Host:目标 IP 地址或主机名。
- Loss%:丢包率,表示该节点在探测过程中丢包的比例。
- Snt:发送的探测包数量。
更多参数参考:https://www.cnblogs.com/xzongblogs/p/15062134.html
mtr也有windows下的版本。
其他笔记
windows下:tracert && pathping(自带)
在 Windows 下,建议安装 besttrace ,这款工具带了 MTR 的功能,或者mtr。
在Linux下使用:traceroute、mtr等, traceroute自带,mtr需要安装。
- linux:sudo yum install mtr
- mac: brew install mtr
Linux下直接使用 traceroute www.baidu.com 经常得到***的结果,是 traceroute 默认是用 UDP 作为探测协议的,但是很多网络设备并不会对UDP 作出回应。
所以我们改成 ICMP 协议做探测后,网络设备就有回应了。
Windows 上的 tracert,就是默认用 ICMP,这一点跟 Linux 正好是反过来的。
一般改成icmp就有回应了,正确的是:
traceroute www.baidu.com -I
大写i,即imcp的意思。
traceroute 也有一个明显的不足:它不能对这个路径做连续多次的探测。
于是,mtr 出现了,它可以说是 traceroute 的超集,除了 traceroute 的功能,还能实现丰富的探测报告。
尤其是它对每一跳的丢包率的百分比,是用来定位路径中节点问题的重要指标。
所以,当你在遇到“连接状况时好时坏的问题”的时候,单纯用一次性的 traceroute 恐怕难以看清楚,那就可以用 mtr,来获取更加全面和动态的链路状态信息了。比如:
mtr www.baidu.com -r -c 10
探测十次,生成统计报告,不加参数是动态显示。
额外问题:上面说了icmp网络层丢包可以用mtr排查,那tcp丢包如何排查?
TCP 传输丢包问题使用 tcpdump 抓包看看,看看重试是如何发生的,使用 wireshark 打开,使用过滤器 tcp.analysis.retransmission 找到重传的包。
还有一个基于 eBPF 的轻量级工具 tcpretrans ,也可以试试。不过 eBPF 对 Linux 版本要求较高。
tracepath 命令的功能是追踪数据包的路由信息。tracepath 命令能够追踪并显示数据包到达目的主机所经过的路由信息,以及对应的 MTU 值。
sudo apt install iputils-tracepath
Loss%(丢包率)的判断:
任一节点的Loss%(丢包率)如果不为零,则说明这一跳网络可能存在问题。
导致相应节点丢包的原因通常有以下两种:
- 运营商基于安全或性能需求,限制了节点的ICMP发送速率,导致丢包。
- 节点确实存在异常,导致丢包。
结合异常节点及其后续节点的丢包情况,并参见以下内容,判定丢包原因。
- 如果随后节点均没有丢包,则通常表示异常节点丢包是由于运营商策略限制所致。可以忽略相关丢包。
- 如果随后节点也出现丢包,则通常说明异常节点确实存在网络异常,导致丢包。
- 另外,上述两种情况可能同时发生,即相应节点既存在策略限速,又存在网络异常。对于这种情况,如果异常节点及其后续节点连续出现丢包,而且各节点的丢包率不同,则通常以最后几跳的丢包率为准。
pathping -n www.baidu.com
tracert -d www.baidu.com
traceroute -d www.baidu.com
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。
linux系统中,我们称之为traceroute,在MS Windows中为tracert。 traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。
Pathping是一个基于TCP/IP的路由跟踪工具,该命令结合了 ping 和 tracert 命令的功能,返回两部分内容,反映出数据包从源主机到目标主机所经过的路径、网络延时以及丢包率,能够有效地帮助我们解决网络问题。
tracert命令及举例:
tracert命令,通过向目标IP地址发送不同TTL值的Internet控制消息协议ICMP回应数据包,发送规则是:先发送TTL为1的回应数据包,并在随后的每次发送过程将TTL递增1,直到目标IP地址响应或TTL达到最大值。路径上的每个路由器,在转发数据包之前至少将数据包上的TTL递减1,直到TTL减为0时,路由器将ICMP超时消息发回源地址。
通过检查ICMP超时信息,tracert命令就可以显示出目标IP地址所经过的路径。Tracert命令格式如下:Tracert[-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name
如果不带选项的话,会将IP地址解析成主机名,因为需要查询DNS,所以速度比较慢。
-d选项:不将IP地址解析成主机名,因此路由追踪速度快很多。
-h选项:说明路由的最大跳数,默认是30跳。
-w选项:说明等待每一个ICMP响应报文的时间,默认4s,如果接收超时,则显示星号*。跳数和等待时间,使用默认值即可,所以平时一般都不需要添加这两个选项。
-j选项:说明ICMP报文要使用IP头中的松散源路由选项,后面是经过的中间节点的地址或主机名字,最多9个,各个中间节点用空格隔开。
这里说明下松散源路由和严格源路由,严格源路由是指,相邻路由器之间不得有中间路由器,并且所经过路由器的顺序不可更改。
而松散源路由,则相反,相邻路由器之间可以有中间路由器。
一般的路由追踪,也用不到-j这个选项。除非是针对大的网络故障,需要检测几条路径到达同一个目的地址,才需要使用-j选项。
所以,通常情况下,我们使用tracert –d
这种格式就可以了。我们以追踪百度网站为例。
从路由表中,可以清楚看出到达百度站点的每一跳的IP地址。如果追踪不了目的地址,那么故障肯定出在第一个请求超时的节点。
当能够追踪目的地址的时候,有时候也会出现请求超时的现象。这是因为某些核心节点,为了防止IP泄露,设置了禁止跟踪。
从路由表中,我们还可以看出,每一条都有三个时间,这是因为tracert每一跳会发出三个TTL包,三个数字都表示ping值。
有时候,这三个时间,也有可能个别出现星号,即意味着数据报超时没有返回,该节点可能存在问题。
当然,也有可能是由于路由器限速的原因。从tracert每一跳的三个时间值,我们也可以大致得出每一跳的网络时延。
比如在私网和省内,时延都在10ms以内,到了省外就超过了20ms了。
如果需要了解每一跳的丢包率等信息,那就必须使用pathping命令了。
pathping命令及举例:
Pathping命令的格式如下:pathping [-g host-list] [-hmaximum_hops] [-n] [-p period] [-q num_queries] [-w timeout] target_name
-g选项:使用松散源路由,功能与tracert 命令的-j选项相同。
-h选项:追踪的最大跳数,功能与tracert 命令的-h选项相同。
-n选项:不将IP地址解析成主机名,功能与tracert 命令的-d选项相同。
-q选项:发送给每个路由器的请求报文的数量,默认100个。
-p选项:两次ping之间的时间间隔,默认0.25秒。
-w选项:每次等待回声响应的时间,默认3秒。功能与tracert 命令的-w选项相同。
因此,在通常情况下,我们使用pathping -n格式就行了,路由追踪速度更快。
下面,还是以百度为例:Pathping运行的第一个结果就是路由表,这个和tracert的结果是一致的。
经过200秒的统计时间,显示时延和丢包率的测试结果。往返时延RTT,显示省内都在10ms以内,省外时延20毫米以上,链路丢包率都是0,网络质量还是不错的。
针对CDN网络,当接到客户反馈网络质量不稳定的时候,就可以用pathping命令,根据时延和丢包率,来简单判断到底是哪个节点出现了问题。
其他工具定位网络延迟: