<再看TCP/IP第一卷>关于网络层及协议细节---ICMP协议几个要注意的地方
在TCP/IP协议族中,ICMP协议是一个介于网络层和传输层中间的一个协议,许多材料都会认为ICMP是网络层的一个部分,但是ICMP协议的报头是被包裹在IP协议之中的,而UDP协议又可以被ICMP协议包装,所以不妨认为它是在一个所谓的“中间层”。
一.首先看一下ICMP报文的类型来概括了解一下ICMP的主要功能:
当类型代码为0的时候,ICMP用于返回“不可达”差错;而当类型代码为5的时候,表示该ICMP报文表达“重定向”的操作。其余的类型代码皆可以和图中描述一一对应。
下列图是ICMP不同类型的报文的具体格式:
(1)ICMP时间戳请求和应答报文
(2)ICMP不可达报文
(3)路由器答报文
(4)ICMP超时报文
二.有几种情况不会导致产生ICMP差错报文:
(1)ICMP差错报文(不然有可能会一直循环)
(2)目的地址是广播地址或者多播地址的IP数据报
(3)作为链路层广播的数据报(ARP,RARP)
(4)不是IP分片的第一片
(5)源地址不是单个主机的数据报。源地址不能为零地址,loopback或者广播,多播地址。
三.ICMP报文是在主机之间交换的,不需要端口号
四.traceroute工具的实质:
首先发送一份TTL字段为1的IP数据给目的主机,处理这份数据的第一个路由器将TTL值减1,丢弃该份数据报,并发回一份超时ICMP报文,这样就得到了该路径中的第一个路由器的地址,然后traceroute程序发送一份TTL值为2的数据报(这里因为IP协议的connectionless特性,有可能是前后两个ICMP报文来自不同的路径),这样我们就得到了第二个路由器的地址,继续这个过程直到该份数据报到达目的主机,但是目的主机哪怕接收到TTL值为1的IP数据报,也不会丢弃该数据并产生一ICMP报文,traceroute程序发送一份UDP数据报给目的主机,并选择一个不能的端口作为UDP端口,使目的主机的任何一个应用程序都不可能使用该端口,从而返回一份“不可达”ICMP报文。