概念
网际控制报文协议ICMP(Internet Control Message Protocol),是一个网络层协议,用于向高层协议(TCP或UDP)传递数据包的差错信息。ICMP虽然是一个网络层协议,但是和ARP/RARP协议不同的是,它是作为IP报文的数据部分传递给数据链路层的。
ICMP协议格式
ICMP的报文格式如下:
- ICMP报文的类型由类型字段和代码字段共同决定。
- ICMP协议的类型分为两大类,查询报文和差错报文,查询报文总是成对出现。
- 校验和字段校验的范围是整个ICMP报文。
- 当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来。
- 下面各种情况为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴都不会导致产生ICMP差错报文:
(1)ICMP差错报文(ICMP查询报文可能会产生ICMP差错报文)。
(2)目的地址是广播地址多播地址的IP数据报。
(3)目的地址是广播地址多播地址的IP数据报。
(4)作为链路层广播的数据报。
(5)不是IP分片的第一片。
(6)源地址不是单个主机的数据报,即源地址不能为零地址、环回地址、广播地址或多播地址。
ping的原理
ping相关的ICMP报文如下:
type | code | message |
---|---|---|
0 | 0 | Echo Reply |
8 | 0 | Echo Request |
3 | 0 | 网络不可达 |
3 | 1 | 主机不可达 |
3 | 2 | 协议不可达 |
3 | 3 | 端口不可达 |
5 | 0 | 重定向 |
ping 的原理是通过向目的主机发送 ICMP Echo 请求报文,目的主机收到之后会发送 Echo 回答报文。ping 会根据时间和成功响应的次数估算出数据包往返时间以及丢包率。
tracert的原理
tracert基于报文头中的TTL值来逐跳跟踪报文的转发路径。 为了跟踪到达某特定目的地址的路径,源端首先将报文的TTL值设置为1。 该报文到达***个节点后,TTL超时,于是该节点向源端发送TTL超时消息,消息中携带时间戳。 然后源端将报文的TTL值设置为2,报文到达第二个节点后超时,该节点同样返回TTL超时消息,以此类推,直到报文到达目的地。 这样,源端根据返回的报文中的信息可以跟踪到报文经过的每一个节点,并根据时间戳信息计算往返时间。 Tracert是检测网络丢包及时延的有效手段,同时可以帮助管理员发现网络中的路由环路。