一、ICMP报文
1.1 ICMP报文格式
1.2 查询报文类型
我们常用的ping报文,本质上就是一种ICMP报文,当从机器A ping 机器B的时候,首先会发送一个ICMP ECHO REQUEST。机器B收到ping请求后,会返回一个ICMP ECHO REPLY。ping报文中,标识符是用来表示ping的id,防止冲突。在数据中,存放了发送请求的时间值,用来计算往返时间。
1.3 差错报文类型
我们在写代码中,调用函数,都会有很多返回值,比如会提示你输入不符合要求,或者其他各种异常情况,通过返回值或者Exception来通知你,而在网络中,也有这样的机制,通过特殊的报文形式,来告诉你各种异常情况,
常见的异常类型如下:
1.3.1 主机不可达
二、PING 发送和接受详解

对于Client端,首先是封装ICMP报文,ICMP ECHO REQUEST,然后交给3层,3层封装IP头,交给2层,2层通过查ARP表,查到dest ip 的mac 地址,然后开始封装MAC头,交给交换机。交换机查看本地MAC表,走右边的口发送出去。
对于Server端,收到报文,首先到2层,拆开MAC头,发现目标MAC是自己,把拆完的包给3层,3层拆开IP头,发现dest ip 是自己,把拆完的包给ICMP层,ICMP进行ICMP ECHO REPLY。进行回复。
接下来的Server端封包,Client端解包。一次完整的ping流程就结束了。
三、TRACEROUTE 原理。
traceroute命令可以快速定位到源地址到目标地址经过了哪些网关。原理当报文超时的时候,网关会发送差错报文。初始的时候, traceroute会发送一个TTL为1的UDP报文,当遇到第一个网关的时候,就发现超时了,网关就直接返回了,这样traceroute就知道了到第一个网关的ip以及时间。接着不断地增大TTL,这样所有网关都能回复客户端并且带着自生的ip和时间。
但是有时候,traceroute会返回???,原因就是有些路由器是禁ICMP的,所以发出去的报文就直接没了。
怎么才知道目标主机是否可达呢。traceroute通过发送一个UDP报文,并且设置一个不存在的UDP端口,这样目标主机会返回一个端口不可达的ICMP报文。
四、总结
- ICMP报文是一种探测以及差错报文。
- ping使用的是查询报文,traceroute使用的是差错报文。
ICMP报文中最常用的类型是主动请求为8,应答是0。
