梁越

ICMP协议是什么

0 人看过

初探ICMP

ICMP报文格式

我们经常用ping命令,但是可能不知道ping命令的底层协议是ICMP,那到底什么是ICMP

ICMP协议可以说IP层的附属协议,是介于IP层和TCP层之间的协议,一般认为属于IP层协议,即网络层。IP协议用它来与其他主机或路由器交换错误报文和其他的一些网络情况。在ICMP包中携带了控制信息和故障恢复信息。主要用于路由器主机向其他路由器或者主机发送出错报文的控制信息。这么说可能不好理解ICMP报文和IP报文的关系,下图是ICMP报文的封装。

1.png

一般的ICMP报文形式如下图

image

而不同类型的报文有所不同,例如

  • ICMP地址掩码请求与应答报文的类型

image

  • ICMP时间戳请求与应答报文的类型

image

那他具体是怎么工作的呢,就以ping baidu.com为例,

ping和ICMP

1. 首先会DNS域名解析出IP,然后发送ICMP报文

image

可以看到Protocol字段为1表示为ICMP报文,Type为8,Code为0表示这是请求回显,也就是ping请求,还包含有Checksum校验和。

Identify表示进程号,其中的LE和BE分别表示小端字节序,大端字节序,因为考虑到windows一般为小端字节序,Linux为大端。

Sequence number表示序列号,也有大小端之分

Data是包含的数据,32字节

2. 服务器响应ICMP报文

image

然后根据两个报文的接收时间就可以计算时延

关于ICMP报文的一些报文类型定义如下图

image

可以看到ICMP还分查询报文和差错报文,上面提到的地址掩码和时间戳都是查询报文,而差错报文一般是进行广播时发送的,用于响应,类似的有traceroute命令

traceroute和ICMP

首先traceroute是获取经过路由的命令,traceroute底层是通过ICMP差错报文来实现的,其原理是向目标主机发送固定TTL的报文,TTL从1开始递增,每个TTL的报文发送三次,TTL经过一个路由会减1,TTL为0时会给源主机发送超时报文,如果到达了目标主机,目标主机会发送端口不可达的ICMP差错报文,源主机停止发送,这样所有的路由信息都得到了。

大概过程是这样,TTL=1时,发送三个UDP报文,经过第一个路由后直接返回超时,得到第一个路由的信息

2

第二次发送TTL=2的报文,在第二个路由处响应

3

请求的报文形式如下,

image

每次请求后的响应如下,

image

三个请求就会有三个超时响应

这里有个细节,需要等待三个TTL的报文都响应后,对应的路由或者说节点会给源主机响应一个端口不可达差错报文,这个报文形式如下,下图的端口是58866,节点没有监听该端口,所以返回端口不可达

image

当相应的是目的IP的主机时,源主机停止发送