zoukankan      html  css  js  c++  java
  • 关于ping与traceroute的工作原理及注意事项

    1.ping命令

    ping作为网络相关命令中使用频率最高的程序之一,主要用于确定网络间的连通性,这对确定网络是否连接,以及网络连接的状况十分有用。简单来说,ping就是一个测试程序,如果运行正确,大体上就可以排除网络访问层、网卡、Modem的输入输出线路、电缆和路由器等存在的故障,从而缩小问题的范围。

    ping以毫秒为单位显示发送到返回应答之间的时间量。如果应答时间短,表示数据报不必通过太多的路由器或网络,连接速度比较快

     

    1)命令格式

     

    一般情况下,用户可以通过使用一系列的ping命令来查找问题出在什么地方,或检验网络运行的情况。

    ①ping 127.0.0.1

    如果测试成功,表明网卡、TCP/IP协议的安装、IP地址、子网掩码的设置正常。如果测试不成功,就表示TCP/IP的安装或设置存在有问题。

    ②ping 本机IP

    如果测试不成功,则表示本地配置或安装存在问题,应当对网络设备和通讯介质进行测试、检查并排除。

    ③ping局域网内其他IP

    如果测试成功,表明本地网络中的网卡和载体运行正确。但如果收到0个回送应答,那么表示子

    ④ping 网关IP

    这个命令如果应答正确,表示局域网中的网关路由器正在运行并能够做出应答。

    ⑤ping 远程IP

    如果收到正确应答,表示成功的使用了缺省网关。对于拨号上网用户则表示能够成功的访问Internet.

    如果上面所列出的所有ping命令都能正常运行,那么计算机进行本地和远程通信基本上就没有问题了。网掩码不正确或网卡配置错误或电缆系统有问题。

    例如在上图中我ping了百度的服务器(如果是windows则默认获取4次),64代表数据包的大小,单位字节(byte),icmp_seq指ICMP报文的序列号,ttl即Time To Live,生存时间的意思,该字段指定IP包被路由器丢弃之间允许通过的最大网段数量,因为现在绝大多数路由器的消耗时间都小于1s,而时间小于1s就当1s计算,所以数据包每经过一个路由器节点TTL都减一,后面讲到traceroute时还要提到。

     

    2)工作原理

    ping作为定位网络通不通的一个重要手段,是基于ICMP协议来工作的。

    ICMP即Internet控制报文协议(Internet Control Message Protocol),是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制信息,具体有网络通不通、主机是否可达、路由是否可用等网络本身的消息,这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。简单来说,ping命令会发送一份ICMP回显请求报文给目标主机,并等待主机返回ICMP回显应答。因为ICMP协议会要求目标主机在收到消息之后,必须返回ICMP应答消息给源主机,如果源主机在一定时间内收到了目标主机的应答,则表明两台主机之间网络是可达的。

    举个例子,假设有两台主机A和B,现在我们要监测两台主机网络是否可达,那么我们在主机A上那么我们在主机A上输入命令:ping B的IP,此时,ping命令会在主机A上构建一个 ICMP的请求数据包,然后 ICMP协议会将这个数据包以及目标IP等信息一同交给IP层协议。

    IP层协议得到这些信息后,将源IP地址、目标IP地址、再加上一些其它的控制信息,构建成一个IP数据包。IP数据包构建完成后,还需要加上MAC地址,因此,还需要通过ARP映射表找出目标IP所对应的MAC地址。

    当拿到了目标主机的MAC地址和本机MAC后,一并交给数据链路层,组装成一个数据帧,依据以太网的介质访问规则,将它们传送出去。

    当主机B收到这个数据帧之后,会首先检查它的目标MAC地址是不是本机,如果是就接收下来处理,接收之后会检查这个数据帧,将数据帧中的IP数据包取出来,交给本机的IP层协议,然后IP层协议检查完之后,再将ICMP数据包取出来交给ICMP协议处理,当这一步也处理完成之后,就会构建一个ICMP应答数据包,回发给主机A。

    在一定的时间内,如果主机A收到了应答包,则说明它与主机B之间网络可达,如果没有收到,则说明网络不可达。除了监测是否可达以外,还可以利用应答时间和发起时间之间的差值,计算出数据包的延迟耗时。

     

    3)单向ping通问题

    我们知道,主机A收到了主机B的一个应答包,说明两台主机之间的去、回通路正常,也就是说,无论由A到B还是由B到A,都是正常的,可是有的时候我们可能会遇到一些特殊原因导致只能单方面ping通的情况,这可能是由于:

    ①对方确实存在,但设置了ICMP数据包过滤(比如防火墙设置)

    在共享上网的机器中,出于安全考虑,大部分作为服务器的主机都安装了个人防火墙软件,而其他作为客户机的机器则一般不安装。几乎所有的个人防火墙软件,默认情况下是不允许其他机器Ping本机的。一般的做法是将来自外部的ICMP请求报文滤掉,但它却对本机出去的ICMP请求报文,以及来自外部的ICMP应答报文不加任何限制。这样,从本机Ping其他机器时,如果网络正常,就没有问题。但如果从其他机器Ping这台机器,即使网络一切正常,也会出现“Request timed out”的错误。大部分的单方向Ping通现象源于此。解决的办法也很简单,根据你自己所用的不同类型的防火墙,调整相应的设置即可。

    ②错误设置IP地址

    正常情况下,一台主机应该有一个网卡,一个IP地址,或多个网卡,多个IP地址(这些地址一定要处于不同的IP子网)。但对于在公共场所使用的电脑,特别是网吧,曾有一次两台电脑也出现了这种单方向Ping通的情况,经过仔细检查,发现其中一台电脑的“拨号网络适配器”(相当于一块软网卡)的TCP/IP设置中,设置了一个与网卡IP地址处于同一子网的IP地址,这样,在IP层协议看来,这台主机就有两个不同的接口处于同一网段内。当从这台主机Ping其他的机器时,会存在这样的问题: 
    (1)主机不知道将数据包发到哪个网络接口,因为有两个网络接口都连接在同一网段; 
    (2)主机不知道用哪个地址作为数据包的源地址。因此,从这台主机去Ping其他机器,IP层协议会无法处理,超时后,Ping 就会给出一个“超时无应答”的错误信息提示。但从其他主机Ping这台主机时,请求包从特定的网卡来,ICMP只须简单地将目的、源地址互换,并更改一些标志即可,ICMP应答包能顺利发出,其他主机也就能成功Ping通这台机器了。

     

    2.traceroute命令

    上面提到发送数据包要经过多少个路由器,那么路由器是什么意思呢?这里就不得不说到traceroute命令(windows下为tracert)了,通过这个命令我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点到达某一同样的目的地走的路径可能会不太一样,但基本上来说大部分时候所走的路由是相同的。

    traceroute利用ICMP协议定位您的计算机和目标计算机之间所有的路由器,TTL值可以反映数据包经过的路由器或网关的数量,通过操纵独立ICMP请求报文的TTL值和观察该报文被抛弃的返回信息,traceroute命令能够遍历到数据包传输路径上的所有路由器。另外,traceroute是一条缓慢的命令,因为每经过一台路由器都要花去大约10s到15s的时间。

    1)命令格式

    traceroute [options] <IP-address or domain-name> [data size]

     由于traceroute的option众多,这里只列出几条常用命令:

    Options:

    -4                                   IPv4

    -n                                   用数字显示地址

    -v                                   长输出     

    -p                                   UDP端口设置

    -q                                   设置TTL测试数目(缺省为3)

    -t                                    设置测包的服务类型

    2)工作原理

    traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。尽管ping工具也可以进行侦测,但是,因为ip头的限制,ping不能完全的记录下所经过的路由器,所以traceroute正好就填补了这个缺憾。traceroute首先给目的主机发送一个TTL=1的UDP数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL减1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2的UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器ip。从而避开了ip头只能记录有限路由IP的问题。有人要问,我怎么知道UDP到没到达目的主机呢?这就涉及一个技巧的问题,TCP和UDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较小的端口,比如说80,比如说23,等等。而traceroute发送的是端口号大于30000的UDP报文,所以到达目的主机的时候,目的主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告以后就知道,主机到了。

    3)注意事项

    正如前面提到的单向ping通问题一样,并不是所有网关都会如实返回ICMP超时报文。出于安全性考虑,大多数防火墙以及启用了防火墙功能的路由器缺省配置为不返回各种ICMP报文,其余路由器或交换机也可能被管理员主动修改配置变为不返回 ICMP报文。因此traceroute程序不一定能拿到所有的沿途网关地址。所以,当某个TTL值的数据包得不到响应时,并不能停止这一追踪过程,程序仍然会把TTL递增而发出下一个数据包。这个过程将一直持续到数据包发送到目标主机,或者达到默认或用参数指定的追踪限制(maximum_hops)才结束追踪。依据上述原理,利用了UDP数据包的traceroute程序在数据包到达真正的目的主机时,就可能因为该主机没有提供UDP服务而简单将数据包抛弃,并不返回任何信息。为了解决这个问题,traceroute故意使用了一个大于30000的端口号,因UDP协议规定端口号必须小于30000,所以目标主机收到数据包后唯一能做的事就是返回一个“端口不可达”的ICMP报文,于是主叫方就将端口不可达报文当作跟踪结束的标志。

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

  • 相关阅读:
    大数据【一】集群配置及ssh免密认证
    安卓测试【三】adb简单命令及monkey使用
    安卓测试【二】eclipse离线安装ADT
    初始化对象的知识细节
    安卓测试【一】android sdk环境变量配置
    自动化测试用例排序(三个算法随机、贪心、额外贪心)
    java实现文件复制粘贴功能
    Javsssist用InsertAt()方法对语句插桩
    Javassist进行方法插桩
    JUnit手动设计测试方法以及与Randoop的自动生成测试的比较
  • 原文地址:https://www.cnblogs.com/seanloveslife/p/11941736.html
Copyright © 2011-2022 走看看