traceroute工作原理

  traceroute, 也就是 trace route,跟踪路由。这个程序最早是Van Jacobson实现的。源代码在网上能够找到,只是我还没有去找。基本的原理是IP路由过程中对数据包TTL(Time to Live,存活时间)的处理。当路由器收到一个IP包时,会改动IP包的TTL(及由此造成的头部检验和checksum变化)。每收到一个包,检查这个
的TTL是否是0或1。假设是,表明这个包还没有到达目的地,并且剩余时间不多了,肯定是到不了目的地了。这样路由器就简单地丢弃这个包,并给源主机发送 ICMP通知,说这个包已经超时了。ICMP的通知信息里包括当前路由器发送时所用的IP。

  这样就能够通过构造数据包,来间接检查到 达一个主机时经过了哪些路由。一開始发送一个TTL为1的包,这样到达第一个路由器的时候就已经超时了,第一个路由器就发通知说包超时,这样就能够记录下 所经过的第一个路由器的IP。然后TTL加1,安全通过第一个路由器,而第二个路由器的的处理与第一个同样,丢包,发通知说包超时了,这样记录下第二个路 由器IP,由此能够一直进行下去,直到这个数据包到达目标主机,由此打印出全部经过的路由器。

  在通信中,IP层仅仅负责数据的路由与传 输,并不处理数据包的内容。比如ICMP,或TCP,UDP,这些协议是依赖IP层的传输功能来传送数据的。在通信两方的主机中,收到这些协议的数据包 后,一般在通信的相应主机上,会有程序来处理这些数据。而直接的IP数据报是没实用处的(win2000的驱动层能够直接使用IP报而不须要加上其它协 议,可是通常是不会这样用的)。因此traceroute程序发送一个UDP包来试探。对路由器来说,UDP数据报仅仅是IP数据报的一种,它并不关心 UDP数据报的详细内容。直到这个包到达目的端的主机会,目的主机的内核会解析UDP数据报,并查找数据报中要求port是否已经有进程在使用。假设找到,则
通知进程有数据到达。而假设找不到,则发送一个"目的port不可达"的ICMP错误数据回到源主机。

  这样就能够全然确定下来。trcertroute建立一个UDP数据包,不断改动TTL值并发送出去,假设收到"超时错",表示刚刚到达的是路由器,而假设收到的是"port不可达"错误,表示刚刚到达的就是目的主机。这样路由跟踪完毕,程序结束。

有几个细节

  1.局域网的路由是相对稳定的,因此用traceroute打印出来的响应时间相差不大。而假设用来跟踪广域网的路由,因为广域网的路由信息是动态变化的,并且并不能确定是发送路径耗时还是返回路径耗时较多,因此时间与路由信息仅仅能做为參考。

   2.TTL 的选择。假设把TTL设得足够大,是不是一定能够打印出全部路由,比方一个数据包经过300个路由器才到达目的端。当然在现有网络环境下不太可能出现要经 过这么多路由的情况。而TTL信息在IP数据报中仅仅有一个字节,也就是最多能设定到255(256以后又又一次从0開始)。设定这个信息的目的,就是防止一 些僵而不化的数据报在网络漫上无目的的游荡而不消失。数据报每经过一个路由器,路由器就把TTL减1(或在该路由器被处理前经过的秒数),总有一个时候会 被减到1,然后路由器会把它丢弃。

  3.traceroute的是以收到"port不可达"为标志来结束的。前提是发出的UDP数据报中要求 的port在目的主机上没有进程在使用。而假设目的主机上正好有进程在使用这个port,接收这个包并按正常方式处理,这样traceroute就收不到"port不 可达"的错误了。为了避免出现这样的情况,UDP数据报的port非常高(书中的实现是初始值33435,以后每发送一次再加1,port号最大能够到65535)。 普通程序一般不会使用这些高port。问题是假如真的存在这样的情况时,traceroute会怎么处理?而好像Solaris系统可能会使用高port,这时又怎
么样。

  4. 在发送过程中,要经过很多的路由,到达目的主机前,可能还要经过网关,防火墙,以及其它比如IDS的过滤,发送包能不能到达目的主机还是个问题。而即使到 达了,发送的ICMP信息能不能返回也是个问题。由于沿途经过的关卡太多,遇上黑洞路由器,不转发这些信息的话,那就一点办法也没有了。

   书中还提到原来的traceroute里有一个选项,能够指定数据包经过的路由器。假设是宽路由,则仅仅要经过指定的路由就可以。而假设是严路由,则必须按 指定的顺序经过指定的路由器。由于这个选项可能导致某个固定的路由处理信息太多,在发布的源代码里已经取消了。可是能够找到补丁,还是能够用起来的。从比較 的结果看,似乎指定路由器反而不如让路由器採用默认路由处理得快。而对于严路由来说,要成功就要更难一些,由于并不一定你指定的路由器正好有条目到接下来 的路由器。

