ICMP:Internet控制报文协议

ICMP报文通常被IP层或更高层使用:

  

ICMP报文:

         所有报文的前4个字节类型都一样(各类型ICMP报文值不同),剩下的字节类型则互不相同


ICMP类型

         不同的类型由报文中的类型字段和代码字段来共同决定

         ICMP分为查询报文和差错报文,因为对ICMP差错报文要进行特殊处理。

                   例如在对差错报文进行响应时,永远不会生成另一份ICMP差错报文

                                                    

 

 

         下面各种情况都不会导致产生ICMP差错报文:

                   1、ICMP差错报文(但是,查询报文可能产生差错报文的)

                   2、目的地址是广播地址或多播地址的IP数据包

                   3、作为链路层广播的数据报

                   4、不是IP分片的第一片

                   5、源地址不是单个主机的数据报。即源地址不为零地址,环回地址,广播地址,多播地址。

         这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。

 

 

ICMP地址掩码请求

         用于无盘系统在引导过程中获取自己的子网掩码

         通过广播该请求(与RARP获取IP类似)

         这里提到广播的一种特性: 发送主机也能通过某种内部环机制收到一份­广播报文拷贝(由于术语广播是指局域网上所有主机,因此必须包括发送主机在内)

    

ICMP时间戳请求与应答

         允许系统向另一个系统查询当前的时间

         提供了毫秒级的分辨率,而利用其他方法从别的主机获取时间只能提供秒级的分辨率

         报文结构如下:

 

请求端填写发送时间,然后发送报文。应答系统接收到请求报文时填写时间戳,在发送应答时填写发送时间戳。

但是,实际上大多数实现把后面两项设置为相同的值

 

 

ICMP端口不可达差错

         端口不可达报文一种ICMP差错报文,是ICMP目的不可达报文中的一种,我们使用UDP来查看他

         UDP的规则之一是,如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文(书中使用TFTP强制生成一个端口不可达报文)

         一个ICMP端口不可达差错是立即返回的,但是TFTP客户端看上去却忽略了这个报文

         要注意的是,ICMP报文时在主机之间交换的,而不用目的端口号。

    

 

         ICMP的一个规则是,ICMP差错报文必须包括生成该差错报文的数据报IP首部,还必须至少包括跟在该IP首部后面的8个字节包含UDP的首部

         根据ICMP规则,我们也可以发现8个字节的UDP首部内容是源端口号和目的端口号,而且就是由于目的端口号才导致了ICMP的不可达差错报文。既然如此,接收ICMP的系统就可以根据源端口号来把差错报文和某个特定的用户进程关联起来(这里就是TFTP)

         那为什么导致差错报文的数据报的IP首部也要被送回来呢,因为IP首部中包含了协议字段,使得ICMP得以知道如何解释跟在后面的8个字节(我们其实也会发现,TCP首部的前8个字节也包含了源端口和目的端口号)

 

         ICMP不可达报文的一般格式如下:

 

在刚开始的各种类型ICMP报文表中,有16种不同类型的不可达报文。

另外,尽管这里图中指出ICMP报文中的第二个32bit字节必须为0,但是当代码为4(需要分片但设置了不分片比特)的时候,路径MTU【注:路径MTU即为两台通信主机路径中的最小MTU】发现机制却允许路由器把外出接口的MTU填写在这个32bit字的低16bit中。

                                                     

         当ICMP差错报文返回时,为什么TFTP依旧重新发送请求呢?这事因为BSD系统从不把从插口(socket)接收到的ICMP报文中的UDP数据通知进程,除非该进程是connect的。然而标准的TFTP并不connect,因此永远不会受到ICMP差错报文通知。

 

 

下面是ICMP报文的4.4BSD处理方式

         在一个给定的系统中,对每个ICMP报文的处理都是不同的,这里提供4.4BSD系统对于ICMP报文的处理方式

 

 

 

课后:

         1、在开始处,我们提到了5种不发送ICMP差错报文的条件。如果这些条件不满足,而我们又在局域网上向一个似乎不存在的端口号发送一份广播 U D P数据报,这时会发生什么样的情况?

         答:如果在局域网线上有一百个主机,每个都可能在同一时刻发送一个 I C M P端口不可达的报文。很多报文的传输都可能发生冲突(如果使用的是以太网),这将导致1秒或2秒的时间里网络不可用

 

 

         2、阅读RFC 1349[Almquist 1992],看看I P的服务类型字段(见图3 - 2)是如何被I C M P设置的?

         答: 如我们在图3 - 2所指出的,发送一个 ICMP差错总是将TOS置为0。发送一个ICMP查询请求可以将TO S置为任何值,但是发送相应的应答必须将 TOS置为相同的值。


         3、IP数据报分片后,IP数据报中的选项字段是否被复制到每个分片?

   答:不严格的和严格的源站选路选项被复制到每一个数据报片中。时间戳选项和记录路由选 项没有被复制到每一个数据报片中—它们只出现在第1个数据报片中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值