ICMP协议:
ICMP报文是封装在IP里面的,因为传输指令的时候,需要源地址与目标地址。具体如下入所示:
ICMP报文的类型有很多种,每种类型报文的代码都不一样。其中最常用的类型是主动请求为8,主动请求的应答为0。
如何查询对应ICMP的报文类型?Ping就是查询报文类型的一个命令,是一种主动的请求,并且获得主动应答的ICMP协议,但是它在后面增加了自己的格式。对于Ping的主动请求,进行网络抓包,称为ICMP ECHO REQUEST。同理主动请求的回复,称为ICMP ECHO REPLY。比起原生的ICMP,多了两个字段,一个是标识符,一个是序号。在选项数据中,Ping还会存放发送请求的时间值,用来计算往返的时间,来说明路程的长短。
差错报文:eg:终点不可达为:3;源抑制为:4;超时:11;重定向为:5;
终点不可达:网络不可达的代码为:0;主机不可达的代码为:1;协议代码不可达的代码为:2;端口不可达的代码为:3;需要进行分片但设置了不分片代码为:4;
源站抑制:提示源站放慢发送速度。
时间超时:超过网络包的生存时间还是没有到。
路由重定向:提示下次发送给另外一个路由。
差错报文的结构相对复杂一些。除了前面还是IP,ICMP的前8个字节不变,后面跟上了出错的那个IP包的IP头跟IP正文的前8个字节。(前八个字节是标识了错误的原因,后那个字节是标识那个IP出错了)
下图为Ping的发送和接受过程:
Ping命令执行的时候,源主机会构建一个ICMP请求数据包,ICMP数据包内包含多个字段。其中有两个是最重要的:
1)类型字段:对于请求包来说该字段为8。
2)顺序号:主要用于区分连续Ping的时候发送出的多个数据包。每次发送一个请求就会累加1。为了计算往返时间RTT,会在报文的数据部分插入发送时间。
数据包构建好以后会交给IP层,IP层会将目标IP地址与源IP地址加上一些其他的控制信息构建成一个IP数据包。
接下来需要加入MAC头,如果能在ARP映射表中查找出目标IP地址对应的MAC地址就可以直接使用。如果没有查找到,就会发送ARP协议去查找对应的MAC地址。在获取到MAC地址之后,由数据链路层构建一个数据帧,目的地址为IP层传过来的MAC地址,源地址为本机的MAC地址;还要附加上一些控制信息,然后依据以太网的介质访问规则,将其传送出去。
目标机在接受到这个数据帧以后,会检测MAC地址是否与本机的MAC地址一致。如果一致则接收,否则就丢弃。接收后检查该数据帧,提取出IP,将IP交给IP层校验,校验通过后再将有用的信息提取出来交给ICMP协议。
目标机处理完以后会构建一个ICMP应答包,应答数据包的类型字段为0,顺序号为接受到的请求数据包中的顺序号,然后发送给源机器。
如果在规定的时间内,源机器未收到ICMP应答包,则说明主机不可达;如果接受到了ICMP包,则说明主机可达,此时源机器就会检查,用当前时刻减去数据包内发送的时刻,得出的就是ICMP数据包的时间延迟。
以上情况都是发生在同一个局域网内。如果是跨网段的话,还会涉及到网关的转发、路由的转发等等。但是对于ICMP头来说,是没有说明影响的。影响的是根据目标IP地址,选择路由的下一跳,还有每经过路由到达一个新的局域网时,需要将MAC头内的MAC信息替换一下。