📅  最后修改于: 2020-11-10 05:54:28             🧑  作者: Mango
ICMP代表Internet控制消息协议。它是网络层协议。它用于网络层中的错误处理,并且主要用于路由器等网络设备上。由于网络层中可能存在不同类型的错误,因此可以使用ICMP报告这些错误并调试这些错误。
例如,某个发件人想将消息发送到某个目标,但是路由器无法将消息发送到该目标。在这种情况下,路由器会将邮件发送到发件人,我无法将邮件发送到该目的地。
IP协议没有任何错误报告或错误纠正机制,因此它使用一条消息来传达信息。例如,如果某人将消息发送到目的地,则消息在发送方和目的地之间以某种方式被盗。如果没有人报告该错误,则发件人可能认为该邮件已到达目的地。如果中间的人报告该错误,则发件人将非常快速地重新发送邮件。
ICMP驻留在IP层中,如下图所示。
ICMP消息通常分为两类:
错误报告消息意味着路由器在处理IP数据包然后报告消息时遇到问题。
查询消息是帮助主机获取另一主机的特定信息的那些消息。例如,假设有一个客户端和一个服务器,并且客户端想知道该服务器是否处于活动状态,那么它将ICMP消息发送到该服务器。
消息格式有两件事:一种是告诉我们它是哪种消息的类别。如果该消息属于错误类型,则该错误消息包含该类型和代码。类型定义消息的类型,而代码定义消息的子类型。
ICMP消息包含以下字段:
注意:ICMP协议始终将错误消息报告给原始源。例如,当发送者发送消息时,如果消息中发生任何错误,则路由器将向发送者而不是接收者报告,因为发送者正在发送消息。
错误报告消息大致分为以下几类:
数据包未到达目标时,将发生目标无法到达错误。假设发送者发送了消息,但是消息没有到达目的地,则中间路由器向发送者报告目的地不可达。
上图显示了目标不可达消息的消息格式。在消息格式中:
类型:定义消息的类型。数字3指定目的地不可访问。
代码(0到15):它是4位数字,用于标识消息是来自中间路由器还是目的地本身。
注意:如果目的地创建了目的地不可达消息,则代码可以是2或3。
有时目标不希望处理该请求,因此它将目标不可达消息发送到源。路由器无法检测到所有阻碍数据包传递的问题。
网络层或IP协议中没有流控制或拥塞控制机制。发送方只考虑发送数据包,发送方不考虑接收方是否准备好接收那些数据包,或者网络层是否发生拥塞,因此发送方可以发送较少数量的数据包,因此没有流量控制或拥塞控制机制。在这种情况下,ICMP提供反馈,即源猝灭。假设发送方以较高的速率重新发送数据包,并且路由器无法处理较高的数据速率。为了克服这种情况,路由器发送源终止消息,通知发送方以较低的速率发送数据包。
上图显示了源淬灭消息的消息格式。这是4类消息,代码为零。
注意:源终止消息会通知发送方,由于网络层发生拥塞,数据报已被丢弃。
因此,发送者必须停止或减慢数据报的发送,直到减少拥塞为止。路由器为每个由于网络层拥塞而被丢弃的数据报发送一个源查询消息。
有时,当发送方和接收方之间存在许多路由器时,就会出现这种情况。当发送方发送数据包时,它将在路由循环中移动。超过的时间基于生存时间值。当数据包通过路由器时,每个路由器会将TTL值减一。每当路由器将生存时间值降低为零的数据报时,路由器便会丢弃该数据报,并将超出时间的消息发送到原始源。
每个MAC层都有不同的数据单元。例如,某些层可以处理多达1500个数据单元,而某些层则可以处理多达300个数据单元。当从具有1500个单位的层向具有300个单位的层发送数据包时,该数据包被分为多个片段。这个过程称为碎片。这1500个单元分为5个片段,即f1,f2,f3,f4,f5,这些片段按顺序到达目的地。如果未在设置的时间内将所有片段都到达目的地,则它们将丢弃所有接收到的片段,并将超过时间的消息发送到原始源。
在分段的情况下,代码将与TTL不同。让我们观察一下超过时间的消息格式。
上面的消息格式显示,超过时间的类型为11,并且代码可以为0或1。代码0表示TTL,而代码1表示分段。在超时消息中,路由器使用代码0表示生存时间值达到零。
目的地使用代码1来表示所有片段都未在设定时间内到达。
参数问题
路由器和目标主机可以发送参数问题消息。此消息表示某些参数未正确设置。
上图显示了参数问题的消息格式。消息的类型为12,代码可以为0或1。
发送数据包后,路由表将逐渐增加和更新。用于实现此目的的工具是重定向消息。例如,A想要将数据包发送到B,并且A和B之间存在两个路由器。首先,A将数据发送到路由器1。路由器1将IP数据包发送到路由器2,并将重定向消息发送到A,因此A可以更新其路由表。
注意:重定向消息从路由器发送到同一网络上的主机。
ICMP查询消息用于错误处理或调试Internet。该消息通常用于ping消息。
回声请求和回声应答消息
路由器或主机可以发送回显请求消息。它用于向另一台主机ping消息“您还活着”。如果另一个主机还活着,则它将发送回显应答消息。路由器或接收回显请求消息的主机发送回显消息。
查询消息要点
echo-request和echo-reply消息的消息格式
上图显示了echo-request和echo-reply消息的消息格式。 echo-request的类型为8,echo-reply的请求为0。此消息的代码为0。
时间戳请求和时间戳回复消息
timestamp-request和timestamp-reply消息也是查询消息的一种。假设计算机A想知道计算机B上的时间,因此它向计算机B发送了时间戳请求消息。计算机B响应时间戳请求消息。
timestamp-request和timestamp-reply的消息格式
timestamp-request的类型为13,timestamp-reply的类型为14。此类消息的代码为0。
与时间戳请求和时间戳回复消息有关的关键点
如果发送方知道确切的渡越时间,则可以同步时钟。发送方通过接收方的时钟询问时间,然后添加时间和传播延迟。假设时间为1:00时钟且传播延迟为100毫秒,则时间将为1:00时钟加100毫秒。
有几种用于调试的工具。在本主题中,我们将学习两种使用ICMP进行调试的工具。这两个工具是ping和traceroute。我们已经了解了在回显请求和回显应答消息中执行ping操作,这些消息可检查主机或路由器是否处于活动状态或正在运行。
现在我们来看看traceroute。
Traceroute是一种工具,可跟踪IP网络上数据包从源到目标的路由。它记录了数据包从源到目的地的路由中每个跃点所花费的时间。 Traceroute使用ICMP消息和TTL值。计算出TTL值;如果TTL值达到零,则该数据包将被丢弃。 Traceroute使用较小的TTL值,因为它们会很快过期。如果TTL值为1,则消息由路由器1产生;否则,消息由路由器1产生。如果TTL值为2,则消息是由路由器2产生的,依此类推。
让我们通过一个例子来理解traceroute。
假设A和B是两个不同的主机,并且A想要将数据包发送到主机B。在A和B之间,存在3个路由器。为了确定路由器的位置,我们使用了traceroute工具。
TTL值= 1:首先,主机A将TTL值1的数据包发送到路由器1,当数据包到达路由器1时,路由器将TTL的值减1,并且TTL值变为0。在这种情况下,路由器1生成如果消息超时,主机A就会知道路由器1是路径中的第一个路由器。
TTL值= 2:当主机A将具有TTL值2的数据包发送到路由器1时,以及当数据包到达路由器1时,TTL值递减1并且TTL值变为1。然后路由器1将数据包发送到路由器2,并且TTL值变为0,因此路由器生成一条超时消息。主机A知道路由器2是路径上的第二个路由器。
TTL值= 3:当主机A将数据包的TTL值3发送到路由器1时,路由器将其值递减1,并且TTL值变为2。然后,路由器1将该数据包发送到路由器2,而TTL值变为1。然后,路由器2将数据包发送到路由器3,并且TTL值变为0。当TTL值变为0时,路由器3生成超时消息。这样,主机A是路径上的第三个路由器。