随笔 - 23  文章 - 0 评论 - 68 
<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

广告中国绩效网,注册立刻送10元 广告中国绩效网,注册立刻送10元

常用链接

留言簿(7)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

6、ICMP: Internet控制报文协议

I C M P报文通常被I P层或更高层协议( T C P或U D P)使用。I C M P报文是在I P数据报内部被传输的

ICMP不同类型由报文中的类型字段和代码字段来共同决定。可以确定I C M P报文是一份查询报文还是一份差错报文。因为对I C M P差错报

文有时需要作特殊处理,因此我们需要对它们进行区分。例如,在对I C M P差错报文进行响应

时,永远不会生成另一份I C M P差错报文(如果没有这个限制规则,可能会遇到一个差错产生

另一个差错的情况,而差错再产生差错,这样会无休止地循环下去)。当发送一份I C M P差错报文时,报文始终包含I P的首部和产生I C M P差错报文的I P数据报的前8个字节。这样,接收I C M P差错报文的模块就会把它与某个特定的协议(根据I P数据报首部中的协议字段来判断)和用户进程(根据包含在I P数据报前8个字节中的T C P或U D P报文首部中的T C P或U D P端口号来判断)联系起来。

 

7、ping程序

发送回显请求的p i n g程序为客户,而称被p i n g的主机为服务器。大多数的T C P / I P

实现都在内核中直接支持P i n g服务器—这种服务器不是一个用户进程(在第6章中描述的两

种I C M P查询服务,地址掩码和时间戳请求,也都是直接在内核中进行处理的)

I C M P回显请求和回显应答报文如图7 - 1所示。

对于其他类型的I C M P查询报文,服务器必须响应标识符和序列号字段。另外,客户发送

的选项数据必须回显,假设客户对这些信息都会感兴趣。

U n i x系统在实现p i n g程序时是把I C M P报文中的标识符字段置成发送进程的I D号。这样

即使在同一台主机上同时运行了多个p i n g程序实例, p i n g程序也可以识别出返回的信息。序列号从0开始,每发送一次新的回显请求就加1。p i n g程序打印出返回的每个分组的序列号,允许我们查看是否有分组丢失、失序或重复。I P是一种最好的数据报传递服务,因此

这三个条件都有可能发生。

敲入p i n g命令,几秒钟过后会在第1行打印出I P地址, D N S就是利用这段时间来确定主机

名所对应的I P地址。通常,第1个往返时间值要比其他的大。这是由于目的端的硬件地址不在A R P高速缓存中的缘故。在发送第一个回显请求之前要发送一个A R P请求并接收A R P应答,这需要花费几毫秒的时间。

IP首部最长为6 0个字节, 固定长度为2 0字节,R R选项用去3个字节(下面我们再讨论),这样只剩下3 7个字节( 6 0-2 0-3)来存放I P地址清单,也就是说只能存放9个I P地址。I P数据报中的R R选项的一般格式如图所示。

c o d e是一个字节,指明I P选项的类型。对于R R选项来说,它的值为7。l e n是R R选项总字

节长度,在这种情况下为3 9(尽管可以为R R选项设置比最大长度小的长度,但是p i n g程序

总是提供3 9字节的选项字段,最多可以记录9个I P地址。由于I P首部中留给选项的空间有限,

它一般情况都设置成最大长度)。

p t r称作指针字段。它是一个基于1的指针,指向存放下一个I P地址的位置。它的最小值为

4,指向存放第一个I P地址的位置。随着每个I P地址存入清单, p t r的值分别为8,1 2,1 6,最

大到3 6。当记录下9个I P地址后,p t r的值为4 0,表示清单已满。

I P时间戳选项与记录路由选项类似。

8、Traceroute程序

在7 . 3节中,我们描述了I P记录路由选项( R R)。为什么不使用这个选项而另外开发一个

新的应用程序?有三个方面的原因。首先,原先并不是所有的路由器都支持记录路由选项,

因此该选项在某些路径上不能使用( Tr a c e r o u t e程序不需要中间路由器具备任何特殊的或可选的功能)。

其次,记录路由一般是单向的选项。发送端设置了该选项,那么接收端不得不从收到的I P

首部中提取出所有的信息,然后全部返回给发送端。在7 . 3节中,我们看到大多数P i n g服务器的实现(内核中的I C M P回显应答功能)把接收到的R R清单返回,但是这样使得记录下来的I P地址翻了一番(一来一回)。这样做会受到一些限制,这一点我们在下一段讨论( Tr a c e r o u t e程序只需要目的端运行一个U D P模块—其他不需要任何特殊的服务器应用程序)。

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

数的路径。在I P首部选项字段中最多只能存放9个I P地址。在原先的A R PA N E T中这是足够的,

但是对现在来说是远远不够的。

Tr a c e r o u t e程序使用I C M P报文和I P首部中的T T L字段(生存周期)。每个处理数据报的路由器都需要把T T L的值减1或减去数据报在路由器中停留的秒数。由于大多数的路由器转发数据报的时延都小于1秒钟,因此T T L最终成为一个跳站的计数器,所经过的每个路由器都将其值减1。T T L字段的目的是防止数据报在选路时无休止地在网络中流动。

当路由器收到一份I P数据报,如果其T T L字段是0或1,则路由器不转发该数据报(接收到

这种数据报的目的主机可以将它交给应用程序,这是因为不需要转发该数据报。但是在通常

情况下,系统不应该接收T T L字段为0的数据报)。相反,路由器将该数据报丢弃,并给信源

机发一份I C M P“超时”信息。Tr a c e r o u t e程序的关键在于包含这份I C M P信息的I P报文的信源地址是该路由器的I P地址。

我们现在可以猜想一下Tr a c e r o u t e程序的操作过程。它发送一份T T L字段为1的I P数据报给

目的主机。处理这份数据报的第一个路由器将T T L值减1,丢弃该数据报,并发回一份超时

I C M P报文。这样就得到了该路径中的第一个路由器的地址。然后Tr a c e r o u t e程序发送一份

T T L值为2的数据报,这样我们就可以得到第二个路由器的地址。继续这个过程直至该数据报

到达目的主机。但是目的主机哪怕接收到T T L值为1的I P数据报,也不会丢弃该数据报并产生

一份超时I C M P报文,这是因为数据报已经到达其最终目的地。那么我们该如何判断是否已经

到达目的主机了呢?

Tr a c e r o u t e程序发送一份U D P数据报给目的主机,但它选择一个不可能的值作为U D P端口

号(大于30 000),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报

到达时,将使目的主机的U D P模块产生一份“端口不可达”错误(见6 . 5节)的I C M P报文。

这样,Tr a c e r o u t e程序所要做的就是区分接收到的I C M P报文是超时还是端口不可达,以判断什么时候结束。


posted on 2007-10-24 23:09 吴剑 阅读(370) 评论(0)  编辑 收藏 引用 所属分类: TCP/IP学习笔记
只有注册用户登录后才能发表评论。