traceroute路由追踪-理论

news/2024/5/18 16:36:53 标签: udp, tcp/ip, 路由器

1.traceroute介绍及基本原理

这篇文章讲的很清楚

TraceRoute程序的实现主要涉及IP头部生存时间(time to live, TTL)字段的使用。

设置TTL字段的目的是为了防止数据报由于选路错误或其他软硬件原因从而导致在网络中无休止的流动,TTL字段指定了数据报的生存时间。TTL的初始值由源主机设置,当一份数据报经过路由器时,处理该数据报的路由器都需要把TTL值减去数据报在路由器中停留的秒数。但事实上大多数路由器只是简单地将TTL值减1,因此TTL字段最终被实现为一个跳站计数器。当TTL字段的值被减为0时,路由器就不会转发该数据报,而是将其丢弃,并产生一份ICMP超时差错报文发往源主机以通知错误的发生。TraceRoute程序的关键就在于返回的这份ICMP超时差错报文的源地址就是途经路由器的IP地址。由此,通过依次递增TTL字段的值,就可以得到一份数据报在其传输路径上所经过的路由信息。

TraceRoute程序在具体实现时,是令其向目的主机发送一个ICMP回显请求(Echo request)消息,并重复递增IP头部TTL字段的值。刚开始的时候TTL等于1,这样当该数据报抵达途中的第一个路由器时,TTL的值就被减为0,导致发生超时错误,因此路由器生成一份ICMP超时差错报文返回给源主机。随后,主机将数据报的TTL值递增1,以便IP报文能传递到下一个路由器,下一个路由器将会生成ICMP超时超时差错报文返回给源主机。不断重复这个过程,直到数据报到达最终的目的主机,此时目的主机将返回ICMP回显应答(Echo replay)消息。这样,源主机只需对返回的每一份ICMP报文进行解析处理,就可以掌握数据报从源主机到达目的主机途中所经过的路由信息。

其详细过程如下:
将传递到目的IP地址的ICMP Echo消息的TTL值被设置为1,该消息报经过第一个路由器时,其TTL值减去1,此时新产生的TTL值为0。
由于TTL值被设置为0,路由器判断此时不应该尝试继续转发数据报,而是直接抛弃该数据报。由于数据报的生存周期(TTL值)已经到期,这个路由器会发送一个一个ICMP时间超时,即TTL值过期信息返回到客户端计算机
此时,发出traceroute命令的客户端计算机将显示该路由器的名称,之后可以再发送一个ICMP Echo消息并把TTL值设置为2。
第1个路由器仍然对这个TTL值减1,然后,将这个数据报转发到传输路径上的下一跳。当数据报抵达第2个路由器,TTL值会再被减去1,成为0值。
第2个路由器会像第1个路由器一样,抛弃这个数据包,并像第1个路由器那样返回一个ICMP消息。
该过程会一直持续,traceroute命令不停递增TTL值,而传输路径上的路由器不断递减该值,直到数据报最终抵达预期的目的地。

需要注意的是,并不是所有网关都会如实返回 ICMP 超时报文。出于安全性考虑,大多数防火墙以及启用了防火墙功能的路由器缺省配置为不返回各种 ICMP 报文,其余路由器或交换机也可被管理员主动修改配置变为不返回 ICMP 报文。因此 Traceroute 程序不一定能拿全所有的沿途网关地址。所以,当某个 TTL 值的数据包得不到响应时,并不能停止这一追踪过程,程序仍然会把 TTL 递增而发出下一个数据包。一直达到默认或用参数指定的追踪限制(maximum_hops)才结束追踪。

每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样。

探测数据包每次向每个网关发送三个数据包。每次送出的为3个数据包包,包括源地址,目的地址和包发出的时间标签。发送数据包的大小默认为38个字节。

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

超时通知内含发送IP包的源地址、IP包的所有内容及路由器的IP地址。

Linux和Mac OS等系统使用UDP包进行探测,目标端口号默认为33434,每次探测目标端口号加1。traceroute程序发送一个UDP数据报给目的主机,但是它选择一个不可能的值作为UDP端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口,因此该数据报到达目的主机时,目的主机会产生一个“端口不可达”错误的ICMP报文,这样traceroute程序要做的就是区分接收到的ICMP报文是超时还是端口不可达,从而来区分是路由器还是目的主机
请添加图片描述请添加图片描述

2.traceroute结果分析

这篇文章讲的很明白
请添加图片描述
这个也很明白

