ICMP(网际控制报文协议)
ICMP(Internet Control Message Protocol)运行在网络层,其目的为了更有效的转发IP数据报和提高交付成功的机会。
ICMP协议的格式
使用wireshark抓取含有ICMP的数据报:

ICMP报文作为IP数据报的数据部分来传输,在ICMP报文中含有一下字段:
| 字段名 | 描述 |
|---|---|
| Type | 占1个字节,标识ICMP报文的类型 |
| Code | 占1个字节,标识对应ICMP报文的代码 |
| Checksum | 占2个字节,校验包括数据在内的整个ICMP数据包 |
| Identifier | 占2个字节,用于标识本ICMP进程 |
| Sequence Number | 占2个字节,用于标识请求、响应报文 |
其中,标识符(Identifier)与序列号(Sequence Number)的值取决于ICMP报文的类型。
ICMP报文的种类
| ICMP报文种类 | 类型的值 | ICMP报文的类型 |
| 差错报告报文 | 3 | 终点不可达 |
| 11 | 时间超过 | |
| 12 | 参数问题 | |
| 5 | 改变路由(redirect) | |
| 询问报文 | 8或5 | 回显(echo)请求或回答 |
| 13或14 | 时间戳(Timestamp)请求或回答 |
其中,所有的ICMP差错报告报文中的数据字段都具有如下图所示的格式。把需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上ICMP报文的前8个字节。

ICMP应用
Ping
在MS DOS中使用ping命令:

使用wireshark抓包:

在输入ping hostname之后,连续发送4个ICMP回显请求报文,并等待ICMP回显应答。
使用Ping可以测试网络的连通性,还能测出两台主机间的往返时间,以表明两者的距离。
Tracert
在MS DOS中使用tracert命令:

使用wireshark抓包:

在输入tracert hostname之后,源主机向目的主机发送一连串的IP数据报,该数据包中封装的是“无法交付”的UDP用户数据报。
第一个数据报\(P_1\)的TTL设置为1。当\(P_1\)到达路径上的第一个路由器\(R_1\)时,该路由器收下\(P_1\),接着将TTL的值减1。由于TTL的的值变为了0,\(R_1\)将该数据报丢弃然后向源主机发送一个超时ICMP差错报告报文。
源主机接受到ICMP差错报告报文,便发送第二个数据报\(P_2\),设置其TTL的值为2,当\(P_2\)被路径上的第二个路由器\(R_2\)接收后,TTL的值变为0,\(R_2\)丢弃该数据报并向源主机发送超时ICMP差错报告报文。就这样一直下去,直到最后一个数据报到达目的地址,由于IP数据报中封装的是“无法交付”的UDP数据报,目的主机源主机发送一个终点不可达ICMP差错报告报文。
通过上述操作,源主机得到了到达目主机所经过的路由器的IP地址,以及到达每个路由器的往返时间。
对“无法交付”的UDP用户数据报的解释:
所谓“无法交付”,是指让发送的UDP报文故意使用一个错误的端口,在该报文到达目的主机后被丢弃,目的主机向源主机发送终点不可达ICMP差错报告报文。
总结
ICMP协议位于网络层,在网络层的抽象上提供了差错报告服务,为传输层的实现提供了基础。
本文介绍了:
- ICMP报文的格式
- ICMP报文的类型(差错报文与询问报文)
- ICMP的应用(Ping与Tracert)
专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。

浙公网安备 33010602011771号