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

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

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

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

Ping程序

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

Ping程序发送的ICMP回显请求和回显应答报文如下图:

Unix在实现Ping程序时,是把ICMP中的标识字段设置成发送进程的ID号。这样即使在同一台主机上同时运行了多个ping程序,ping程序也可以识别出对应的往返信息。

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

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

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地址清单。

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

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

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

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

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

Traceroute程序

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

Traceroute程序的操作

既然有IP记录路由选项(RR),为什么不使用这个路由选项,而要另外开发一个新的应用程序呢?主要有三个方面的原因,首先,以前并不是所有的路由器都支持记录路由选项,因此该选项在某些路径上不能使用。

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

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

Traceroute程序原理

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

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

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

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

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

时间: 2024-10-24 20:58:44

Ping程序与Traceroute程序的原理(五)的相关文章

TCP/IP详解 卷一(第七、八章 Ping、Traceroute程序)

Ping程序 Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达. 该程序发送一份ICMP回显请求报文给主句,并等待返回ICMP回显应答. ping程序还能测出到这台主机的往返时间 Traceroute程序 Traceroute程序是一个能更深入探索TCP/IP协议的方便可用的工具 Traceroute程序可以让我们看到IP数据报从一台主机传到另一台主机所经过的路由. 下图是书本的一个例子

程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25

程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都是在命令行输入命令进行编译和写入.源文件少的时候还不认为麻烦,当源文件多了,就会认为特别麻烦.有没有简单的方法呢? 当然有,就是用make工具. 1.1.什么是make工具 make是一个命令工具,它解释Makefile中的指令.在Makefile文件里描写叙述了整个project全部文件的编译顺序.编译规则

黑帽seo程序内部链接的分布原理

本文来讲一下内链的分布原理,其实黑帽seo很简单,尤其是当你了解了它的做法原理之后,那么只需要会代码编程就可以实现很多的黑帽seo手法.链接是seo中比较重要的一个内容,今天我们着重讲一下程序内部链接的分布原理. 内部链接指的是网站内的链接,是同一个域名之间的链接,简称内链.如果排除了内容和反链,影响排名的又一因素就是内链,在众多的黑帽SEO程序中,对内部链接都有一个标准.这个标准和正常的网站内链是一样的,如正常网站的栏目页都链接到不同的文章,黑帽SEO程序也是,正常的文章中有相关文章,推荐文章

Traceroute程序

一.原理 Traceroute发送一份UDP数据报给目的主机,但它选择一个不可能的值作为UDP端口号,使得目的主机的任何一个应用程序都不可能使用该端口. 起始时,数据报的TTL字段是1,然后每次把TTl字段依次加1,以确定路径中的每个路由器. 每个路由器在丢弃的UDP数据报时都返回一个ICMP超时报文,而最终主机产生一个ICMP端口不可达的报文. 二.ICMP超时报文格式 ? 三.Traceroute程序 不能保证现在的路由就是将来所采用的路由,甚至连续两份的IP数据报都可能采用不同的路由. 不

Android Content Provider在应用程序之间共享数据的原理分析

本文参考Android应用程序组件Content Provider在应用程序之间共享数据的原理分析http://blog.csdn.net/luoshengyang/article/details/6967204和<Android系统源代码情景分析>,作者罗升阳. 0.总图流程图如下: 总体类图: 1.MainActivity进程向AriticlesProvider进程发送IContentProvider.QUERY_TRANSACTION 如图:第一步 ~/Android/framework

traceroute程序剖析

traceroute允许我们确定IP数据报从本地主机游历到某个远程主机所经过的路径.     我们先来说明tranceroute的工作原理:是IP路由过程中对数据包TTL(Time to Live,存活时间)的处理.当路由器收到一个IP包时,会修改IP包的TTL(及由此造成的头部检测和checksum变化).每收到一个包,检查这个的TTL是否是0或1.如果是,表明这个包还没有到达目的地,而且剩余时间不多了,肯定是到不了目的地了.这样路由器就简单地丢弃这个包,并给源主机发送ICMP通知,说明这个包

Atitit.病毒木马程序的感染&#160;传播扩散&#160;原理

Atitit.病毒木马程序的感染 传播扩散 原理 1. 从木马的发展史考虑,木马可以分为四代 1 2. 木马有两大类,远程控制  vs  自我复制传播1 3. 自我复制2 3.1. 需要知道当前cpu核心数量2 3.2. Cpu占用百分比2 3.3. Io占用百分比2 3.4. 内存占用百分率2 4. 通过email传播扩散3 5. 通过qq等sns im软件传播扩散3 6. Bbs 论坛网站传播扩散3 7. 捆绑下载软件扩散3 8. 局域网扩散感染3 9. 利用系统或软件漏洞: 3 10. 隐

Android应用程序组件Content Provider在应用程序之间共享数据的原理分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用程序是不能直接读写对方的数据文件的,如果它们想共享数据的话,只能通过 Content Provider组件来实现.那么,Content Provider组件又是如何突破应用程序边界权限控制来实现在不同的应用程序之间共享数据的呢?在前面的文章中,我们已经简要介绍过它是通过 Binder进程间通信机制以

TCP/IP详解,卷1:协议--第8章 Traceroute程序

引言 由Van Jacobson编写的Tr a c e r o u t e程序是一个能更深入探索T C P / I P协议的方便可用的工具. 尽管不能保证从源端发往目的端的两份连续的 I P数据报具有相同的路由,但是大多数情况下 是这样的.Tr a c e r o u t e程序可以让我们看到I P数据报从一台主机传到另一台主机所经过的路由. Tr a c e r o u t e程序还可以让我们使用I P源路由选项. 使用手册上说:"程序由Steve Deering提议,由Van Jacobso