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)
CS专业在读,热爱编程。
专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。
原文地址:https://www.cnblogs.com/jmhwsrr/p/14099762.html