Ping与Traceroute

Ping与Traceroute

Ping

Ping用于测试目的主机是否可达。如果目的主机设置了防火墙,会导致ping失败。
ping是基于ICMP协议实现的,不是基于TCP也不是基于UDP,曾经面试被忽悠过
Ping发送一份ICMP回显请求报文给目的主机,并等待返回ICMP回显应答报文
Ping与Traceroute

Unix系统在实现ping程序时会把标识符设置成发送进程的ID号,为了同一台主机可以运行多个ping程序

ping程序在ICMP报文数据中存放发送请求的时间,收到应答报文时即可得到往返时间

如果我们ping一个url,比如“ping www.baidu.com”返回的信息中会有IP地址,说明在ping之前先做了一次dns

ping后加上参数 - R 可以查看路由(即访问目的主机的路径)这会导致ICMP回显请求报文所在的IP数据报的首部中记录了沿途的IP,具体记录在IP首部的选项字段中,最多只有40个字节
Ping与Traceroute

RFC 791[Postel 1981a]指定路由器记录出口IP地址。

一个例子
Ping与Traceroute
Ping与Traceroute

Traceroute

traceroute用于查看IP数据报从一台主机到另一台主机的路由

为什么不用ping -R 而是用traceroute查看路由的原因:

  • 并非所有的路由器都支持ping的记录路由选项
  • ping -R时目的主机必须从收到的IP数据报中提取所有沿路IP信息并复制到ICMP回显响应报文中,traceroute的目的主机不需要这种复杂操作
  • IP首部选项字段空间有限,只能存放九个IP地址,无法满足愈加复杂的网络

Traceroute原理

traceroute使用ICMP报文和IP首部中的TTL来实现记录路由功能
TTL一般初始化为255,每经过一个路由器或主机,TTL就会减一,当TTL为0时,所在路由器或主机会丢弃该IP数据报,并发送一个 ICMP超时报文 给发送端。而ICMP超时报文所在的IP数据报则给发送端提供了所在路由器或主机的IP。
traceroute发送一个UDP数据报给目的主机,并设置UDP端口为一个不可能使用的值(大于30000),一开始traceroute发送一个TTL=1的数据报,如果无法到达目的主机,返回一个ICMP超时报文,发送端拿到了网络中“第一个换乘点”的IP。接着发送一个TTL=2的数据报,如果还是无法到达目的主机,“第二个换乘点”发送ICMP超时报文给发送端。接着TTL=3 TTL=4。。。直到到达目的主机,UDP数据报到达目的主机后会发现端口不可用,会给发送端发送一个 ICMP端口不可用报文 。此时发送端到目的主机的整个路由已经清晰了,tarceroute停止增加TTL

Traceroute的例子

发送端经过路由器ABC到达目的主机,双向箭头表示两台设备之间直连,单向箭头表示IP数据报的传输,线条上面的文字开头数字表示数据报的发送顺序

Ping与Traceroute