ICMP有用的相关复习

ICMP承载在IP层之上,ICMP协议提供了许多有用的工具,同时当数据通信出现错误的时候,人们也能通过ICMP回送的报文去得知到底哪里出现了问题,它还有一些特别的报文,比如可以进行源站抑制,重定向,路由选路,错误报告,路由路径的发现。可以说ICMP是一个十分常见而且十分有用的协议。

上面是ICMP的基本格式,不同的ICMP报文可能会出现不同的格式类型,首先是类型字段,它表明了ICMP报文的一个大类,代码表示着大类里面的细分,校验和是对ICMP全部内容的校验。

然后就是一些特定的ICMP格式和后面追加的数据部分。

ICMP报文根据类型字段的分类

3:目的不可达

4:源站抑制

5:重定向

11:时间超时

12:参数问题

8或0:回显请求或应答

10或9:路由器询问或通告

13或14:时间戳请求或应答

17或18:地址掩码请求或应答

ICMP报文可以对发送端错误的报文进行错误通告,但是它不会对广播,组播相关的错误报文进行通告,也不会对除了IP分片的第一片之外的分片进行通告,不会对涉及特殊地址的报文进行错误通告。

当ICMP报文在做错误报文的回应的时候,它会将出错报文的IP首部和数据的前八个字节组合在一起作为错误通告报文的数据部分,这样发送端就知道自己什么报文出现了错误,而且如果是涉及运输层以上的通信,前八个字节还会包括着运输层的端口信息,这样可以进行更加细致,准确的处理。

ICMP目的不可达报文

这是最为常见的一种报文,它的类型是3,而且它有15种的细分,也就是表明了有15种网络故障的情况。比较常见的有:

0:网络不可达

1:主机不可达

2:协议不可达

3:端口不可达

4:需要分片但设置了不分片

5:源站选路失败

12:因过滤通信被强制禁止

我们来聊聊几种错误报文出现的时机,我们知道在网络通信中如果网络不通,我们常常使用ping命令去对目标主机进行ping的测试,而在这个过程中我们常常会看见超时、主机不可达,网络不可达这些报错的信息。但是当网络中断的时候我们常常看见的是主机不可达以及超时请求。网络不可达报文出现的场景按照书上的说法是当数据报文在网络中流动的时候,当出现如因为没有路由表项无法进行报文转发这种情况的时候,路由器首先会丢弃该报文,然后回送一个ICMP网络不可达报文报文。但是我的测试是大部分情况下回应的都是主机不可达,这可能和路由器在这方面的设计有关,因为即便是回送主机不可达,又或者是网络不可达,其网络通信中断的情况还是没有改变。而超时请求这个出现的原因是没有获取到对应的arp记录,于是这些报文的二层头部无法完成封装,于是这些打算发送的报文就全部烂在发送端的肚子里了。于是就出现超时请求。

至于协议不可达以及端口不可达。我的理解是这样的,如果端口开启了,但是协议本身工作异常那么就会回送协议不可达,如果端口和协议都没有开启,也就是说我们发送的请求包针对是一个空的端口,那么就会回送一个端口不可达的报文信息。

如果在路由器或者说防火墙上面有设置对应的条目去限制报文的转发,那么就会回送一个因过滤通信被强制禁止的错误通告。

虽然它的报文出错的种类十分的多,但是格式都是一致的,首先是类型3,错误情况的细分代码,ICMP报文全部的校验和,加上4字节的未使用的字段和出错报文的IP首部和8字节的数据部分。

路由重定向报文

重定向的ICMP包主要出现场景就是网关设置错误了,比如说像下面的情况。

重定向的正确构造:

主要原理:通过动态路由协议使得上图中的路由器具备全网网络的路由信息,当主机发送一个跨网段的数据包后,它会发送给网关去处理,而该主机的网关人为地设置为R1,然后我们的数据包的目的地址是R4,所以当数据包发送给R1,路由器会发送重定向报文,希望主机将报文发送给R3,这样才能使得报文得到答复。

