1、ICMP数据包格式
ICMP协议属于网络层,是TCP/IP协议族的一个子协议,ICMP数据包被封装在IP报文中。网络中传递的ICMP包示意如下,:
帧头 | IP报头 | Data(ICMP包) | FCS | |||
Type | Code | Checksum | data | |||
8位 | 8位 | 16位 | 按需要 |
Type:消息类型。
Code:消息类型的具体参数。
Checksum:校验字段,用于检查消息是否完整;在ICMP重定向消息中用于指定网关IP地址;在Echo Reply消息中这个字段包含标识符和序号。
data:数据字段,根据不同使用需求,内容不一样。
2、ICMP消息格式
Type |
Code | 描述 | 备注 |
0 | 0 | Echo Reply | 回显应答(ping应答) |
3 |
0 | Network Unreachable | 网络不可达 |
3 | 1 | Host Unreachable |
主机不可达 |
3 | 2 | Protocol Unreachable | 协议不可达(不支持该协议号) |
3 | 3 | Port Unreachable | 端口不可达(主机没有开放该端口) |
3 | 4 | Fragmentation needed but no frag.bit set | 需要进行分片但设置不分片比特 |
3 | 5 | Source routing failed | 源站选路失败 |
3 | 6 | Destination network unknown | 目的网络未知 |
3 | 7 | Destination host unknown | 目的主机未知 |
3 | 8 | Source host isolated (obsolete) | 源主机被隔离(作废不用) |
3 | 9 | Destination network administratively prohibited | 目的网络被强制禁止 |
3 | 10 | Destination host administratively prohibited | 目的主机被强制禁止 |
3 | 11 | Network unreachable for TOS | 由于服务类型TOS,网络不可达 |
3 | 12 | Host unreachable for TOS | 由于服务类型TOS,主机不可达 |
3 | 13 | Communication administratively prohibited by filtering | 由于过滤,通信被强制禁止 |
3 | 14 | Host precedence violation | 主机越权 |
3 | 15 | Precedence cutoff in effect | 优先中止生效 |
4 | 0 | Source quench | 源端被关闭(基本流控制) |
5 | 0 | Redirect for network | 对网络重定向 |
5 | 1 | Redirect for host | 对主机重定向 |
5 | 2 | Redirect for TOS and network | 对服务类型和网络重定向 |
5 | 3 | Redirect for TOS and host | 对服务类型和主机重定向 |
8 | 0 | Echo Request | 回显请求(Ping请求) |
9 | 0 | Router advertisement | 路由器通告 |
10 | 0 | Route solicitation | 路由器请求 |
11 | 0 | TTL equals 0 during transit | 传输期间生存时间为0 |
11 | 1 | TTL equals 0 during reassembly | 在数据报组装期间生存时间为0 |
12 | 0 | IP header bad (catchall error) | 坏的IP首部(包括各种差错) |
12 | 1 | Required options missing | 缺少必需的选项 |
13 | 0 | Timestamp request (obsolete) | 时间戳请求(作废不用) |
14 | 0 | Timestamp reply (obsolete) | 时间戳应答(作废不用) |
15 | 0 | Information request (obsolete) | 信息请求(作废不用) |
16 | 0 | Information reply (obsolete) | 信息应答(作废不用) |
17 | 0 | Address mask request | 地址掩码请求 |
18 | 0 | Address mask reply | 地址掩码应答 |
3、ICMP功能
ICMP用于在主机、路由器之间传递控制消息,包括错误报告、交换受限控制和状态信息等。通常的应用场景是主机向远端发送数据而路由找不到远端,于是向主机发送一个ICMP报文告知其错误情况,我们称之为差错报文,需要注意ICMP的唯一功能是报告问题而不是纠正错误。另一种情况是主机向路由或远端发送一个ICMP请求报文,并获取ICMP回复报文以获取当前网络情况等信息,这种称之为询问报文。
ICMP差错报文共5种:
终点不可达 | 包括网络不可达、主机不可达、协议不可达、端口不可达、需要分片但DF比特已置为1、源路由失败六种情况,当出现上述六种情况时就向源站发送终点不可达报文。 | |
源站抑制 | 当路由器或主机由于拥塞而丢弃数据时,就向源站发送源站抑制报文使源站知道应当将数据报文的发送速率放缓。 | |
超时 |
当路由器收到生存时间为0的数据,或目的站在预先规定的时间内没有收到一个数据报的全部数据报片段均判定为超时,则丢弃数据并向源站发送超时报文。 |
|
参数问题 | 路由器或目的站收到的数据报首部的字段存在值不正确则丢弃该数据,并向源站发送参数问题报文。 | |
重定向 | 当路由器检测到源站使用非优化路由时就会向该主机发送一个ICMP重定向报文,请求主机改变路由。 |
为避免ICMP差错报文对广播分组响应所带来的广播风暴,以下五种情况都不会导致ICMP差错报文的产生:
1)路由器或主机在收到异常的ICMP差错报文时不会产生新的差错报文。
2)目的地址是广播地址或多播地址的IP数据报。
3)作为链路层广播的数据报。
4)不是IP分片的第一片,避免每个分片都产生一个新的差错报文。
5)源地址不是单个主机的数据报。
ICMP询问报文有四种:
回送请求和回答 | ICMP回送请求报文是主机或路由器向一个特定目的端发出的询问,收到报文的目的端必须发送ICMP回送应答报文给源端。目前在于测试目的端是否可达并了解其有关状态。 |
时间戳请求和回答 | 源端可以发送一个ICMP时间戳请求报文向另一个系统查询当前的时间,该报文的好处是可提供毫秒级的时间分辨率。 |
掩码地址请求和回答 | 主机使用ICMP掩码地址请求报文可向子网掩码服务器得到某个接口的掩码地址。 |
路由询问和通过 | 主机将路由器询问报文进行广播或多播,收到询问的路由器就使用路由器通过报文广播其路由选择信息。通过这种方式主机可了解连接在本网络上的路由器是否正常工作。 |
4、ICMP应用
Ping:
Ping是检测网络连通性的常用工具,同时也能收集其他相关信息。用户可以在Ping命令中指定不同参数,常用配置参数说明如下:
-a source-ip-address | 指定ICMP报文的源IP地址 |
-c count | 指定发送报文的次数,缺省发送5个 |
-h ttl-valuse | 指定TTL的值,缺省是255 |
-t timeout | 指定等待应当报文的超时时间 |
Tracert:
源主机想知道访问目的主机的路径,它向第一个路由器发送一个TTL值为1的ICMP包且使用一个目的主机无法识别的端口,第一个路由器A收到该包后先将TTL值减1发现此时TTL=0于是不再转发并返回一个ICMP包给源主机,其中就包含了路由器A的地址。主机A收到路由器A的应答知道了路由器A的地址,便再次发送一个TTL值为2的ICMP包,路由器A收到该包后会向下转发则路由器B会收到该包,由于TTL=0则路由器B会返回一个ICMP包给源主机。通过这种方法层层传递到目的主机,目的主机发现该包端口太大无法识别于是向源主机回复一个目的不可达的ICMP包,源主机收到这个回复的包就知道自己发送的包已到达目的主机。则整个路径的IP就被源主机获悉。
【需要分片但DF比特已置为1】路由器收到一份需要分片的数据报,而其IP首部中的DF字段被置为1,表明不需要分片,此时路由应向源主机发送一个ICMP差错报文。