读书笔记六:TCP/IP详解之ICMP:Internet控制报文协议、Ping应用、Traceroute应用


ICMP:Internet控制报文协议的介绍

前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。

当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机。给主机一个处理错误的机会,这 也就是为什么说建立在IP层以上的协议是可能做到安全的原因。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前 16bit就组成了ICMP所要传递的信息。

ICMP报文被封装在IP数据报中。类型字段可以有15个不同的值。检验和字段覆盖整个ICMP报文,ICMP的检验和是必需的 

ICMP报文的类型

 不同类型的ICMP报文由类型字段和代码字段来共同决定。

尽管在大多数情况下,错误的包传送应该给出ICMP报文,但是在特殊情况下,是不产生ICMP错误报文的。如下

  1. ICMP差错报文不会产生ICMP差错报文(防止IMCP的无限产生和传送)
  2. 目的地址是广播地址或多播地址的IP数据报。
  3. 作为链路层广播的数据报。
  4. 不是IP分片的第一片。
  5. 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址。

以上规则是为了防止产生ICMP报文广播风暴。

ICMP协议大致分为两类

一种是查询报文,一种是差错报文。

查询报文有以下几种用途:

  1. ping查询(不要告诉我你不知道ping程序)--下面有详细介绍
  2. 子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)
  3. 时间戳查询(可以用来同步时间)

而差错报文则产生在数据传送发生错误的时候。

ICMP地址掩码请求与应答

ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的ICMP请求报文(这一过程与无盘系统在引导过程中用RARP获取I P地址是类似的)。无盘系统获取子网掩码的另一个方法是 BOOTP协议。

ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。

这样,发送端就可以把应答与请求进行匹配。

ICMP时间戳请求与应答

ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间( Coordinated Universal Time, UTC )

ICMP差错报文

ICMP差错报文包含产生该差错报文的数据报IP首部,并至少包含该IP首部后面的前8个字节. 
(1)IP首部包含协议字段,使ICMP知道如何解析后面的8个字节. 
(2)IP首部后面的前8个字节实际为TCP或UDP首部的一部分,包含了源端口和目的端口号. 
通过协议和端口号即可把ICMP差错报文返回给用户进程进行处理。

ICMP的应用--ping

ping可以说是ICMP的最著名的应用,当我们某一个网站上不去的时候。通常会ping一下这个网站。ping会回显出一些有用的信息。一般的信息如下:

ping这个单词源自声纳定位,而这个程序的作用也确实如此,它利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0的ICMP发请求,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。我们可以看到, ping给出来了传送的时间和TTL的数据。

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

【总结】ping是对两个TCP/IP系统连通性进行测试的基本工具,它只利用ICMP回显请求和回显应答报文,而不用经过传输层。

 Ping的原理和流程再述 

(Ping实际上利用的就是ICMP ECHO和ICMP ECHO REPLY包来探测主机是否存在,所以Ping程序的流程十分简单:发送ICMP ECHO包---- > 接收ICMP ECHO REPLY包)
ping还给我们一个看主机到目的主机的路由的机会。这是因为,ICMP的ping请求数据报在每经过一个路由器的时候,路由器都会把自己的ip放到该数 据报中。而目的主机则会把这个ip列表复制到回应icmp数据包中发回给主机。但是,无论如何,ip头所能纪录的路由列表是非常的有限。如果要观察路由, 我们还是需要使用更好的工具,就是要讲到的Traceroute(windows中cmd对应tracert)。

ICMP的应用--Traceroute

 Traceroute的简介 

 Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。前面说到,尽管ping工具也可以进行侦测,但是,因为ip头的限制,ping不能完全的记录下所经过的路由器。所以Traceroute正好就填补了这个缺憾。

(尽管不能保证从源端发往目的端的两份连续的IP数据报具有相同的路由,但是大多数情况下是这样的。)

Traceroute程序还可以让我们使用IP源路由选项。

 Traceroute程序的操作 

traceroute程序使用ICMP报文和IP首部的TTL字段来实现。

traceroute程序使用ICMP报文和IP首部的TTL字段来实现。

运行原理: 
(1)首先发送TTL为1的IP数据报给目标地址,处理这个IP数据报的第一个路由器把TTL减1为0,丢弃该数据报,并返回一份超时ICMP报文,由此得到第一个路由器的IP(入口IP).

(2)再次发送TTL为2的IP数据报给目标地址,第二个路由器把TTL减1为0,步骤同上,通过返回的超时ICMP报文,得到了第二个路由器的IP地址.

(3)然后依次发送TTL为3,4…n的数据报,分别记录返回的超时ICMP报文的IP,即对应跳的路由IP.

(4)最终达到目标地址.判断依据:发送的IP数据报封装的为UDP数据报,【选择的是一个不可能使用的UDP端口】,当到达目标地址时,目标地址将返回’端口不可达’的ICMP报文,而不是路由返回的超时ICMP报文.

有两种不同的ICMP“超时”报文,它们的code字段不同。一种是在TTL值等于0时产生的,其code字段为0,另一种是主机在组装分片时发生超时而发送的“组装报文超时”报文,其code字段为1.

 IP源站选路选项 

 源站选路的思想是由发送者指定路由,它有两种形式:

  • 严格的源路由选择,发送端指明IP数据报所必须采用的确切路由,如果发现下一个指定的路由器不在其直接连接的网络上,就返回一个“源站路由失败”的ICMP差错报文。

  • 宽松的源站选路,可以指明一个数据报经过的IP地址清单。

posted @ 2017-08-04 16:35  繁星的夜空2012  阅读(182)  评论(0编辑  收藏  举报