重定向报文可以这样理解,就是在路由器的知道有另一个路由器的是更好的,它就会发送重定向的报文,并在里面包含着它的更优路由器的IP地址。

但是需要注意,这个更优的IP地址必须与发送者的IP是同网段的,而且不能是它自己。

但是这种重定向的功能也很有可能被人利用,使得主机的网关被随意的修改。

 

上面是重定向报文的格式,可以看见它的Type类型是5,code是1,数据部分与目标不可达类型的报文一样,是IP首部加上前8个字节的数据部分。

ICMP时间超时

ICMP的超时错误通告报文的类型字段的值是11,它的code有两种一个是0代表它是TTL超时,另一个是1,代表的是分片重组超时,这两个code的含义都很好理解。

时间超时的报文其实也很简单它和目标不可达报文的格式也是相同的,只不过type字段修改了,然后里面的code代表不同的含义。

ICMP源站抑制

拥塞控制主要用于当链路上的数据流量过大的情况,路由器向源主机发送源站抑制报文,希望它将数据的发送慢一点。

格式与时间超时相同,不过type为4,code为0.

ICMP查询报文

ICMP查询报文主要是用于网络信息的查询与请求,这也是一种十分常见的报文,它使用了基本格式中未使用的4个字节,分为两个部分,每个部分2个字节,第一个部分表示标识,第二个表示序列号,标识是发送该报文的进程号,序列就是发送的序号,这两个部分对一次的ICMP交互进行标识。

上面是报文的格式,请求的type值是8,回应是0,代码只有一个0。

时间戳请求和应答以及掩码请求和应答

一个是通过ICMP的报文去获取两个主机之间的时间差,由此去进行时间的同步。另一个是用于无盘工作站去获取IP地址的掩码。它们的格式与回显请求和应答类似,同样有标识符和序号,不过数据部分承载的是对应的信息,比如时间信息,地址掩码信息。

ping命令的-j选项相关拓展与实验

  1. 使用ping命令 -j方式去控制报文传送路径,试图获取重定向报文

  1. 实验方式:通过ping命令-j选项去控制报文的传输从一个短路径转移到一个长路径上。由此引诱路由器发送一个重定向报文
  2. ping -j工具的使用方式:ping -j 路由器1指定的发包口 路由器2指定的发包口...目的地址
  3. 实验结果:虽然这个情景看似非常理想,但是却忽略了-j选项的工作原理。其工作原理如下:

它通过修改ICMP包中IP层的头部,结合一系列的工作,起到一个十分巧妙的报文传输控制。上图是我在主机与网关之间的路径上捕捉到的报文

如图所示,原本的destination IP字段被修改为Current ip,Current IP字段代表我如果要发送这个报文,那么我必须根据这个指定IP,从配有这个指定IP接口上发送出去。同时我们还需关注下面的选项字段,里面需要注意的地方是Pointer指针下面的几个字段,下面标注了在报文发送过程中,每个路由器发送报文要使用的IP接口。比如结合上图我们就知道,当该报文到达网关后,该网关该使用配有11.0.0.1IP地址的接口进行转发。然后网关的下一条要使用配有11.0.1.1IP地址的接口对该报文进行转发。当路由器使用了报文中指定的IP地址IP接口进行转发后,它就会将对应的条目从IP选项中剔除,然后每个路由器都会这样工作,直达被目的主机接受。里面的内容还有很多,先说这么多。

我们从上面的工作原理就知道,路由器只是一昧的配合报文的内容去进行转发,可以用傀儡去形容,所以即便在上面的拓扑中它知道有更短的路径,它也不会发送重定向报文,因为这个要求是你提出来的,是你要求往这条路径进行报文传输,那么我肯定没有必要去对你进行纠正。实验失败。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mllllk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值