为了更有效地转发数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP,ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP报文是装在IP数据报中,作为其数据的一部分。
报文格式
ICMP报文分为2种:
ICMP差错报文
- 终点不可达
当路由器主机不能交付数据报时就向源点发送终点不可达报文。 - 源点抑制
当路由器或主机不能交付数据报时,就像源点发送终点不可达报文。 - 时间超过
当路由器收到生存时间为0的数据报时,除丢弃数据报外,还要向源点发送时间超过报文。 - 参数问题
- 改变路由
所有的差错报文的数据字段都具有相同的格式,即把收到的需要进行差错报告的IP数据报的首部和IP数据报内容的前8个字节提取出来,作为ICMP报文的数据部分。这样接收ICMP差错报文的模块就能把它与某个特定的协议(IP数据报首部中的协议字段)和用户进程(IP数据报内容的前8个字节即为TCP和UDP端口号)联系起来。
ICMP询问报文
- 回送请求和回答
- 时间戳请求和回答
PING
ICMP报文一个重要的应用就是分组网间探测PING,用来测试2个主机之间的连通性。
PING使用了ICMP回送请求和回答报文,PING是应用层直接使用网络层ICMP的一个例子,它没有通过运输层的TCP和UDP。
比如PC向目的服务器发送4个ICMP回送请求报文。如果服务器正常工作而且响应这个ICMP报文,那么它就发回ICMP回送回答报文。由于往返的ICMP报文上面都有时间戳,因此,还可以得出往返时间RTT。
Traceroute
traceroute用来跟踪一个分组从源点到终点的路径。
Traceroute从源主机向目的主机发送一个连串的IP数据报,IP数据报中封装的是无法交付的UDP用户数据报(端口非法),第一个数据报P1的生存时间TTL设置为1,当P1到达路径上的第一个路由器R1时,路由器R1先收下它,接着把TTL的值减1,由于TTL等于0了,R1就把P1丢弃了,并向源主机发送一个ICMP时间超过的差错报文。
源主机接着发送第二个数据报P2,并把TTL设置为2。P2先到到路由器R1,R1将TTL减1再转发给路由器R2。R2将TTL减1变为0,于是丢弃p2,并向源主机发送一个ICMP时间超过的差错报文。
这样一直继续下去,直到到达目的主机,此时TTL为1,目的主机不转发数据报,也不把TTL减1。但因IP数据报封装的是无法交付的运输层UDP用户数据报,因此目的主机向源主机发送ICMP终点不可达差错报文。