一、概要

traceroute是Linux和Mac OS等系统默认提供的用于网络诊断和探测最常用的工具,Windows系统提供了一个叫:tracert的工具,和traceroute工具的功能相同。通过IP地址或域名,traceroute能探测数据包从源地址到目的地址之间经过哪些路由器,以及经过每个路由器的耗时。

二、traceroute原理

2.1 相关名词
  • ICMP

    ICMP全称(Internet Control Message Protocol)Internet控制报文协议,使用IP的基本支持,它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

  • IP

    IP协议是TCP/IP协议族中最核心的部分,它的作用是在两台主机之间传输数据,所有上层协议的数据(HTTP、TCP、UDP等)都会被封装在一个个的IP数据包中被发送到网络上。

  • TTL

    TTL(time-to-live)是IP数据包中的字段,它指定了从源地址到目的主机的过程中会经历很多次路由转发,在发送数据包时会指定一个TTL值。


2.2 实现原理

traceroute的实现都借助了TTL:通过向目的地址发送一系列的探测包,设置探测包的TTL初始值分别为1,2,3…,根据返回的超时通知(ICMP Time Exceeded Message)得到源地址与目的地址之间的每一跳路由信息。在传输过程中每经过一个路由器,TTL的值都会减1,当TTL为0时,发回一个ICMP超时通知(ICMP Time Exceeded Message)。


2.3 探测流程

aef988e8e4d26453cfd78f59803a63a1.png

  1. 从源地址发出一个探测包到目的地址;

  2. 到达路由器时,TTL将会被减一;

  3. 当TTL变成0时,包则被丢弃,路由器会向源地址发回一个ICMP超时通知(ICMP Time Exceeded Message),ICMP超时的通知包含:

  • IP包源地址

  • IP包所有的内容

  • 路由器的IP地址

当源地址收到ICMP超时通知时;

根据路由信息判断ICMP返回的不是目标地址,则每次设置TTL加1,重复1 ~ 4;

直到目标地址收到探测数据包,并返回端口不可达通知(ICMP Port Unreachable),则停止traceroute;

三、traceroute命令详解

Usage:
  traceroute [ -46dFITnreAUDV ] [ -f first_ttl ] [ -g gate,... ] [ -i device ] [ -m max_ttl ] [ -N squeries ] [ -p port ] [ -t tos ] [ -l flow_label ] [ -w waittime ] [ -q nqueries ] [ -s src_addr ] [ -z sendwait ] [ --fwmark=num ] host [ packetlen ]
