为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了 ICMP 。ICMP 允许主机或路由器i报告差错情况和提供有关异常情况的报告。封装在 IP 数据报中,但是不属于高层协议。
1 ICMP 报文的种类
ICMP 报文分为差错报告报文和询问报文。
1)差错报告报文
(1)报文类别
- 终点不可达:当路由器或者主机不能交付数据报时,就向源点发送终点不可达报文。
- 时间超过:当路由器收到生存时间为零的数据报时,除丢弃该数据报时,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到数据报全部数据报片时,就将已收到的数据报片丢弃,并向源点发送时间超过报文。
- 参数问题:当路由器或者目的主机收到的数据报首部有字段值不正确时,丢弃该数据报,并向源点发送参数问题报文。
- 改变路由(重定向):路由器把改变路由报文发送给主机,通知主机下次将数据报发送给别的路由器。
(2)报文的形成方法
所有ICMP首部包括类型、代码与检验和三部分共4个字节的信息字段。ICMP差错报文的数据字段格式相同,由收到的需要差错报告的 IP 数据报首部及其数据部分前8个字节组成。
(3)不应发送的几种情况
- 对ICMP差错报告报文不再发送ICMP差错报告报文;
- 对第一分片以后的所有数据报分片不发送ICMP差错报告报文;
- 对多播地址的数据报都不发送ICMP差错报告报文;
- 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报不发送ICMP差错报文;
2)询问报文
- 回送请求和回答:ICMP回送请求报文是主机或者路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或者路由器发送ICMP回答报文。目的是测试目的站是否可达以及了解其有关状态。
- 时间戳请求与回答:ICMP时间戳请求报文是请某个主机或者路由器回答当前日期和时间,目的是进行时钟同步和测量时间
2 ICMP 应用举例
1)Ping
Ping 是 ICMP 的一个重要应用,主要用来测试两台主机之间的连通性。
Ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。Ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。
2)Traceroute
Traceroute(windows系统中叫做tracert) 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。
Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。
- 源主机向目的主机发送一连串的 IP 数据报。第一个数据报 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,由于此时 TTL 等于 0,R2 就丢弃 P2,并向源主机发送一个 ICMP 时间超过差错报文。
- 不断执行这样的步骤,直到最后一个数据报刚刚到达目的主机,主机不转发数据报,也不把 TTL 值减 1。但是因为数据报封装的是无法交付的 UDP,因此目的主机要向源主机发送 ICMP 终点不可达差错报告报文。
- 之后源主机知道了到达目的主机所经过的路由器 IP 地址以及到达每个路由器的往返时间。