TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute

来源:互联网 发布:it heard 编辑:程序博客网 时间:2024/05/20 17:58

1.ICMP协议介绍

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

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

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

1.   ICMP差错报文不会产生ICMP差错报文(除ICMP查询报文)(防止ICMP的无限产生和传送);

2.   目的地址是广播地址或多播地址的IP数据报;

3.   作为链路层广播的数据报;

4.   不是IP分片的第一片;

5.   源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。

所有的这一切规定,都是为了防止产生ICMP报文的无限传播而定义的

ICMP协议大致分为两类,一种是查询报文,一种是差错报文。其中查询报文有以下几种用途:

1.   ping查询

2.   子网掩码查询(用于无盘工作站在初始化自身的时候初始化子网掩码)

3.   时间戳查询(可以用来同步时间)

其中子网掩码查询报文和时间戳查询报文中都有2B的标识符和序列号:

标识符:发送端应用程序在标志段内存入一个唯一的值,以区别于其他进程的应答;

序列号:使的客户程序可以在应答和请求之间进行匹配。

而差错报文则产生在数据传送发生错误的时候。就不赘述了。

2.ICMP的应用--ping

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

Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255
Reply from 10.4.24.1: bytes=32 time<1ms TTL=255

Ping statistics for 10.4.24.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

ping这个单词源自声纳定位,而这个程序的作用也确实如此,它利用ICMP协议包来侦测另一个主机是否可达。原理是用类型码为0ICMP发请求,受到请求的主机则用类型码为8ICMP回应。Ping只利用ICMP回显请求和回显应答报文,而不用经过传输层(TCP/IP)ping服务一般在内核中实现ICMP的功能。ping程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。我们可以看到, ping给出来了传送的时间和TTL的数据。我给的例子不太好,因为走的路由少,有兴趣地可以ping一下国外的网站比如sf.net,就可以观察到一些丢包的现象,而程序运行的时间也会更加的长。
ping
还给我们一个看主机到目的主机的路由的机会。这是因为,ICMPping请求数据报在每经过一个路由器的时候,路由器都会把自己的ip放到该数据报中。而目的主机则会把这个ip列表复制到回应ICMP数据包中发回给主机。但是,无论如何,ip头所能纪录的路由列表是非常的有限(60(首部最大长度)-20(首部固定长度)-3(RR选项占用)=37,最多9IP地址)如果要观察路由,我们还是需要使用更好的工具,就是要讲到的Traceroute(windows下面的名字叫做tracert)

3.ICMP的应用--Traceroute

Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具。前面说到,尽管ping工具也可以进行侦测,但是有三个原因再使用Traceroute工具:

(1) 原先并不是所有的路由器都支持记录路由选项,在某些路径上不能使用;

(2) 记录路由一般是单向的选项。发送端设置了该选项,接收端不得不从收到的IP首部提取出所有的信息,然后全部返回给发送端,这样记录下来的IP地址就翻了一番;

(3) 因为IP首部中留给选的空间有限,ping不能完全的记录下所经过的路由器。

所以Traceroute正好就填补了这些缺憾。

Traceroute的原理:它收到目的主机的IP后,首先给目的主机发送一个TTL=1(还记得TTL是什么吗?)的UDP(后面就知道UDP是什么了)数据包,而经过的第一个路由器收到这个数据包以后,就自动把TTL1,而TTL变为0以后,路由器就把这个包给抛弃了,并同时产生一个“超时”ICMP数据报给主机。主机收到这个数据报以后再发一个TTL=2UDP数据报给目的主机,然后刺激第二个路由器给主机发ICMP数据报。如此往复直到到达目的主机。这样,traceroute就拿到了所有的路由器ip。从而避开了ip头只能记录有限路由IP的问题。

如何判断UDP是否到没到达目的主机了?这就涉及一个技巧的问题,TCPUDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较小的端口,比如说80,比如说23,等等。而traceroute发送的是端口号>30000(真变态)UDP报,所以到达目的主机的时候,目的主机只能发送一个“端口不可达”的ICMP数据报给主机。主机接到这个报告以后就知道,主机到了,所以,说Traceroute是一个骗子一点也不为过。

Traceroute程序里面提供了一些很有用的选项,甚至包含了IP选路的选项,请察看man文档来了解这些,这里就不赘述了。

4. PingTraceroute---基本不同点

(1)PingTraceroute在处理同一台主机上客户的多个实例的不同点:

Ping客户把ICMP回显请求报文的标识符字段设置为它的进程IDICMP回显应答报文包含同样值的标识符字段,每个客户都要查看这个标识符字段,并且只处理那些它发送过的报文;

Traceroute客户把它的UDP源端口号设置为它的进程ID32768的逻辑或。因为返回的ICMP报文总是包含产生差错的IP数据报的前8个字节,这8个字节包括了完整的UDP

部,所以这个源端口号ICMP差错报文中被返回。

(2)PingTraceroute在计算往返时间的不同点:

Ping客户将ICMP回显请求报文的可选数据部分设置为分组发送时间,该可选数据必须在ICMP回显报文中返回。这样即使分组返回失序,也能计算出精确地回环时间,ping每秒发送一个分组,而不管是否收到应答;

Traceroute客户返回的只有UDP首部,没有UDP数据,所以必须记住它发送的时间,等待应答,然后计算回环时间,Traceroute发送一个请求,然后发送下一个请求前等待一个应答或者一个超时。

 

 

 

原创粉丝点击