ping 是基于ICMP协议工作的,互联网控制报文协议。ICMP报文是封装在IP里面的。
ICMP报文有很多类型,最常用的类型是主动请求(8),主动请求的应答(0)
- 查询报文类型
ping使用的是查询报文,标识符(16位)+序号(16位)+数据
在选项中ping还会存放发送请求的时间值,来计算往返时间,说明路程的长短 - 差错报文类型
Traceroute使用的是差错报文,终点不可达为 3,源抑制为 4,超时为 11,重定向为 5。差错报文的结构相对复杂一些。除了前面还是 IP,ICMP 的前 8 字节不变,后面则跟上出错的那个 IP 包的 IP 头和 IP 正文的前 8 个字节。
Traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。 Traceroute 的参数指向某个目的 IP 地址,它会发送一个 UDP 的数据包。将 TTL 设置成 1- Traceroute 程序会发送一份 UDP 数据报给目的主机,但它会选择一个不可能的值作为 UDP 端口号(大于 30000)。当该数据报到达时,将使目的主机的 UDP 模块产生一份“端口不可达”错误 ICMP 报文。
- Traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU。要做的工作首先是发送分组,并设置“不分片”标志。发送的第一个分组的长度正好与出口 MTU 相等。如果中间遇到窄的关口会被卡住,会发送 ICMP 网络差错包,类型为“需要进行分片但设置了不分片位”。其实,这是人家故意的好吧,每次收到 ICMP“不能分片”差错时就减小分组的长度,直到到达目标主机。