目录
-
-
- 1. ICMP简介
- 2. ICMP报文的类型
- 3. ICMP地址掩码请求与应答
- 4. ICMP时间戳请求与应答
-
- 4.1 举例
- 4.2 另一种方法
- 5. ICMP端口不可达差错
- 6. ICMP报文的4.4BSD处理
- 7. 小结
-
1. ICMP简介
ICMP报文通常被IP层或更高层协议(TCP或UDP)使用,在IP数据报内部被传输,常被认为是IP层的一个组成部分,负责传递差错报文和其他需要注意的信息。
ICMP报文格式:
2. ICMP报文的类型
不同类型由类型字段和代码字段共同决定
ICMP差错报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节,这样接收ICMP差错报文的模块就能把它与某个特定协议和用户进程联系起来(分别根据IP数据报首部中的协议字段以及包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)。
不会导致ICMP差错报文产生的几种情况:
- ICMP差错报文
- 目的地址是广播或多播地址的IP数据报
- 作为链路层广播的数据报
- IP分片的第一片以外的片
- 源地址不是单个主机的数据报(也就是说,源地址不可以是零地址、环回地址、广播地址或多播地址)
3. ICMP地址掩码请求与应答
用途: 无盘系统在引导过程中获取自己的子网掩码(过程类似于无盘系统在引导过程中用RARP获取IP地址)
报文格式:
举例:
显然svr4返回的子网掩码是错误的,它返回了一个普通的B类地址掩码
通常情况下,应答地址必须是单播地址,除非请求端的源IP地址是0.0.0.0,所以说,将应答发送到广播地址是BSD/386的一个内部差错。
4. ICMP时间戳请求与应答
系统向另一个系统查询当前的时间,返回值为自午夜开始计算的毫秒数。
4.1 举例
给某个主机发送ICMP时间戳请求并打印出返回的应答:
假定RTT的值是可靠的,且一半用于传输请求报文,另一半用于传输应答报文,调整本机时钟使其与查询主机的时钟一致,调整值为difference减去RTT的一半。
4.2 另一种方法
- 日期服务程序,以可读方式返回当前的时间和日期
时间服务程序,返回一个32位的二进制数值,表示自UTC(Coordinated Universal Time,自1900.1.1午夜开始计算的毫秒数) - NTP(网络时间协议),误差在毫秒级以内
- DTS(分布式时间服务),提供计算机之间的时钟同步
- timed(8),Unix系统守护程序,同步局域网上的系统时钟
5. ICMP端口不可达差错
端口不可达报文是ICMP目的不可到达报文中的一种,我们使用UDP来查看它。
若收到的UDP数据报的目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文,我们可以用TFTP来强制生成一个端口不可达报文。
注意:
- ICMP报文在主机之间交换,不用目的端口号,而UDP数据报则是从一个特定端口到另一个特定端口。
注意:
- TFTP客户程序采用的是不太好的超时重传算法,假定5s是足够的,因此每隔5s就会重传一次。
- ICMP报文返回时,TFTP客户程序还会继续重发请求,因为BSD系统不会将从插口(socket)接收到的ICMP报文中的UDP数据通知用户进程,除非该进程已经向该插口发送了一个connect命令。标准的BSD TFTP客户程序不发送connect命令,所以它永远也不会收到ICMP差错报文的通知。
6. ICMP报文的4.4BSD处理
7. 小结
- ICMP报文的不同类型
- 典型的请求应答报文——ICMP地址掩码请求和应答、时间戳请求与应答,两者的报文中都有标识符(发送端程序在标识字段内存入一个唯一的数值以区别于其他进程的应答)和序列号(客户程序可以在应答和请求之间进行匹配)
- 常见的ICMP差错——ICMP端口不可达差错
- 按时间先后的tcpdump输出