前言

输入 ping 命令,你便得到了你的设备到目标服务器的延迟。除此之外,它后面还紧跟着一个TTL值。 ping命令的背后是什么?这个TTL值又有什么意义?

pnUfVgA.png

ping 命令实际上发送了一段ICMP报文

ICMP全称控制报文协议(Internet Control Message Protocol)。它本质上只是TCP/IP协议簇的一个子协议。

一般只用来诊断网络问题、检测网络可达性还有报告错误条件,甚至Dos攻击背后也有它的身影。

ICMP 报文结构

一段ICMP 消息,首先点明其类型,其后提供错误信息的代码,再计算用于验证消息完整性的校验和,最后是包含具体的控制信息或错误数据的消息体。

pnUfZjI.png

短、固定、开销极低。这是它后面所有故事的前提。

ICMP 类型

类型上有 错误报告消息 和 查询消息 两大类,

错误报告消息:用来报告目标不可达或者超时等错误条件

查询消息:用于网络诊断,比如回显请求(Echo Request)和回显应答(Echo Reply)。

TTL:给转发次数设个上限

在ping请求中,你的设备发出一个回显请求,目标设备收到后回一个回显应答,两个时间点一减,就得到了延迟。

然而实际情况比这复杂得多,请求并不总是一触即达,有时会在层层路由转发中陷入环路,卡在一个点上死循环。

为了防止这种情况,我们要给路由一个次数上限,这就是TTL(初始值通常是 64、128 或 255)。

它每经过一次路由就减 1。直到最后减到 0还没完成请求就把包丢弃,不再往下转,并返回一个超时消息。

traceroute 对 TTL 的逆用

我们熟悉的traceroute命令就巧妙地逆用了TTL,把本用来防止包环路的TTL改造成了探针。

通过发送一段TTL为1的探测包得到第一台路由器的回复。把TTL改为2再发,得到第二台路由,以此类推,就能挖出数据包到主机间的路由路径了。

pnUfmut.png

DOS攻击最廉价的弹药

DOS攻击的背后也时常出现ICMP的身影。

发送大量回显请求轰炸目标,你就得到了 Ping Flood 。

伪装目标源地址进行广播,招来大量回显应答涌入目标,你就得到了 Smurf攻击 。

古早时期甚至可以通过发送超过IP协议允许最大长度的ICMP数据包,也就是传说中的 死亡之Ping 直接击溃系统。


总结

ICMP消息的轻便与低开销,

让它成为了网络诊断、错误报告的瑞士军刀,

也让它成为了网络攻击中最廉价的弹药。