我只是个搬运工,
1、引言
作用:传递差错报文以及其他需要注意的信息
该协议通常被IP层或者更高层协议(TCP、UDP)使用
ICMP报文在IP数据报内部被传输,如图1所示。因此ICMP常被认为是IP层的一个组成部分
图1 ICMP封装在IP数据报内部
ICMP报文的格式如图2所示。所有报文前4个字节相同,但是不同的差错信息对应不同的剩余字节信息。
图2 ICMP报文
2、ICMP报文类型
各种类型的ICMP报文如图3所示,不同类型由报文中的类型字段和代码字段共同决定。
图3 ICMP报文类型
对ICMP差错报文有时需要特殊处理,因此需要区分ICMP报文是查询报文还是差错报文。特殊操作包括:在对ICMP差错报文进行响应时,永远不会再生成另一份ICMP差错报文(若无此限制可能导致遇到一个差错之后产生另一个差错,差错再产生差错,可会无休止的循环下去)。
当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节(并不是IP数据报首部的前8个字节,而是IP首部之后的8个字节)。这样接收到ICMP差错报文的模块会将它和某个特定的协议(根据IP首部的协议字段判断)以及用户进程(根据包含在IP数据报前8个字节的TCP或UDP报文首部中的TCP或UDP端口号来判断)相联系。
不会产生ICMP差错报文的情况:
这些设置的主要目的:防止过去允许ICMP差错报文对广播分组影响带来的广播风暴1)ICMP差错报文 注:ICMP查询报文会产生ICMP差错报文
2)目的地址是广播地址或多播地址
3)作为链路层广播的数据报
4)不是IP分片的第一片
5)源地址不是单个主机的数据报。即源地址不能是源地址、环回地址、广播地址或多播地址
3、ICMP地址掩码请求与应答
ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的ICMP请求报文
ps:无盘系统是指由无盘工作站组成的局域网。无盘工作站:盘只硬盘,原理是在网内有一个系统服务器,这太系统服务器上除了有他本身运行所需的操作系统外还需要有工作站运行所需的操作系统。无盘工作站的机箱内没有硬盘,但是其他硬件都有,而且无盘工作站的网卡要带有可引导芯片。
ICMP地址掩码请求和应答报文格式如下:
图4 ICMP地址掩码请求和应答报文
ICMP报文中标识符和序列号字段由发送端任意选择设定,这些值在应答中被返回,这样发送端就可将请求与应答进行匹配。
RFC规定,除非系统是地址掩码的授权代理,否则他不能发送地址掩码应答
4、ICMP时间戳请求与应答
ICMP时间戳请求是允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,细条的统一时间(UTC,格林尼治时间)。
ICMP时间戳请求与应答时间
图5 ICMP时间戳请求和应答报文
请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间。实际上后两个字段设置为相同的值。
ICMP时间戳请求和应答报文:是发送给某个特定主机?
5、ICMP端口不可达差错
使用上层协议如UDP可以查看ICMP报文中所附加的信息
UDP规则之一:如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符,则UDP返回一个ICMP不可达报文。而TFTP来强制产生一个 端口不可达报文。
ICMP报文在主机间交换,而不用目的端口
对于ICMP差错报文需要包含:生成该差错报文的数据报IP首部,以及跟在该IP首部后面的前8个字节