程序员人生 网站导航

Ping程序与Traceroute程序的原理(五)

栏目:服务器时间:2014-12-10 09:01:39

(参考文献)TCP/IP详解,卷1:协议

“ping”这个名字来源于声呐定位操作。目的是为了测试另外1台主机是不是可以到达。该程序发送1份ICMP回显要求报文给主机,并等待返回ICMP回显应对。

1般来讲,如果不能ping到某台主机那末就不能Telnet或FTP到那台主机。反过来,如果不能Telnet到某台主机,那末通常可以用ping程序来肯定问题出在哪里。Ping程序还能测出到这台主机的来回时间,以表明该主机离我们有“多远”。

Ping程序

我们称发送回显要求的ping为客户,而被ping的主机称为服务器。大多数的TCP/IP实现都在内核中直接支持ping服务器

Ping程序发送的ICMP回显要求和回显应对报文以下图:


Unix在实现Ping程序时,是把ICMP中的标识字段设置成发送进程的ID号。这样即便在同1台主机上同时运行了多个ping程序,ping程序也能够辨认出对应的来回信息。

序列号从0开始,每发送1次新的回显要求就加1。Ping程序打印出返回的每一个分组的序列号,允许我们查看是不是有分组丢失、失序或重复。IP是1种尽力而为的数据报传输服务,因此这3个条件都有可能产生。

在局域网运行ping程序1般输出以下格式:

64 bytes from 192.168.8.1: icmp_req=1 ttl=64 time=1.04 ms
64 bytes from 192.168.8.1: icmp_req=2 ttl=64 time=1.05 ms
64 bytes from 192.168.8.1: icmp_req=3 ttl=64 time=1.06 ms
64 bytes from 192.168.8.1: icmp_req=4 ttl=64 time=1.41 ms
64 bytes from 192.168.8.1: icmp_req=5 ttl=64 time=1.41 ms
64 bytes from 192.168.8.1: icmp_req=6 ttl=64 time=1.20 ms
64 bytes from 192.168.8.1: icmp_req=7 ttl=64 time=1.42 ms
64 bytes from 192.168.8.1: icmp_req=8 ttl=64 time=0.649 ms

当返回ICMP回显应对时,要打印出序列号和TTl,并计算来回时间。Ping程序通过在ICMP报文中寄存发送要求的时间值来计算来回时间。当应对返回时,用当前时间减去寄存在ICMP报文中的时间值,及是来回时间。

IP记录路由选项


Ping程序为我们提供了查看IP记录路由(RR)选项的机会。大多数不同版本的Ping程序都提供-R选项,以提供记录路由的功能。它使得Ping程序在发送出去的IP数据报中设置IP RR选项(该IP数据报包括ICMP回显要求报文)。这样,每一个处理该数据报的路由都把他的IP地址放入选项字段中。当数据报到达目的端时,,IP地址清单应当复制到ICMP回显应对中。这样返回途中所经过的路由器地址也被加入到清单中,当Ping程序收到回显应对时,他就打印出这份IP地址清单。

这个进程听起来很简单,但存在1些缺点。源端主机生成RR选项,中间路由器对RR选项的处理,和把ICMP回显要求中的RR清单复制到ICMP应对中,所有这些都是选项功能。荣幸的是,现在大多数路由器都支持这些选项功能,只有1些系统不把ICMP要求中的IP清单复制到ICMP应对中。

但是,最大的问题是IP首部中只有有限的空间来寄存IP地址。在以上图中,我们可以看到,IP首部长度字段只有4bit,因此全部IP首部最长只能包括15个32bit长的字(及60个字节)。由于ip首部固定长度为20字节,RR宣明星用去3个字节,这样只剩下37个字节来寄存IP地址清单(60⑵0⑶),也就是说只能寄存9个IP地址。

IP数据报中的RR选项格式以下:


Traceroute原理
Code是1个字节,指明IP选项的类型。对应RR选项来讲,他的值为7.len是RR选项总字节长度,在这类情况下为39.(虽然可以为RR选项在、设置比最大长度小的长度,但是Ping程序总是提供39字节的选项字段,最多可以记录9个IP地址,由于IP首部留给选项的空间有限,他1般情况下都设置成最大长度)

    Ptr称作指针字段。他是1个基于1的指针,他指向寄存下1个IP地址的位置,他的最小值为4,指向寄存第1个IP地址的位置,随着每一个IP地址存入清单,prt的值分别为8、12最大到36.当记录下9个IP地址以后,ptr的值为40,表示清单已满。

 

Traceroute程序

Traceroute程序可让我们看到IP数据报从以太主机传到另外1台主机所经过的路由。

Traceroute程序的操作

既然有IP记录路由选项(RR),为何不使用这个路由选项,而要另外开发1个新的利用程序呢?主要有3个方面的缘由,首先,之前其实不是所有的路由器都支持记录路由选项,因此该选项在某些路径上不能使用。

其次,记录路由1般是单项的选项。发送端设置了该选项,那末接收端不能不从收到的IP首部中提取出所有的信息,然后全部返回给发送端。大多数Ping服务器的实现把接收到的RR清单返回但是这样使得记录下来的IP地址翻了1番。

最后1个缘由也是最主要的缘由,IP首部中留给选项的空间有限,不能寄存当前大多数的路径。

Traceroute程序原理

Traceroute程序使用ICMP报文和和IP首部中的TTL字段(生存周期)。

每一个处理数据报的路由器都要把TTL的值减去1或减去数据报在路由器中停留的秒数。由于大多数的路由器转发数据报的延时都小于1秒钟,因此TTL终究成为1个跳站的计数器,所经过的每一个路由器都将其值减1.

TTL字段的目的是避免数据报在选路时无停止的在网络中活动。例如,当路由器瘫痪或两个路由器之间的连接丢失时,选路协议有时回去检查丢失的路由器并1直进行下去。TTL字段就是在这些寻暖传递的数据报上加上1个生存上限。

当路由器收到1份IP数据报,如果TTL字段是0或1,则路由器不转发该数据报(接收到这类数据报的目的主机可以将它交给利用程序,这是由于不需要转发该数据报。但是,在通常情况下系统不应当接收TTL字段为0的数据报)。通常情况下是,路由器将该数据报抛弃,并给信源主机发送1份ICMP超时信息。Tracerouter程序的关键在于,这份ICMP超时信息包括了该路由器的地址。

那末,Tracerouter就通过发送1份TTL字段为1的IP数据报给目的主机。处理这份数据报的第1个路由器将TTL值减去1,抛弃该数据报,并回发1份超时ICMP报文。这样就得到了该路径中的第1个路由器的IP地址。然后Tracerouter发送1份TTL为2的数据报,这样就得到了第2个路由器的IP地址。那末,继续这个进程,直到到达目的主机。即便目的主机接收到1份TTL值为1的数据报也不会抛弃该数据报并产生1份ICMP报文,由于已到达终究目的地。这个时候,Tracerouter程序发送1份UDP数据报给目的主机,但选择1个不可能的值作为目的端口号(大于30000),使得目的主机的任何1个程序都不可能使用该端口。由于,当该数据报到达时,将使目的主机的UDP模块产生1份“端口不可达”毛病的ICMP报文,这样Tracerouter程序要做的就是辨别搜到的ICMP报文是是超时还是端口不可达,以判断甚么时候结束。


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