ping 与 ICMP
日常工作中,我们在测试是否可以连接到某个域名或 IP 时,通常会使用 ping 命令:
ping 是基于 ICMP 进行工作的,ICMP 全称 Internet Control Message Protocol,意为互联网控制报文协议。
ICMP 的主要功能包括,确认 IP 包是否成功送到目标地址,通知在发送过程中 IP 包被废弃的具体原因,改善网络设置等。
在网络通信中如果某个 IP 包因为某种原因未能到达目标地址,那么这个具体的原因将由 ICMP 负责通知。ICMP 这种通知报文会使用 IP 进行发送,ICMP 报文也是封装在 IP 包里面的。
ICMP报文类型
ICMP 报文大致分为两类:一类是通知出错原因的错误消息(差错报文),另一类是用于诊断的查询消息(查询报文)。所有的报文类型如下:
其中最常见的就是类型 8 和 0,两者都是回送消息,用于进行通信的主机和路由器之间,判断所发送的数据包是否已经成功到达对端,可以向对端主机发送回送请求消息(类型8),也可以接收对端主机发回来的回送应答消息(类型0),常用的 ping 命令就是利用这个消息实现的。
ping工作原理
ping 命令执行的时候,源主机首先会构建一个 ICMP 请求数据包,ICMP 数据包内包含多个字段。最重要的是两个,第一个是类型字段,对于请求数据包而言该字段为 8;另外一个是顺序号,主要用于区分连续 ping 的时候发出的多个数据包。每发出一个请求数据包,顺序号会自动加 1。
然后,由 ICMP 协议将这个数据包连同地址 220.181.57.216 一起交给 IP 层。IP 层将以 220.181.57.216 作为目的地址,本机 IP 地址作为源地址,加上一些其他控制信息,构建一个 IP 数据包。
接下来,需要加入 MAC 头,最后将它们传送出去。
主机 B 收到数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。
主机 B 会构建一个 ICMP 应答包,应答数据包的类型字段为 0,顺序号为接收到的请求数据包中的顺序号,然后再发送出去给主机 A。
在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达(类型3);如果接收到了 ICMP 应答包,则说明目标主机可达。
为了安全起见,某些机器和设备是禁止被 ping 的,所以,ping 不通并不意味着一定是网络不通,对于禁止 ping 命令的主机,需要通过 telnet 命令测试是否可以连接。
通过traceroute诊断网络
前面提到的 ping 使用的是 ICMP 的查询报文,下面我们再来介绍一个使用 ICMP 差错报文的工具 —— traceroute。
前面我们介绍过,IP 包中有一个字段叫 TTL,它的值随着每经过一个路由器减 1,直到为 0 时该 IP 包被丢弃。此时 IP 路由器会发送一个 ICMP 超时消息给发送端主机,并通知该包已丢弃。
traceroute 正是基于这一原理,它的参数指向某个目的 IP 地址,它会发送一个 UDP 的数据包。如果将 TTL 设置成 1,也就是说一旦遇到一个路由器或者一个关卡,就会返回一个 ICMP 包,也就是网络差错包,类型是时间超时。接下来,将 TTL 设置为 2。。。如此反复,直到到达目的主机。这样,就拿到了所有的路由器 IP(不显式指定 TTL 默认返回所有中间路由器 IP):
注:中间某一跳路由器不返回 IP 地址而是 ***,说明在这一跳的路由器设置了不应答 ICMP。
在网络发生问题时,traceroute 是一个强大的诊断工具。