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