ICMP:Internet控制报文协议
引言
使用范围:IP层和更高层协议(TCP/UDP)使用。
作用:把差错报文返回给用户进程。
规范:RFC792[Posterl 1981 b ]
- ICMP的报文跟TCP/UDP一样在IP数据报的数据部分。
- 类型字段有15个不同的值,描述特定类型的ICMP报文。
- 某些ICMP报文还使用代码字段的值来进一步描述不同的条件
- 16位校验和。校验是整个ICMP报文
详细介绍:地址掩码请求和应答、时间戳请求和应答以及不可达端口。Ping程序所使用的回应请求和应答报文和处理IP路由的ICMP报文
ICMP报文的类型
- 不同类型的报文由报文中的类型字段和代码字段共同决定。
- 图中最后的两列表明此类型的报是查询报文还是差错报文。对ICMP差错报文响应时,永远不会生成响应的ICMP差错报文。否则会导致无限循环。
- 发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节。这样就能和某个特定的协议和用户进程关联。
丢弃IP数据报时以下情况不会产生ICMP差错报文
- ICMP差错报文(ICMP查询报文可能会产生)
- 目的地址是广播地址或多播地址(D类地址)的IP数据报
- 作为链路层广播的数据报。(ICMP是针对IP数据报)
- 不是IP分片的第一片
- 源地址不是单个主机的数据报。源地址不能是零地址(主机号是0?还是全是0?),环回地址,广播,多播地址。
ICMP地址掩码请求与应答
- 该类型报文用于无盘系统获取自己的子网掩码。
- RFC规定,除非系统是地址掩码的授权代理,否则它不能发送地址掩码应答(为了成为授权代理,它必须进行特殊配置,以发送这些应答。
- 但是很多主机返回了子网掩码而且是错误的子网掩码。因为他们返回的是自己网卡接口的子网掩码。
ICMP时间戳请求与应答
ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间。
只能获取到时间,日期还需要其他方式获取
- 使用
telnet hostname daytime
获取秒级的日期和时间。 - 严格的计时器使用网络时间协议(NTP)
- 分布式计算环境使用分布式时间服务(DTS),提供了计算机之间的时钟同步文献 [ Rosenberg, Kenney and Fisher 1992]
- unix系统提供守护程序timed(8),来同步局域网上的系统时钟
ICMP端口不可达错误
是ICMP目的不可到达报文中的一种。
一个UDP端口不可达的例子
UDP的规则之一是,如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符,那么返回一个ICMP差错报文。
ICMP是在主机之间交换的,TCP/UDP是从一个端口到另一个端口
不同系统对ICMP报文的处理是不同的。BSD(Berkeley Software Distribution,伯克利软件套件。在unix的内核上加上可靠的软件和软件管理)
小结
ICMP报文中的地址掩码请求和应答以及时间戳请求和应答。两者的ICMP报文中都有标识符和序列号。唯一确定。
ICMP端口不可达的报文。报文包含了IP首部和数据报的前8个字节的数据,有IP数据报的唯一标识和TCP/UDP的端口,以便定位哪个IP数据报出错。
习题
6.1 在6 . 2节的末尾,我们列出了 5种不发送I C M P差错报文的特殊条件。如果这些条件不满足而我们又在局域网上向一个似乎不存在的端口号发送一份广播 U D P数据报,这时会发生什么样的情况?
答:如果没有目标主机的物理地址,则首先发送ARP请求,获取目标主机的IP地址。然后发送UDP数据到目标主机。目标主机发现端口号不存在。返回目标端口不可达的ICMP差错报文。如果收到该ICMP差错报文处理了,则结束。否则继续发送UDP数据报。
6.2 阅读RFC [Braden 1989a],注意生成一个ICMP端口不可达差错是否为“必须”,“应该”或者“可能”。这些信息所在的页码和章节是多少?
答:以后看RFC
6.3 阅读RFC 1349 [Almquist 1992],看看IP的服务类型字段(见图3 - 2)是如何被ICMP设置的?
答:以后看RFC
6.4 如果你的系统提供n e t s t a t命令,请用它来查看接收和发送的 I C M P报文类型。
答:netstat -s -p ICMP