ping程序是利用icmp的回复请求来探測远端主机是否可达。(并不能继续推断port是否可达。要想查看port,就要使用扫描器了。)win2000里的网络库里已 经提供网络函数库(icmp.dll)能够实现利用icmp来探測远端主机。相比起使用管道来读ping的结果,或者嵌入ping源代码,这个是最简单的方 法了(没办法,人懒)。ping事实上另一个R选项,用来记录经过的路由,曾经一直不知道。(pingwww.google.com-r
7)记录经过的7个路由器。依照分析,依据所在环境限制最多能够记录8~9个项目。

  除了回显请求外,还能够利用icmp来实现时间请求。在icmp的数据包中能够包括发送时间,目的主机收到后再附上自身当时时间才发回。这样能够做一个时间校验,并能够推断源与目的之间的通讯速度。因为详细的内容部分比較烦,类型太多,一下子记不住各个类型的意思。

  一般用ping的时候仅仅是用了它的最简单的功能:检查主机能不能连到。事实上使用它所提供的其它选项,能够实现很多细节上的控制,比如数据包长度,TTL,路由记录,宽/严路由经过路由等。

时间: 2025-01-12 16:04:38

traceroute工作原理的相关文章

Android ListView工作原理完全解析(转自 郭霖老师博客)

原文地址:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android所有常用的原生控件当中,用法最复杂的应该就是ListView了,它专门用于处理那种内容元素很多,手机屏幕无法展示出所有内容的情况.ListView可以使用列表的形式来展示内容,超出屏幕部分的内容只需要通过手指滑动就可以移动到屏幕内了. 另外ListView还有一个非常神奇的功能,我相信大家应该都体验过,即使在ListView中加载非常非常多的数据,比如达到

LVS集群之工作原理

  首先我们要了解LVS的工作机制: LVS里Director本身不响应请求,只是接受转发请求到后方,Realservers才是后台真正响应请求. LVS 工作原理基本类似DNAT,又不完全相像,它是一种四层交换,默认情况下通过用户请求的地址和端口来判断用户的请求,从而转发到后台真正提供服务的主机,而判断这种请求的是通过套接字来实现,所以四层就可以实现. 而且这个转发的过程对用户而言是透明的(简单的讲,就是用户访问DR的IP,而DR转发给RSS,而用户不知道这个过程) LVS的工作模式: 1.D

47 监控系统基础及zabbix介绍、zabbix工作原理及安装配置、zabbix on CentOS7、zabbix配置

02    zabbix工作原理及安装配置 配置环境 node1192.168.1.120CentOS6.7 node2192.168.1.121CentOS6.7 1.安装配置zabbix #安装前准备 [[email protected] ~]#yum -y install mysql-server mysq [[email protected] ~]# mysql mysql> CREATE DATABASE zabbix CHARACTER SET utf8; mysql> GRANT

inode工作原理及软连接与硬链接

 inode工作原理及软连接,硬链接 inode: 在linux文件系统中,不管什么类型的文件,保存在磁盘分区中时,系统都会分配一个编号,叫做索引节点index node,简称inode inode里面存储了文件的很多参数: 文件类型,权限.UID,GID,属主,属组 链接数(指向这个文件名路径名称个数) 该文件的大小和不同的时间戳 指向磁盘上文件的数据指针 .... 在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)

quarze的工作原理

quartz的工作原理 http://lavasoft.blog.51cto.com/62575/181907/ 几种定时任务的比較 http://blog.sina.com.cn/s/blog_6940cab30101a5pv.html

Java虚拟机工作原理详解

原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 [java] view plaincopy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者其他开发工具中,你保存代码

HashMap工作原理、深入理解JVM、正则

HashMap工作原理: http://www.importnew.com/7099.html: http://blog.csdn.net/ghsau/article/details/16843543: http://blog.csdn.net/ghsau/article/details/16890151. 深入理解JVM: http://www.importnew.com/17770.html: http://www.cnblogs.com/dingyingsi/p/3760447.html.

[Java] SSH框架笔记_SSH三大框架的工作原理及流程

Hibernate工作原理及为什么要用? 原理:1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息3.通过config.buildSessionFactory();//创建SessionFactory4.sessionFactory.openSession();//打

Servlet生命周期和工作原理

Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在下列时刻Servlet容器装载Servlet: 1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码: <loadon-startup>1</loadon-startup&g