ICMP封装在IP数据报的内部:
ICMP报文格式:
ICMP中所有报文的前4个字节都是一样的,剩下的其他字节互不相同。 类型字段可以有15个不同的值,用来描述特定类型的ICMP报文。某些ICMP报文还使用代码字段的值来描述不同的条件。 检验和字段(必须)覆盖整个ICMP报文。
ICMP报文的类型:
不同类型由报文中的类型字段和代码字段共同决定。
- 当发送ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节。
- 接收ICMP差错报文的模块就会把它与某个特定协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来。
不会导致产生ICMP差错报文的情况:
1). ICMP差错报文(ICMP查询报文可能会产生ICMP差错报文); 2). 目的地址是广播地址或多播地址的IP数据报; 3). 作为链路层广播的数据报; 4). 不是IP分片的第一片; 5). 源地址不是单个主机的数据报(源地址不能为零地址、环回地址、广播地址或多播地址); 这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。
ICMP地址掩码请求与应答
ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的ICMP请求报文(这一过程与无盘系统在引导过程中用RARP获取IP地址是类似的)。无盘系统获取子网掩码的另一个方法是BOOTP协议。
ICMP地址掩码请求和应答报文格式:
ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样,发送端就可以把应答与请求进行匹配。
ICMP时间戳请求与应答
ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间(Coordinated Universal Time, UTC)。这种ICMP报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机获取的时间(如某些Unix系统提供的rdate命令)只能提供秒级的分辨率。由于返回的时间是从午夜开始计算的,因此调用者必须通过其他方法获知当时的日期,这是它的一个缺陷。
ICMP时间戳请求和应答报文格式:
请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。但是,实际上,大多数的实现把后面两个字段都设成相同的值(提供三个字段的原因是可以让发送方分别计算发送请求的时间和发送应答的时间)。