前面讲到了,IP协议并非一个可靠的协议,它不保证数据被送达,那么,天然的,保证数据送达的工做应该由其余的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。windows
当传送IP数据包发生错误--好比主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,而后传送回给主机。给主机一个处理错误的机会,这 也就是为何说创建在IP层以上的协议是可能作到安全的缘由。ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。而前 16bit就组成了ICMP所要传递的信息。安全
尽管在大多数状况下,错误的包传送应该给出ICMP报文,可是在特殊状况下,是不产生ICMP错误报文的。以下网络
虽然里面的一些规定如今还不是很明白,可是全部的这一切规定,都是为了防止产生ICMP报文的无限传播而定义的。工具
ICMP协议大体分为两类,一种是查询报文,一种是差错报文。其中查询报文有如下几种用途:网站
而差错报文则产生在数据传送发生错误的时候。就不赘述了。spa
ping能够说是ICMP的最著名的应用,当咱们某一个网站上不去的时候。一般会ping一下这个网站。ping会回显出一些有用的信息。通常的信息以下:.net
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 = 0msblog
ping这个单词源自声纳定位,而这个程序的做用也确实如此,它利用ICMP协议包来侦测另外一个主机是否可达。原理是用类型码为0的ICMP发请 求,受到请求的主机则用类型码为8的ICMP回应。ping程序来计算间隔时间,并计算有多少个包被送达。用户就能够判断网络大体的状况。咱们能够看到, ping给出来了传送的时间和TTL的数据。我给的例子不太好,由于走的路由少,有兴趣地能够ping一下国外的网站好比sf.net,就能够观察到一些 丢包的现象,而程序运行的时间也会更加的长。
ping还给咱们一个看主机到目的主机的路由的机会。这是由于,ICMP的ping请求数据报在每通过一个路由器的时候,路由器都会把本身的ip放到该数 据报中。而目的主机则会把这个ip列表复制到回应icmp数据包中发回给主机。可是,不管如何,ip头所能纪录的路由列表是很是的有限。若是要观察路由, 咱们仍是须要使用更好的工具,就是要讲到的Traceroute(windows下面的名字叫作tracert)。进程
Traceroute是用来侦测主机到目的主机之间所经路由状况的重要工具,也是最便利的工具。前面说到,尽管ping工具也能够进行侦测,可是,由于ip头的限制,ping不能彻底的记录下所通过的路由器。因此Traceroute正好就填补了这个缺憾。ip
Traceroute的原理是很是很是的有意思,它受到目的主机的IP后,首先给目的主机发送一个TTL=1(还记得TTL是什么吗?)的UDP(后面就 知道UDP是什么了)数据包,而通过的第一个路由器收到这个数据包之后,就自动把TTL减1,而TTL变为0之后,路由器就把这个包给抛弃了,并同时产生 一个主机不可达的ICMP数据报给主机。主机收到这个数据报之后再发一个TTL=2的UDP数据报给目的主机,而后刺激第二个路由器给主机发ICMP数据 报。如此往复直到到达目的主机。这样,traceroute就拿到了全部的路由器ip。从而避开了ip头只能记录有限路由IP的问题。
有人要问,我怎么知道UDP到没到达目的主机呢?这就涉及一个技巧的问题,TCP和UDP协议有一个端口号定义,而普通的网络程序只监控少数的几个号码较 小的端口,好比说80,好比说23,等等。而traceroute发送的是端口号>30000(真变态)的UDP报,因此到达目的主机的时候,目的 主机只能发送一个端口不可达的ICMP数据报给主机。主机接到这个报告之后就知道,主机到了