ping和traceroute原理分析

ping命令工作原理

ping命令主要是用于检测网络的连通性。

Ping命令发送一个ICMP请求报文给目的IP,然后目的IP回复一个ICMP报文。

原理:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。

因为ping命令是使用ICMP协议,所以没有端口号,但是有两个域:类型和代码。

traceroute工作原理

traceroute是利用ICMP及IP头部的TTL。首先,traceroute送出一个TTL是1的IP数据包(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器收到IP数据包时,将TTL减1。此时,TTL变为0,所以将该路由器会将此IP数据包丢掉,并返回一个ICMP数据包(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),当traceroute收到这个消息后,接着继续发生TTL为2的IP数据包给第二个路由器。以此类推,直到IP数据包达到最后一台路由器时,会返回一个ICMP echo reply的数据包。

traceroute命令与ping命令的区别

PING主要是用来测试网络的连接性,一般能测试出来,特殊情况除外,比如对方的防火墙或路由是拒绝PING但能访问,也是通,只是他拒绝了PING的协议

Traceroute是路由跟踪,比如:Traceroute IP地址或域名。测试出来的结果就是你的主机,到达对方经过了多少台路由

traceroute命令是可以显示信号到达目标经过的各个路由器,从而判断问题所在节点,而Ping命令是检测网络是否畅通的常用命令,两者经常配合使用。一个是反馈各动态或静态路由节点信息,一个是网络通道是否畅通,有无丢包,反应时间

关于ping和trace命令,有2个发现
首先是ping和trace的不同,虽然都是ICMP协议,但是可以有ping过trace不过或者相反的情况
再一个是pc的ping&trace和UNIX/router的不同,曾发生过某些节点前者不能过但后者却能够过的情况,当时也和同事讨论过,也没讨论出个子丑寅卯来

不知道这有啥解释么?

关于你的第一个问题,是很正常的,因为ping和traceroute的原理不同,
对于ping,发送的是一个echorequest包,类型为80,当被ping者接到相关icmp包的时候,根据实际情况,逻辑是,就发 回reply00,逻辑否,则根据具体情况发出一些其他的信息,总结起来的说,是看目的是否能及时的把icmpreply包送回到源,一当路径上 的某个节点把reply包给deny掉了,就肯定ping不通了,比如会是timeout,

下面是对ping的一些debug输出,debugippade100,access-list100permiticmpanyany,

1、这个是ping通的

Sending5,100-byteICMPEchosto192.168.100.1,timeoutis2seconds:
!!!!!
Successrateis100percent(5/5),round-tripmin/avg/max=36/51/68ms
R4(config)#
*Mar100:03:20.579:IP:tableid=0,s=172.16.14.2(local),d=192.168.100.1(Serial1/0),routedviaFIB
*Mar100:03:20.583:IP:s=172.16.14.2(local),d=192.168.100.1(Serial1/0),len100,sending
*Mar100:03:20.587:ICMPtype=8,code=0
*Mar100:03:20.639:IP:tableid=0,s=192.168.100.1(Serial1/0),d=172.16.14.2(Serial1/0),routedviaRIB
*Mar100:03:20.643:IP:s=192.168.100.1(Serial1/0),d=172.16.14.2(Serial1/0),len100,rcvd3
*Mar100:03:20.647:ICMPtype=0,code=0

2、有路由,ping不通的,我在R1上做了如下设置

access-list100denyicmpanyany
access-list100permitipanyany
ints1/0
ipaccess-group100in

然后在R4上dodebugippade100

R4(config)#doping192.168.100.2

Typeescapesequencetoabort.
Sending5,100-byteICMPEchosto192.168.100.2,timeoutis2seconds:
U.U.U
Successrateis0percent(0/5)
R4(config)#dodebugippade100
IPpacketdebuggingison(detailed)foraccesslist100
R4(config)#
R4(config)#
R4(config)#doping192.168.100.2

Typeescapesequencetoabort.
Sending5,100-byteICMPEchosto192.168.100.2,timeoutis2seconds:
U
*Mar100:21:11.031:IP:tableid=0,s=172.16.14.2(local),d=192.168.100.2(Serial1/0),routedviaFIB
*Mar100:21:11.035:IP:s=172.16.14.2(local),d=192.168.100.2(Serial1/0),len100,sending
*Mar100:21:11.039:ICMPtype=8,code=0
*Mar100:21:11.075:IP:tableid=0,s=172.16.14.1(Serial1/0),d=172.16.14.2(Serial1/0),routedviaRIB
*Mar100:21:11.079:IP:s=172.16.14.1(Serial1/0),d=172.16.14.2(Serial1/0),len56,rcvd3
*Mar100:21:11.083:ICMPtype=3,code=13-----tcp/ip上看出,313代码暗示着由于过滤,通讯被禁止

下面是有路由,因为reply包被deny而timeout的,

我把R1上的acl设置改成

access-list100denyicmpanyany
access-list100permitipanyany
ints1/0
ipaccess-group100out


R4(config)#doping192.168.100.2

Typeescapesequencetoabort.
Sending5,100-byteICMPEchosto192.168.100.2,timeoutis2seconds:

*Mar100:25:15.735:IP:tableid=0,s=172.16.14.2(local),d=192.168.100.2(Serial1/0),routedviaFIB
*Mar100:25:15.735:IP:s=172.16.14.2(local),d=192.168.100.2(Serial1/0),len100,sending
*Mar100:25:15.735:ICMPtype=8,code=0.

总结起来,ping能否成功有三个必要条件,1、互相有到达对端的路由,2、echo包没被禁止,3、别timeout掉(这个实验不好做,本来想通过设置timeout时间为10ms来做,哈哈,最小是1s.)

对于traceroute,本质可以理解为hopbyhop的ping,但这个ping和上面讲的ping不一样,这个ping和我们的 ping命令不同,traceroute包发出去后,途经的每个站点都会发回一个类型代码为110的icmp包回去,到了终点,才回发送一个代码为 33的icmp包回到源,下面是一个traceroute的debug输出

R4(config)#dotracer192.168.100.2

Typeescapesequencetoabort.
Tracingtherouteto


*Mar100:47:11.567:IP:tableid=0,s=172.16.14.2(local),d=192.168.100.2(Serial1/0),routedviaFIB
*Mar100:47:11.571:IP:s=172.16.14.2(local),d=192.168.100.2(Serial1/0),len28,sending
*Mar100:47:11.571:UDPsrc=49234,dst=33434
*Mar100:47:11.599:IP:tableid=0,s=172.16.14.1(Serial1/0),d=172.16.14.2(Serial1/0),routedviaRIB
*Mar100:47:11.603:IP:s=172.16.14.1(Serial1/0),d=172.16.14.2(Serial1/0),len56,rcvd3
*Mar100:47:11.607:ICMPtype=11,code=0
*Mar100:47:20.643:IP:tableid=0,s=172.16.14.2(local),d=192.168.100.2(Serial1/0),routedviaFIB
*Mar100:47:20.643:IP:s=172.16.14.2(local),d=192.168.100.2(Serial1/0),len28,sending
*Mar100:47:20.647:UDPsrc=49235,dst=33435
*Mar100:47:20.707:IP:tableid=0,s=172.16.14.1(Serial1/0),d=172.16.14.2(Serial1/0),routedviaRIB
*Mar100:47:20.711:IP:s=172.16.14.1(Serial1/0),d=172.16.14.2(Serial1/0),len56,rcvd3
*Mar100:47:20.715:ICMPtype=11,code=0
*Mar100:47:20.719:IP:tableid=0,s=172.16.14.2(local),d=192.168.100.2(Serial1/0),routedviaFIB
*Mar100:47:20.723:IP:s=172.16.14.2(local),d=192.168.100.2(Serial1/0),len28,sending
*Mar100:47:20.723:UDPsrc=49236,dst=33436
*Mar100:47:20.767:IP:tableid=0,s=172.16.14.1(Serial1/0),d=172.16.14.2(Serial1/0),routedviaRIB
*Mar100:47:20.771:IP:s=172.16.14.1(Serial1/0),d=172.16.14.2(Serial1/0),len56,rcvd3
*Mar100:47:20.775:ICMPtype=11,code=0

*Mar100:47:20.783:IP:tableid=0,s=172.16.14.2(local),d=192.168.100.2(Serial1/0),routedviaFIB
*Mar100:47:20.787:IP:s=172.16.14.2(local),d=192.168.100.2(Serial1/0),len28,sending
*Mar100:47:20.791:UDPsrc=49237,dst=33437
*Mar100:47:20.867:IP:tableid=0,s=172.16.123.2(Serial1/0),d=172.16.14.2(Serial1/0),routedviaRIB
*Mar100:47:20.871:IP:s=172.16.123.2(Serial1/0),d=172.16.14.2(Serial1/0),len56,rcvd3
*Mar100:47:20.875:ICMPtype=3,code=3
*Mar100:47:26.903:IP:s=192.168.100.4(Loopback0),d=255.255.255.255,len71,unroutable
*Mar100:47:26.903:UDPsrc=57768,dst=53172.16.123.2
*Mar100:47:29.907:IP:tableid=0,s=172.16.14.2(local),d=192.168.100.2(Serial1/0),routedviaFIB
*Mar100:47:29.907:IP:s=172.16.14.2(local),d=192.168.100.2(Serial1/0),len28,sending
*Mar100:47:29.911:UDPsrc=49238,dst=33438
*Mar100:47:29.987:IP:tableid=0,s=172.16.123.2(Serial1/0),d=172.16.14.2(Serial1/0),routedviaRIB
*Mar100:47:29.991:IP:s=172.16.123.2(Serial1/0),d=172.16.14.2(Serial1/0),len56,rcvd3
*Mar100:47:29.995:ICMPtype=3,code=3

从输出中可以验证一些东西,比如traceroute进程每跳发出三个探测包,上面也是

中途站点R1的debug输出


R1(config)#dodebugippade100
IPpacketdebuggingison(detailed)foraccesslist100
R1(config)#
*Mar100:47:20.311:IP:tableid=0,s=172.16.14.1(local),d=172.16.14.2(Serial1/0),routedviaFIB
*Mar100:47:20.315:IP:s=172.16.14.1(local),d=172.16.14.2(Serial1/0),len56,sending
*Mar100:47:20.319:ICMPtype=11,code=0
*Mar100:47:29.387:IP:tableid=0,s=172.16.14.1(local),d=172.16.14.2(Serial1/0),routedviaFIB
*Mar100:47:29.391:IP:s=172.16.14.1(local),d=172.16.14.2(Serial1/0),len56,sending
*Mar100:47:29.395:ICMPtype=11,code=0
*Mar100:47:29.467:IP:tableid=0,s=172.16.14.1(local),d=172.16.14.2(Serial1/0),routedviaFIB
*Mar100:47:29.471:IP:s=172.16.14.1(local),d=172.16.14.2(Serial1/0),len56,sending
*Mar100:47:29.475:ICMPtype=11,code=0

目的站点R2的输出

R2(config)#dounall
Allpossibledebugginghasbeenturnedoff
R2(config)#dodebugippade100
IPpacketdebuggingison(detailed)foraccesslist100
R2(config)#
*Mar100:53:49.315:IP:s=172.16.14.2(Serial1/2.1),d=192.168.100.2,len28,rcvd0
*Mar100:53:49.319:UDPsrc=49251,dst=33437
*Mar100:53:49.319:IP:tableid=0,s=172.16.123.2(local),d=172.16.14.2(Serial1/2.1),routedviaFIB
*Mar100:53:49.323:IP:s=172.16.123.2(local),d=172.16.14.2(Serial1/2.1),len56,sending
*Mar100:53:49.327:ICMPtype=3,code=3
R2(config)#
*Mar100:53:58.447:IP:s=172.16.14.2(Serial1/2.1),d=192.168.100.2,len28,rcvd0
*Mar100:53:58.451:UDPsrc=49252,dst=33438
*Mar100:53:58.455:IP:tableid=0,s=172.16.123.2(local),d=172.16.14.2(Serial1/2.1),routedviaFIB
*Mar100:53:58.455:IP:s=172.16.123.2(local),d=172.16.14.2(Serial1/2.1),len56,sending
*Mar100:53:58.459:ICMPtype=3,code=3
*Mar100:53:58.587:IP:s=172.16.14.2(Serial1/2.1),d=192.168.100.2,len28,rcvd0
*Mar100:53:58.591:UDPsrc=49253,dst=33439

由此可以看出,一样的道理,在中间站点上只要禁止代码110的icmp包输出,那么traceroute的输出中,关于那个站点就是*号了,或者 在路上把代码为33的禁止掉,一样会traceroute不通,而此时,ping通是一点问题都没有的,因为ping没有用到这些类型的icmp包, 具体实验就不做了,时间紧张。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值