ICMP & ping & traceroute

ICMP

允许主机或路由器报告差错情况,提供有关异常情况的报告
作为 IP 数据报的数据部分进行发送
ICMP 报文的结构

(图片来自 谢希仁计算机网络)


ICMP 报文有两种类型,分别是差错报告报文和查询报文。

(图片来自 谢希仁计算机网络)

 

ping 命令
ping 使用了 ICMP 的查询报文(具体来说是查询报文的 ECHO Request 和 ECHO Reply)。
ECHO Request(类型码为 8) 由主机或路由器向一个特定的目的主机发出,收到此报文的目的主机必须向源主机或路由器发送 ECHO Reply(类型码为 0),这样的查询报文可以用来测试目的主机是否可达并了解目的主机的状态。

ping 命令用于测试主机之间的连通性。
工作原理:向目的主机发出 ICMP ECHO Request报文,如果目的主机正常工作且响应这个报文(有的主机处于防止恶意攻击的目的,也会忽略这个报文),就会返回 ICMP ECHO Reply 报文。
由于报文上都带有时间戳,就可以在最后计算出一系列的时间参数,显示目的主机的可达性以及网络的大致传送速率。

使用 ping 也可以看到主机到目的主机的路由(-R 参数)。

当开启 -R 选项后,IP 数据报在经过路由器的时候,会将 IP 地址放置 IP 首部中的选项字段。当数据报到达目的端时,将 IP 地址复制到 ICMP 回显应答中,当 ping 收到回显应答时,控制台打印出所有的IP地址。
过程很容易理解,但是有两个缺点。第一,ping 的 RR 选项不是所有系统都支持的。第二、保存的 IP 地址数目是有限的(因为 IP 数据包的首部长度有限,最多可以放 9 个 IP 地址)。

traceroute 命令(Windows 下面的名字叫做 tracert)
用于跟踪从源主机到目的主机所经过的路由
工作原理:
利用 UDP 数据报
先发送一个 TTL 为 1 的 UDP 数据报,当第一个路由器处理时,将 TTL 值减 1,然后丢弃该数据报,并返回一个 ICMP 超时报文,得到第一个 IP 地址;
然后再发送一个 TTL 为 2 的数据报,当到第二个路由器的时候,又返回一个 IP 地址。
重复以上步骤,我们会不断得到 ICMP 超时报文。

当目的主机收到这个数据报时,TTL 为 1,目的主机既不对 TTL 减 1,也不会进行转发,将 UDP 数据报解析之后,就会返回“端口不可达”。
traceroute 发送的 UDP 数据报端口号是大于 30000 的。如果目的主机没有任何程序使用该端口,那么主机会产生一个"端口不可达" ICMP 报文给源主机,源主机收到这个报文之后,就知道目的主机已经找到了。

利用 ICMP
出于安全考虑,很多应用服务器都不提供 UDP 服务(或者被防火墙挡掉),所以我们拿不到服务器的任何返回,程序就理所当然的认为还没有结束,一直尝试增加数据包的 TTL。
还有一种 traceroute 的实现是利用 ICMP ECHO Request(不再发送 UDP 数据报
),目的主机收到之后会回复一个 ICMP ECHO Reply,源主机就可以知道找到了目的主机。

利用 TCP

traceroute 使用:
Linux 的 traceroute 默认使用 UDP,而 Windows 的 tracert 默认使用 ICMP。

-I 表示使用 ICMP,-T 表示使用 TCP
自己电脑的测试结果:
默认使用 UDP,达到默认的 30 跳没有获得主机信息,应该是服务器不对 UDP 做出响应。

使用 ICMP

使用 TCP


注意:
traceroute 显示 * 号,表示中间经过的路由超时,这种情况下,会把 TTL 加 1,然后继续发送。

由于路由选择问题,traceroute 无法保证每次到同一个主机经过的路由都是相同的。


参考:
https://www.jianshu.com/p/75a5822d0eec

https://www.jianshu.com/p/5b7189789dc1

<<TCP/IP详解 卷1:协议>>

posted @ 2019-03-26 16:55  Ainsliaea  阅读(851)  评论(0编辑  收藏  举报