读书笔记六: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错误报文的。如下
- ICMP差错报文不会产生ICMP差错报文(防止IMCP的无限产生和传送)
- 目的地址是广播地址或多播地址的IP数据报。
- 作为链路层广播的数据报。
- 不是IP分片的第一片。
- 源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地 址或多播地址。
以上规则是为了防止产生ICMP报文广播风暴。
ICMP协议大致分为两类
一种是查询报文,一种是差错报文。
查询报文有以下几种用途:
- ping查询(不要告诉我你不知道ping程序)--下面有详细介绍
- 子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)
- 时间戳查询(可以用来同步时间)
而差错报文则产生在数据传送发生错误的时候。
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地址清单。