Options:
  -4                          Use IPv4
  -6                          Use IPv6
  -d  --debug                 Enable socket level debugging
  -F  --dont-fragment         Do not fragment packets
  -f first_ttl  --first=first_ttl
                              Start from the first_ttl hop (instead from 1)
  #设置第一个检测数据包的ttl大小
  -g gate,...  --gateway=gate,...
                              Route packets through the specified gateway
                              (maximum 8 for IPv4 and 127 for IPv6)
  #设置来源路由网关
  -I  --icmp                  Use ICMP ECHO for tracerouting
  #使用ICMP ECHO代替UDP做路由跟踪
  -T  --tcp                   Use TCP SYN for tracerouting (default port is 80)
  #使用TCP SYN代替UDP做路由跟踪,默认端口是80
  -i device  --interface=device
                              Specify a network interface to operate with
  #使用指定的网络接口
  -m max_ttl  --max-hops=max_ttl
                              Set the max number of hops (max TTL to be
                              reached). Default is 30
  #设置检测数据包的最大ttl大小。
  -N squeries  --sim-queries=squeries
                              Set the number of probes to be tried
                              simultaneously (default is 16)
  -n                          Do not resolve IP addresses to their domain names
  #不要将IP地址解析为他们的域名
  -p port  --port=port        Set the destination port to use. It is either
                              initial udp port value for "default" method
                              (incremented by each probe, default is 33434), or
                              initial seq for "icmp" (incremented as well,
                              default from 1), or some constant destination
                              port for other methods (with default of 80 for
                              "tcp", 53 for "udp", etc.)
  #探测端口
  -t tos  --tos=tos           Set the TOS (IPv4 type of service) or TC (IPv6
                              traffic class) value for outgoing packets
  #设置传出包的TOS或TC
  -l flow_label  --flowlabel=flow_label
                              Use specified flow_label for IPv6 packets
  -w waittime  --wait=waittime
                              Set the number of seconds to wait for response to
                              a probe (default is 5.0). Non-integer (float
                              point) values allowed too
  #设置等待探测器的秒数
  -q nqueries  --queries=nqueries
                              Set the number of probes per each hop. Default is
                              3
  #设置每一跳的探测数量
  -r                          Bypass the normal routing and send directly to a
                              host on an attached network
  #绕过正常路由,直接发送到连接网络上的主机
  -s src_addr  --source=src_addr
                              Use source src_addr for outgoing packets
  #设置本地主机送出数据包的IP地址。
  -z sendwait  --sendwait=sendwait
                              Minimal time interval between probes (default 0).
                              If the value is more than 10, then it specifies a
                              number in milliseconds, else it is a number of
                              seconds (float point values allowed too)
  #探测之间最小的时间间隔
  -e  --extensions            Show ICMP extensions (if present), including MPLS
  #显示ICMP扩展,例如:<MPLS:L=24915,E=4,S=1,T=1>
  -A  --as-path-lookups       Perform AS path lookups in routing registries and
                              print results directly after the corresponding
                              addresses
  #在路由注册表中执行路径查找,并直接在相应地址后打印结果
  -M name  --module=name      Use specified module (either builtin or external)
                              for traceroute operations. Most methods have
                              their shortcuts (`-I' means `-M icmp' etc.)
  -O OPTS,...  --options=OPTS,...
                              Use module-specific option OPTS for the
                              traceroute module. Several OPTS allowed,
                              separated by comma. If OPTS is "help", print info
                              about available options
  --sport=num                 Use source port num for outgoing packets. Implies
                              `-N 1'
  --fwmark=num                Set firewall mark for outgoing packets
  -U  --udp                   Use UDP to particular port for tracerouting
                              (instead of increasing the port per each probe),
                              default port is 53
  #使用指定的端口tracerouting
  -UL                         Use UDPLITE for tracerouting (default dest port
                              is 53)
  #使用UDPLITE(轻量级用户数据包协议)协议tracerouting
  -D  --dccp                  Use DCCP Request for tracerouting (default port
                              is 33434)
  #使用DCCP(数据拥塞控制协议)协议tracerouting
  -P prot  --protocol=prot    Use raw packet of protocol prot for tracerouting
  --mtu                       Discover MTU along the path being traced. Implies
                              `-F -N 1'
  --back                      Guess the number of hops in the backward path and
                              print if it differs
  #猜测后面路径中的跳数,如果不同,则打印
  -V  --version               Print version info and exit
  --help                      Read this help and exit


Arguments:
+     host          The host to traceroute to
      packetlen     The full packet length (default is the length of an IP
                    header plus 40). Can be ignored or increased to a minimal
                    allowed value

四、使用案例


4.1 案例1 - 正常探测

下面我们通过 traceroute 诊断 www.google.com,可以看到访问google途径了哪些路由以及耗时。(ip地址做了混淆)

~ % traceroute -m 100 www.google.com
traceroute to www.google.com (142.251.46.228), 100 hops max, 52 byte packets
 1  10.100.xxx.1 (10.100.xxx.1)  2.506 ms  1.711 ms  1.597 ms
 2  10.100.xxx.1 (10.100.xxx.1)  2.151 ms  1.774 ms  1.972 ms
 3  172.20.xxx.2 (172.20.xxx.2)  3.593 ms  2.898 ms  3.900 ms
 4  10.100.xxx.21 (10.100.xxx.21)  29.521 ms  28.277 ms
    10.100.xxx.13 (10.100.xxx.13)  25.796 ms
 5  10.100.xxx.2 (10.100.xxx.2)  268.802 ms  266.772 ms  267.345 ms
 6  38-99-xxx-1.xxqq.com (38.99.xxx.1)  269.484 ms  268.133 ms  269.585 ms
 7  g.xxqq.com (38.140.xxx.105)  268.121 ms  267.199 ms  267.788 ms
 8  te0-1-xxqq.com (154.24.xxx.185)  267.399 ms  267.363 ms
    te0-2-xxqq.com (154.24.xxx.189)  269.489 ms
 9  be3103.ccr22.xxxqqq.com (154.54.xxx.153)  272.171 ms  280.677 ms
    be3102.ccr22.xxxqqq.com (154.54.xxx.81)  267.766 ms
10  be3142.ccr41.xxxqqq.com (154.54.xxx.194)  273.885 ms
    be3144.ccr41.xxxqqq.com (154.54.xxx.102)  267.533 ms  268.905 ms
11  tata.sjc03.atlas.xxxqqq.com (154.54.12.142)  271.494 ms  297.618 ms  269.622 ms
12  72.14.xxx.30 (72.14.xxx.30)  275.381 ms  269.273 ms  286.065 ms
13  * * *
14  108.170.xxx.106 (108.170.xxx.106)  268.175 ms
    108.170.xxx.241 (108.170.xxx.241)  269.844 ms
    142.251.xxx.30 (142.251.xxx.30)  269.521 ms
15  142.251.xxx.81 (142.251.xxx.81)  267.344 ms
    108.170.xxx.83 (108.170.xxx.83)  270.030 ms  270.920 ms
16  142.250.xxx.55 (142.250.xxx.55)  269.555 ms
    sfo03s27-in-fss4.1e100.net (142.251.46.xxx)  270.277 ms  268.535 ms

我们看到第一跳里面包含三个时间,因为每次检测都同时发送3个数据包(如果要设置数据包的数量,可以通过-q设置),这三个时间表示到达所耗费的时间。前面的内容 10.100.144.1 (10.100.144.1) :主机名 (IP地址)

1  10.100.xxx.1 (10.100.xxx.1)  2.506 ms  1.711 ms  1.597 ms

第13跳中的 * 代表路由器禁止了ICMP数据包的返回,或者被防火墙过滤。即: 数据报超时没有返回。

特别是使用UDP协议traceroute,由于安全问题大部分的应用服务器都不提供UDP服务(或者被防火墙挡掉),所以我们拿不到服务器的任何返回。

13  * * *

最后,我们traceroute截取开头和结尾可以发现,执行 traceroute 命令时,设置-m 100,实际上到第16跳找到了www.google.com的目标 IP: 142.251.46.228 了。

~ % traceroute -m 100 www.google.com
traceroute to www.google.com (142.251.46.228), 100 hops max, 52 byte packets
 1  10.100.xxx.1 (10.100.xxx.1)  2.506 ms  1.711 ms  1.597 ms
------省略
16  142.250.xxx.55 (142.250.xxx.55)  269.555 ms
    sfo03s27-in-fss4.1e100.net (142.251.46.xxx)  270.277 ms  268.535 ms
4.2 案例2 - 无法探测
[~]$ sudo traceroute -m 100  alarm.sharingan.com
traceroute to alarm.sharingan.com (54.224.xxx.189), 100 hops max, 60 byte packets
 1  216.182.xxx.80 (216.182.xxx.80)  10.507 ms 216.182.xxx.91 (216.182.xxx.91)  54.500 ms 216.182.xxx.171 (216.182.xxx.171)  7.847 ms
 2  * * *
 -----省略,一致到100都是星,返回超时
100  * * *

无法到达目标IP。跟着最终的探测结果,如果最大跳数是100,在无法访问到目标地址的情况下会一致探测到最大的跳数之后才停止。


五、总结

traceroute是比较实用的网络工具,结合wireshark抓包工具一起分析,非常好用。感兴趣的朋友可以动手尝试一下。文中内容如有不妥之处,请指出。

期阅读

谈谈裁员滚滚之后几类人的生存现状以及如何避险

技术更新太快,很容易被淘汰,真的是这样吗?

Lombok我们真的不应该使用了嘛?

云原生之可观测性-OpenTracing、OpenSensus、OpenTelemetry

云原生之可观测性 - APM概念及选型

大厂“断子绝孙式”、“养蛊式”招聘有多害人?

Kafka Producer全流程分析和思考

MySQL的Replace用法详解

卷不动了,我选择降薪去外企来平衡工作和生活

HBase、Cassandra、LevelDB、RocksDB 相关数据结构是什么?

时间轮(TimingWheel)算法总结

7ece51621ebe76d5153a73d01af456de.png

快乐程序员、读书狂魔、爱撸代码、开源项目、硬核互联网技术分享

觉得写得不错,请点在看,谢谢!

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