《趣谈网络协议》读书笔记(三):ICMP协议与ping命令

概述

此文为极客时间趣谈网络协议第二模块“从第二层到第三层”中,第三节的学习笔记。

主要内容包括 ICMP 协议中的查询报文与差错报文,ping 命令的整个执行过程,Linux 的Traceroute命令是如何通过差错报文获取网络状态的。

一、ICMP协议

一般情况下,我们想要知道网络是否畅通,或者服务器是否正常运行,会使用 ping 命令,而 ping 命令依赖的协议就是 ICMP 协议

ICMP 协议全程为 Internet Control Message Protocol,即互联网控制报文协议。它是介于 IP 层与 TCP 层之间的协议,一般认为属于 IP 层协议,也就是网络层协议。它被封装在 IP 包中,IP 协议用它来与其他主机交换错误报文或者一些其他的网络情况。

img

ICMP 报文有两种类型,一种是查询报文,比如 ping 命令;另一种是差错报文。

1.查询报文

ping 命令是查询报文一种,是一种主动请求,并且获得主动应答的 ICMP 协议,它在后面加了自己的格式。

对 ping 命令的主动请求进行网络抓包,称为 ICMP ECHO REQUEST,同理,响应则称为 ICMP ECHO REPLY。

比起原生的 ICMP,ping 里面多了两个字段,即标识符和序号。其中,序号一般用于连续发送多个数据包的情况,如果返回的数据包跟序号对不上,则说明有数据包未抵达。

除此之外,数据包中还会存放请求的发送时间,用于计算数据包的往返时间 TTL。

2.差错报文

根据差错报文的不同类型,可以表示不同的错误。其中,终点不可达为3,源抑制为4,超时为11,重定向为 5:

  • 网络不可达(1):又分一下五种情况:
    1. 网络不可达,代码为0,
    2. 主机不可达,代码为1,
    3. 协议不可达,代码为2,
    4. 端口看不可达,代码为3,
    5. 需要进行分片但是设置了不分片位,代码为4;
  • 源站抑制(4):让源站放慢发送速度;
  • 时间超时(11):网络包超过生存时间了但是仍然未抵达;
  • 路由重定向(5):让网络包下一次转发到另一个路由器。

差错报文相对查询报文的头,IP 和 ICMP 的前8字节不变,但是后面会跟上错误的包的 IP 头与 IP 正文的前八个字节。

二、ICMP协议的使用

1.查询报文的使用

以下为 ping 的发送和接收过程:

img

当我们以 IP 为192.168.1.1的机器去 ping IP 为192.168.1.2 的机器的时候,会发生以下流程:

  • IP 为192.168.1.1的源主机构建一个 ECHO REQUEST 类型的 ICMP 请求包,类型字段为8,里面还有发送时间与数据包序号,随着发送次数递增。
  • 请求包进入 IP 层,IP 头添加源 IP 与目标 IP,封装为 IP 包;
  • IP 包进入 MAC 层,MAC 头添加源 MAC 和目标 MAC,若不知道目标 MAC 就会发起 ARP 请求获取源 MAC,接着封装为一个数据帧,通过数据链路层发出去。

然后数据包经过交换机到达 IP 为 192.168.1.2的机器,接着:

  • 目标主机检查数据帧,发现目标 MAC 是自己的,于是将 IP 包提出来,交给 IP 层处理;
  • IP 层检查 IP ,发现是自己的,然后把 ICMP 请求包提出来,交给同层的 ICMP 协议处理;
  • ICMP 构建一个 ECHO REPLY 类型的 ICMP 应答包,类型字段为0,顺序号为接到的数据包的顺序号,然后走流程发给 IP 为 192.168.1.1的主机。

然后收到响应的主机:

  • 如果规定时间内收不到响应包,说明主机不可达;
  • 如果收到响应包,则提取 ICMP 包数据,用当前时间减去数据包发出时间,得到 ICMP 数据包的延迟时间

这就是 ping 命令的整个完成过程,当网络不通的时候,可以通过依次 ping 交换机或者其他网络节点,来确定到底是哪个地方出问题了

2.差错报文在Traceroute的使用

差错报文的使用与 ping 差不多,但是 Linux 中有一个特殊的命令 Traceroute,他可以用来追踪网络包的路由路径,方式就是故意通过差错报文一步一步“试探”,得到具体信息。

确认路由节点和主机是否存在

Traceroute可以为网络包设置特殊的 TTL,比如1,而到达第一个路由器节点时,TTL 就会 -1,然后路由器发现此时 TTL 为0,就会返回一个时间超时的错误差错报文,主机收到了差错报文,就可以知道路由器节点确实是存在的

接着 Traceroute将 TTL 设置为2,去试探下一个路由节点是否存在,以此类推,直到最后找到目标主机为止。

Traceroute发送的网络包接收端口号故意设置为一个一般不会被使用的端口,比如30000以上,这样收到包的目标主机就会返回返回一个端口号不可用的错误报文,从而确定目标主机也是存在的

确认路径 MTU

前面我们知道,网络协议会有一个最大传输单元 MTU(Maximum Transmission Unit),它表明了协议能够允许传输的最大数据。如果数据太大,就需要分片多次传输,而 Traceroute 会故意设置不分片,当数据包因为 MTU 过大而返回需要进行分片但是设置了不分片位的差错报文之后,再减小分组长度,重复上述过程指导抵达目标主机。

在这一过程中,通过Traceroute就能了解到路径上各个协议的 MTU 大小是多少。

三、总结

查询报文

ICMP 协议是一个被 IP协议所包含的数据链路层协议,他的报文分为查询报文和差错报文。我们熟悉的 ping 命令就是查询报文的一种。

当我们使用 ping 命令的时候会发起 ICMP ECHO REQUEST,里面会携带发送时间,报文类型,数据包序号,响应主机会返回 ICMP ECHO REPLY,源主机收到响应以后,通过数据包序号和发送时间,就可以得知丢包情况和延迟情况。

差错报文

Traceroute是 Linux 下一个用于获取网络情况的命令,它通过故意发送参数错误的数据包,从而了解路径上节点存在情况和路径 MTU 。

0%