前言
ping命令通常用于检测一台主机是否可达,对于大多数主机能ping通就代表可达,不能ping通就是不可达,但是有些主机设置了防火墙只允许特定协议的数据包通过,这时ping包就会被主机直接丢弃,而且不会进行回应。为了进一步知道数据包到哪了,就需要traceroute命令,他能返回数据包沿途经过的所有节点ip,这样就能具体知道数据包在哪丢失的了。
一、icmp协议介绍
常用ICMP的报文格式如下图:
ICMP报文大致可以分为差错报文、请求与应答报文、控制报文。每一种报文都会通过type、和code做进一步的区分。
二、ping使用原理
ping包使用的是ICMP报文中的请求与应答报文。发送端发送一个icmp包给目的端,目的端如果收到该icmp包会进行解析,发现是一个icmp请求包,目的端的网络协议栈就会自动组装一个ICMP应答报文发送给发送端。
执行ping www.baidu.com进行抓包:
请求包
响应包
三、traceroute使用原理
traceroute实现主要有两种形式:
1.发送udp包
2.发送ICMP的请求应答包
window平台使用:tracert www.baidu.com 默认发送ICMP包
linux平台使用:traceroute www.baidu.com 默认发送udp包,加上-I则使用ICMP包
工作原理图:
不管是udp包还是icmp包,都是利用icmp超时报文来获得中间节点的ip地址,原理为:源主机将发送数据包中IP层的TTL从1依次递增,中间节点收到该数据包进行解析,发现TTL=1时自己也不能将他转发到目的地址,然后就回一个超时报文,原ip就为中间节点的Ip地址。
发送icmp包对应的超时数据包:
发送udp包对应的超时数据包:
如果上层协议为udp,发送的udp目的端口是一个很大的值,并且一次递增,当udp包到达目标主机后,目标主机解析发送来的udp包,总有一个udp的数据包的端口没有被目标主机监听,这时目标主机发送目标不可达的icmp报文。
如果上层协议为icmp,发送的数据包和ping包一样都是请求应答数据包,请求包到达目标主机后就会回一个应答数据包。