PING

3/28/2022

# 基础-ICMP协议

ping 是基于 ICMP 协议工作的,所以要明白 ping 的工作,首先我们先来熟悉 ICMP 协议

ICMP 全称是 Internet Control Message Protocol,也就是互联网控制报文协议。里面有个关键词 —— 控制,如何控制的呢?

网络包在复杂的网络传输环境里,常常会遇到各种问题。当遇到问题的时候,总不能死个不明不白,没头没脑的作风不是计算机网络的风格。所以需要传出消息,报告遇到了什么问题,这样才可以调整传输策略,以此来控制整个局面。

img

ICMP 包头的类型字段,大致可以分为两大类:

  • 一类是用于诊断的查询消息,也就是「查询报文类型

  • 另一类是通知出错原因的错误消息,也就是「差错报文类型

img

# ping — 查询报文类型的使用

ping 命令执行的时候,源主机首先会构建一个 ICMP 回送请求消息数据包。ICMP 数据包内包含多个字段,最重要的是两个:

  • 第一个是类型,对于回送请求消息而言该字段为 8;

  • 另外一个是序号,主要用于区分连续 ping 的时候发出的多个数据包。

  1. 每发出一个请求数据包,序号会自动加 1。为了能够计算往返时间 RTT,它会在报文的数据部分插入发送时间。

  2. 然后,由 ICMP 协议将这个数据包连同地址 192.168.1.2 一起交给 IP 层。IP 层将以 192.168.1.2 作为目的地址,本机 IP 地址作为源地址协议字段设置为 1 表示是 ICMP 协议,在加上一些其他控制信息,构建一个 IP 数据包。

  3. 接下来,需要加入 MAC 头。如果在本地 ARP 映射表中查找出 IP 地址 192.168.1.2 所对应的 MAC 地址,则可以直接使用;如果没有,则需要发送 ARP 协议查询 MAC 地址,获得 MAC 地址后,由数据链路层构建一个数据帧,目的地址是 IP 层传过来的 MAC 地址,源地址则是本机的 MAC 地址;还要附加上一些控制信息,依据以太网的介质访问规则,将它们传送出去。

img

  1. 主机 B 收到这个数据帧后,先检查它的目的 MAC 地址,并和本机的 MAC 地址对比,如符合,则接收,否则就丢弃。

  2. 接收后检查该数据帧,将 IP 数据包从帧中提取出来,交给本机的 IP 层。同样,IP 层检查后,将有用的信息提取后交给 ICMP 协议。

  3. 主机 B 会构建一个 ICMP 回送响应消息数据包,回送响应数据包的类型字段为 0,序号为接收到的请求数据包中的序号,然后再发送出去给主机 A。

  4. 在规定的时候间内,源主机如果没有接到 ICMP 的应答包,则说明目标主机不可达;如果接收到了 ICMP 回送响应消息,则说明目标主机可达。

  5. 此时,源主机会检查,用当前时刻减去该数据包最初从源主机上发出的时刻,就是 ICMP 数据包的时间延迟。

# traceroute — 差错报文类型的使用

有一款充分利用 ICMP 差错报文类型的应用叫做 traceroute(在UNIX、MacOS中是这个命令,而在Windows中对等的命令叫做 tracert )。

# 作用一:追踪经过的路由数

traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。

它的原理就是利用 IP 包的生存期限 从 1 开始按照顺序递增的同时发送 UDP ,强制接收 ICMP 超时消息的一种方法。

比如,将 TTL 设置 为 1,则遇到第一个路由器,就牺牲了,接着返回 ICMP 差错报文网络包,类型是时间超时

接下来将 TTL 设置为 2,第一个路由器过了,遇到第二个路由器也牺牲了,也同意返回了 ICMP 差错报文数据包,如此往复,直到到达目的主机。

这样的过程,traceroute 就可以拿到了所有的路由器 IP。

发送方如何知道发出的 UDP 包是否到达了目的主机呢?

  1. traceroute 在发送 UDP 包时,会填入一个不可能的端口号值作为 UDP 目标端口号(大于 3000 )。当目的主机,收到 UDP 包后,会返回 ICMP 差错报文消息,但这个差错报文消息的类型「端口不可达」。

  2. 所以,当差错报文类型是端口不可达时,说明发送方发出的 UDP 包到达了目的主机。

# 作用二:确定路径的MTU

traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU

因为有的时候我们并不知道路由器的 MTU 大小,以太网的数据链路上的 MTU 通常是 1500 字节,但是非以太网的 MTU 值就不一样了,所以我们要知道 MTU 的大小,从而控制发送的包大小。

它的工作原理如下:

  1. 首先在发送端主机发送 IP 数据报时,将 IP 包首部的分片禁止标志位设置为 1。根据这个标志位,途中的路由器不会对大数据包进行分片,而是将包丢弃。

  2. 随后,通过一个 ICMP 的不可达消息数据链路上 MTU 的值一起给发送主机,不可达消息的类型为「需要进行分片但设置了不分片位」。

  3. 发送主机端每次收到 ICMP 差错报文时就减少包的大小,以此来定位一个合适的 MTU 值,以便能到达目标主机。

Last Updated: 3/28/2022, 10:41:34 PM