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)
专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。