traceroute工作原理[通俗易懂]

traceroute工作原理[通俗易懂]traceroute,也就是traceroute,跟踪路由。这个程序最早是VanJacobson实现的。源代码在网上能够找到,只是我还没有去找。基本的原理是IP路由过程中对数据包TTL(Tim

大家好,又见面了,我是你们的朋友全栈君。

 
  
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选项,用来记录经过的路由,曾经一直不知道。(ping
www.google.com-r 7)记录经过的7个路由器。依照分析,依据所在环境限制最多能够记录8~9个项目。

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

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154934.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 雷达系统导论_雷达信号处理基础第二版

    雷达系统导论_雷达信号处理基础第二版1.3.3接收机单个散射体的回波波形具有下面的形式:其中,幅度调制A(t)仅仅表示脉冲的包络。接收机处理的主要功能是将雷达信号中承载信息的部分变换到基带,目的是测量。接收机的信号被分到两个通道。为同相“I”通道,在这个通道中接收信号和振荡器(本振)的信号进行混频。这个混频产生了和频和差…

    2022年10月21日
  • charls使用笔记[通俗易懂]

    charls使用笔记[通俗易懂]一、https请求:PC端:1.安装charlesca证书选择help|InstallCharlesCASSLCertificate然后会弹出证书信息,选择安装证书,下一步,将证

  • Java 多线程:彻底搞懂线程池

    熟悉Java多线程编程的同学都知道,当我们线程创建过多时,容易引发内存溢出,因此我们就有必要使用线程池的技术了。

  • SQL Server 下载安装教程

    SQL Server 下载安装教程SQLServer2017下载安装教程第一步:打开浏览器,在浏览的搜索框中我们输入“SQLServer”。如图,会匹配出中文两条微软官方下载页面(一个页面内容是英文、一个页面内容是中文)。这里我们以中文的为例。第二步:点击进入下载页面后,可以看到如图所示页面,我们不要着急点击下载,因为这些SQLServer只能试用180天(大家从介绍中可以看到)。第三步:我们将网页下滑,可以看到…

  • hdu 4268 Alice and Bob(multiset|段树)

    hdu 4268 Alice and Bob(multiset|段树)

  • js取整数四舍五入「建议收藏」

    js取整数四舍五入「建议收藏」1.丢弃小数部分,保留整数部分parseInt(5/2)2.向上取整,有小数就整数部分加1 Math.ceil(5/2)3,四舍五入.Math.round(5/2)4,向下取整 Math.floor(5/2)Math对象的方法FF:Firefox,N:Netscape,IE:InternetExplorer方法描述FF

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号