记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关。每行有三个时间,单位是 ms,表示探测数据包向每个网关发送三个数据包后,网关响应后返回的时间。

有时我们traceroute 一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。

如果源从任何给定的路由器接收到的报文少于 3 条(由于网络中的分组丢失),traceroute 在该路由器号码后面放一个星号,并报告到达那台路由器的少于 3 次的往返时间

使用UDP的traceroute,失败还是比较常见的。这常常是由于,在运营商的路由器上,UDP与ICMP的待遇大不相同。为了利于troubleshooting,ICMP ECHO Request/Reply 是不会封的,而UDP则不同。UDP常被用来做网络攻击,因为UDP无需连接,因而没有任何状态约束它,比较方便攻击者伪造源IP、伪造目的端口发送任意多的UDP包,长度自定义。所以运营商为安全考虑,对于UDP端口常常采用白名单ACL,就是只有ACL允许的端口才可以通过,没有明确允许的则统统丢弃。比如允许DNS/DHCP/SNMP等。

有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会 有延时长的现象。

traceroute是一条缓慢的命令,因为每经过一台路由器都要花去大约10到15秒

具体分析

3.traceroute的三种模式-UDP、TCP、ICMP

traceroute主要利用IP数据包的TTL字段值 + ICMP来实现,它发送的用于探测网络路径的数据包的IP之上的协议可以是 UDP、TCP或ICMP。不同模式下,探测过程中设计的数据包如下:
请添加图片描述
UDP模式UDP探测数据包(目标端口大于30000) + 中间网关发回 ICMP TTL 超时(ICMP Time Exceeded Message)数据包 + 目标主机发回ICMP Destination Unreachable 数据包
请添加图片描述

TCP模式:TCP [SYN]探测数据包(目标端口为Web服务的80) + 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回TCP [SYN ACK] 数据包

ICMP模式ICMP Echo (ping) Request 探测数据包 + 中间网关发回ICMP TTL超时数据包 + 目标主机发回ICMP Echo (ping) reply 数据包
TCP模式报文见这篇文章
请添加图片描述


http://www.niftyadmin.cn/n/610127.html

相关文章

python实现Linux上的traceroute

1.Linux上的traceroute原理 UDP模式:UDP探测数据包(目标端口大于30000) 中间网关发回 ICMP TTL 超时(ICMP Time Exceeded Message)数据包 目标主机发回ICMP Destination Unreachable 数据包 2.用到的python模块、…

五、Shell脚本:循环语句——for循环,while循环,until循环

循环语句: 1、for循环语句 2、while循环语句 3、untli循环语句 1.1 for语句的结构 读取不同的变量值,用来逐个执行同一组命令 1.2、for循环语句的三种语句结构用法 for语句结构:第一种: for 变量名 in 取值列表 do命令序列 don…

python从Route Views Archieve上下载解析.bz2数据包

python从Route Views Archieve上下载解析.bz2数据包 1.下载压缩包 2.解压缩包 3.解析解压缩后文件 #encoding:utf-8 import os import requests import urllib import urllib2 import bz2url http://archive.routeviews.org/bgpdata/2001.10/RIBS/rib.20011026.1648.…

六、Shell脚本:函数与数组

一、Shell函数 (1)将命令序列按格式写在一起 (2)可方便重复使用命令序列 (3)Shell函数定义 [ function ] 函数名(){ 命令序列 [return x] } (4)调用函数的方法 函数名 [参数一][参数…

七:Shell脚本:正则表达式与文本处理器三剑客grep,egrep, sed,awk

正则表达式定义 正则表达式,又称正规表达式、常规表达式 使用字符串来描述、匹配一系列符合某个规则的字符串 ●正则表达式组成 ◆普通字符 大小写字母、数字、标点符号及一些其他符号 ◆元字符 在正则表达式中具有特殊意义的专用字符 基础正则表达式元字符 &#…

八、Shell脚本:正则表达式三剑客awk

awk概述: AWK是一种处理文本文件的语言,是一个强大的文本分析工具。 它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作 数据可以来自标准输入也可以是管道或文件 工作原理: 当读到第一行时&am…

全面接触SQL语法三

HAVING 条件子句 指定一特定的分组记录,并满足HAVING 所指定的条件或状态,但条件是针对分组的条件设置。 SELECT fieldlist FROM table WHERE selectcriteria GROUP BY groupfieldlist HAVING groupcriteria fieldlist 显示被查询的字段名称。(可与…