TCP/IP之ICMP(Internet控制报文协议),Ping程序和Traceroute程序

ICMP简述

ICMP是在rfc792中被定义。我们知道,IP协议是用来进行host-to-host之间的数据传输连接,但是IP数据报在传输中可能出现各种错误,发送方发送某个IP数据报后,如果发送失败,它是希望能够收到出错的反馈信息的,这就出现了ICMP协议。ICMP协议并不是用来保证IP数据报传输的可靠性,它只是对发送出现错误时进行反馈报到,要想保证数据传输的可靠性,需要高层相关协议定义,如TCP协议。

ICMP是基于IP协议的,也就是说它利用IP数据报格式传输,所以它的头定义格式和IP协议一样。可参考我前篇文章:IP协议

ICMP报文格式

type字段指示出错的类型,code字段指示出错的代码。它们两个的组合可以唯一定位出出错点在哪里。如下摘自RFC里面介绍的一些type值:

Summary of Message Types

    0  Echo Reply

    3  Destination Unreachable

    4  Source Quench

    5  Redirect

    8  Echo

   11  Time Exceeded

   12  Parameter Problem

   13  Timestamp

   14  Timestamp Reply

   15  Information Request

   16  Information Reply

Ping程序

 有时间我们想ssh,telnet,ftp,或者通过浏览器器访问某个主机时总是连接不成功,这时我们想确定本台机器是否该连接主机是否连通,这时我们一般这样做:

ping baidu.com

 

 其实它就是发送的一个type为0,并且返回为8的ICMP数据报。我们执行上面的ping请求时通过tcpdump拦截的数据可以看得到:

root@tony:/home/tony# tcpdump host 123.125.114.144
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
20:45:03.461241 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 1, length 64
20:45:03.615962 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 1, length 64
20:45:04.462946 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 2, length 64
20:45:04.615983 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 2, length 64
20:45:05.463949 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 3, length 64
20:45:05.617809 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 3, length 64
20:45:06.465749 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 4, length 64
20:45:06.619782 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 4, length 64
20:45:07.466709 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 5, length 64
20:45:07.621152 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 5, length 64
20:45:08.468119 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 6, length 64
20:45:08.622387 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 6, length 64
20:45:09.469352 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 7, length 64
20:45:09.623731 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 7, length 64
20:45:10.470701 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 8, length 64
20:45:10.625282 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 8, length 64
20:45:11.472277 IP tony.local > 123.125.114.144: ICMP echo request, id 2826, seq 9, length 64
20:45:11.627035 IP 123.125.114.144 > tony.local: ICMP echo reply, id 2826, seq 9, length 64

 

Traceroute程序

traceroute这个程序的目的就是要确立一个IP数据包是怎么到达目的地主机的(经过了哪些路由器网关)。它的工作原理就是利用IP协议中首部中TTL(time to live)这个字段来工作的。在前面的IP协议文章中,我们讲过TTL就是用来设置一个最大的路由中转数的,如果超过了这个值,则会返回一个ICMP数据报进行错误报告,这样我们就可以根据数据报中的首部信息中源IP地址知道此路由器地址。

所以,如果中间要经过6个路由器网关的话,则要发送7次IP探测数据包,也返回7次ICMP报文来反馈当前所处的路由器或目的主机IP地址。

另外,我在我本机上进行traceoute命令时,只打印星号标记,在Google上也找不到答案,只是好像说是ICMP的数据包被禁止了还是怎么回事,如果有知道原因的同学,麻烦留言告诉我一下,我的机器环境是:ubuntu12.04 + ADSL上网(电信)

root@tony:/home/tony# traceroute 119.146.200.16
traceroute to 119.146.200.16 (119.146.200.16), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
 4  * * *
 5  * * *

 

可是ping是通的:

root@tony:/home/tony# ping 119.146.200.16
PING 119.146.200.16 (119.146.200.16) 56(84) bytes of data.
64 bytes from 119.146.200.16: icmp_req=1 ttl=54 time=28.1 ms
64 bytes from 119.146.200.16: icmp_req=2 ttl=54 time=28.0 ms
64 bytes from 119.146.200.16: icmp_req=3 ttl=54 time=26.6 ms
64 bytes from 119.146.200.16: icmp_req=4 ttl=54 time=24.6 ms

 

posted @ 2013-02-21 22:33  海鸟  阅读(1069)  评论(0编辑  收藏  举报