第7讲 | ICMP与ping:投石问路的侦察兵

 2023-09-05 阅读 52 评论 0

摘要:我们常常会遇到网络不通的问题,机器明明就在那里,但你就是连不上去。这种情况该怎么办呢? ICMP协议的格式 一般情况下,你会想到ping一下,但你知道的ping是如何工作的吗? ping是基于ICMP协议工作的。ICMP全称是Internet Control Message Pr

我们常常会遇到网络不通的问题,机器明明就在那里,但你就是连不上去。这种情况该怎么办呢?

ICMP协议的格式

一般情况下,你会想到ping一下,但你知道的ping是如何工作的吗?

ping是基于ICMP协议工作的。ICMP全称是Internet Control Message Protocol,就是互联网控制报文协议。这里的控制是什么意思呢?

网络环境是异常复杂的,当网络包在传输的过程中会遇到各种问题。当遇到问题时不能不声不响,需要报告究竟出了什么问题,以便调整传输策略。这就像军队打仗的时候,都有侦察兵一样,将军需要通过侦察兵掌握敌方的情况。

ICMP报文封装在IP报文里。因为传输的时候需要源IP和目的IP地址。它本身是非常简单的。

ICMP报文有很多类型,不同的类型有不同的代码。最常用的类型是回显请求8和回显应答0。

查询报文类型

常用的ping就是查询报文,是一种发起回显请求,并获得应答的ICMP协议。

差错报文类型

这种类型的报文都是异常情况下发起的,报告产生了什么样的异常情况。

举几个ICMP差错报文的例子:终点不可达 3,源站抑制 5,超时 11, 重定向 5。

终点不可达:数据包没能送到目的地。类型是3,代码里有更详细的解释,网络不可达代码是0,主机不可达代码是1,协议不可达代码是2,端口不可达代码是3。

源站抑制:让源站放慢发送速度。就是接收方认为发送方速度太快了,来不及收取了。

时间超时:网络包的生存时间超过了设定值。

路由重定向:让下次发给另一个路由器。

差错报文,除了前面的IP和ICMP的前8字节不变,后面跟上出错的IP包的IP包头和IP正文的前8个字节。

ping:查询类型报文的使用

我们看下ping的发送和接收过程。

假设主机A的IP是192.169.1.1,主机B的IP是192.168.1.2,它们在同一个子网,那么在主机A上ping主机B的IP会发生什么呢?

执行ping命令的时候,主机A会构造一个ICMP请求包,ICMP数据包包含多个字段。最重要的字段是类型字段和顺序号。请求数据包的类型是8;顺序号是用来区分ping发出的多个数据包,每发送一个请求数据包,顺序号加1。

为了能够计算往返时间RTT,在报文的数据部分会插入发送时间。

然后,ICMP协议将这个数据包连同地址192.168.1.2一起交给IP层。IP层以192.168.1.2作为目的地址,本机IP作为源地址,构建一个IP数据包。

接下来,需要加入MAC头。如果ARP映射表中有192.168.1.2对应的MAC地址,则直接使用;如果没有需要通过ARP查询MAC地址。获得MAC地址后加上MAC头,发送出去。

主机B收到数据帧后,先检查目的MAC地址,和本地的MAC地址对比,如果相同就接收,否则就丢弃。然后检查该数据帧,然后交给IP层,IP层检查后,去掉IP头交给ICMP协议。

主机B会构建一个ICMP应答包,应答包中的类型字段为0,顺序号为收到的请求包中的顺序号。

在规定的时间内,源主机没有收到ICMP应答包,则说明主机不可达;如果收到应答包,就说明主机可达,源主机会用当前时刻减去数据包发出的时间,就是ICMP数据包的往返时间。

经常会遇到一个问题,如果不在控制范围内,很多中间设备时禁止ping 的,ping不通不代表网络不通,可以使用telnet,通过其他协议来测试网络是否通,这种情况不在本篇的讲述范围内。

Traceroute:差错报文类型的使用

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

它首先发送一个TTL为1的UDP数据包,如果中间的路由器不只一个,那么数据包在遇到第一个路由器时就丢弃该数据包,返回一个ICMP报文。然后,发送一个TTL为2的UDP数据包,那么第二个路由器会将其丢弃,并返回一个ICMP报文,如此反复,直到到达目的主机。这样Traceroute就拿到了所有路由器IP。当然,有的路由器压根不会回这个ICMP。

怎么知道UDP数据包有没有到达目的主机呢?

Traceroute程序发送一份UDP数据包给目的主机,但它会选择一个可能的值作为目的端口号(大于30000)。该数据报到达时,目的主机的UDP模块会产生一份“端口不可达”的差错ICMP报文。如果数据包没有到达,则是超时。

Traceroute的另一个作用是故意不设置分片,从而确定路径MTU。首先,发送数据包,设置不分片标志,发送第一个包长度正好与出口MTU相等。如果中间遇到窄的关口会无法通过,会返回ICMP差错报文,类型是“需要进行分片但设置了不分片标志”。每次遇到ICMP“不能分片”差错时,就减小分组的长度,知道到达目标主机。

小结:

  • ICMP相当于网络世界的侦察兵。有两种ICMP报文,一种是主动探查的查询报文,一种是报告异常的差错报文。
  • ping使用查询报文,Traceroute使用差错报文。

两个思考题:

1. 当发送的报文出问题的时候,会发送一个ICMP差错报文来报告错误,如果ICMP差错报文也出问题了怎么办?

2. 本节只说了一个局域网内的主机互相ping的情况,如果跨路由器、跨网关的过程会是怎样的?

 

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/1034.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息