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
吴剑 阅读(367)
评论(0) 编辑 收藏 引用 所属分类:
TCP/IP学习笔记