1. ICMP请求和响应
ICMP查询报告报文分为2大类:一个是request请求报文,一个是reply应答报文,类型为8就代表是请求,类型为0就代表是应答。
ICMP查询报告报文:
类型为8代表请求报文
类型为0代表应答报文
代码为0:无论是请求报文还是应答报文,代码都是为0
前面已经多次介绍过校验和,标识符,序列号,这里不再说明。
数据部分:由请求报文发送指定数据,然后应答报文把指定数据在重复发回来。
现在我们通过使用ping命令来抓一个ICMP包来具体说明一下,如下图所示:
图1
我们可以看到图2中的ICMP数据报中的Type的值是8,括号中的ping表示是通过ping命令产生的ICMP数据报,后面request就代表请求数据报,通过这些信息基本可以确定这是一个ICMP请求数据报。
图2
我们可以看到图3中的ICMP数据报中的Type的值是0,括号中的ping表示是通过ping命令产生的ICMP数据报,后面reply就代表应答数据报,通过这些信息基本可以确定这是一个ICMP应答数据报。
图3
2. 时间戳请求和回答
图4
原始时间戳:源主机给目的主机发送一个数据报的时间点就是原始时间戳。
接收时间戳:目的主机接收到源主机发送的数据报的时间点就是接收时间戳。
发送时间戳:目的主机给源主机发回应答报文的时间点就是发送时间戳
发送时间=接收时间戳的值 - 原始时间戳的值
接收时间=分组返回的时间 - 发送时间戳的值
往返时间=发送时间 + 接收时间
这里只解释发送时间和接收时间,往返时间自然就明白了,发送时间就是源主机发送数据报目的主机花费的时间,接收时间就是目的主机发送应答报文给源主机所用的时间。
3. 地址掩码请求和回答
假如主机A知道自己的IP地,但是不知道子网掩码是多少,主机A就可以通过广播或者组播的形式在网络上发送一个地址掩码请求报文,其他设备收到请求后会发送一个地址掩码回答报文,分两种情况:
- 如果主机A知道找谁请求子网掩码的话,那么主机A在发送地址掩码请求会以单播的形式找指定主机请求子网掩码地址
- 如果主机A不知道找谁请求子网掩码的话,会以广播的形式请求同一网段下的主机,能提供掩码的主机会发送一个地址掩码回答报文告诉主机A掩码地址。
图5是地址掩码请求和回答报文格式:
图5
另外,在发送地址掩码请求报文的时候,地址掩码是以0来填充的,在发送地址掩码应答报文时,这时地址掩码已经确定,所以会以正确的值来填充,并把这个地址掩码发回给源主机。
4. 路由器询问和通告
比如主机A给主机B发送一个数据报,主机A必须知道这个数据报在网络中的路线是怎么走的,如果主机A不知道给主机B发送的数据报在网络传输过程中走的路线(经过了哪些路由器),这时主机A会以广播的形式或者以多播的形式发送一个ICMP路由器询问和通告报文
,向网络中的路由设备询问数据报在网络中经过的路线,知道路线的路由器会发回一个ICMP路由器通告报文。
ICMP路由询问和通告报文格式:
图6
ICMP路由询问和通告报文:
类型为9表示这是一个ICMP路由询问和通告报文,
代码为0
生存期:路由发回给源主机的路由信息的有效时间,一旦过了有效时间路由信息就会失效。
一般来说,即便源主机不主动询问路由信息,网络中的路由器都会自动发回路由通告报文。路由器发回ICMP路由器通告报文中的路由信息带着路由器ip地址和地址优先级,且地址优先级默认是0。
比如:路由器A发回的路由路线信息的优先级是0,路由器B发回的路由路线信息的优先级是2,那么源主机发送数据时有很大的可能就会走路由B发回的路由路线,因为路由器B的优先级更高。