计算机网络 (10) 网络层-网际控制报文协议ICMP

183 阅读4分钟

本文引用图片均来自 高军: 计算机网络

报文

ICMP(Internet Control Messages Protocol)主要用于更有效的转发IP数据报和提高交付成功的机会(不可靠传输),ICMP报文封装在IP数据报中,主机或路由器使用ICMP发送差错报告报文询问报文

差错报告报文

ICMP差错报告报文有以下几种:

  1. 终点不可达
  2. 源点抑制
  3. 时间超过
  4. 参数问题
  5. 改变路由(重定向)

终点不可达: 当路由器或主机不能交付数据报时就向源点发送终点不可达报文,终点不可达具体可细分为目的网络不可达、目的协议不可达等13种错误

如下例中,主机H1向主机H2发送报文,当报文到达路由器R1时,如果R1的路由表找不到前往H2的下一跳,也没有特定主机路由等配置,那么R1就不知道如何转发数据报,此时R1只能丢弃数据报并向H1发送终点不可达报文

image.png

源点抑制: 当路由器或主机因拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢

如下例中,主机H1向主机H2发送报文,H2拥塞忙碌处理不过来便丢弃报文并向H1发送源点抑制报文

image.png

时间超过: 路由器转发数据报前会将其中的TTL字段的值减一,如果TTL减为0则将报文丢弃并向源点发送时间超过报文。另外,如果终点在协议规定的时间内没有接收到分片数据报的全部分片那么会导致数据报重组失败,此时也会向源点发送时间超过报文

image.png

参数问题: 当路由器或主机收到数据报后根据其首部检验和字段发现首部在传输过程中发生了误码,那么它将丢弃报文并向源点发生参数问题报文

image.png

改变路由(重定向): 路由器将把改变路由报文发送给主机,让主机知道下次应该把报文发给别的路由(更优路径)

如下例中,主机H1向主机H2发送数据报,主机指定路由器R1为默认网关所以数据报先被R1接收。R1查询路由表后知道选择路径R4-R5是最优的,当R1将数据报转发给R4时发现报文需要从刚才其被接收的端口发送出去,此时R1就向H1发送改变路由报文H1,H1收到路由改变报文后就记录下来并在下次将发往H2的报文直接发给R4

image.png

以下情况不应发送ICMP差错报告报文:

  1. 对ICMP差错报告报文不再发送ICMP差错报告报文
  2. 对第一个分片的数据报片的所有后续数据报片都不发生ICMP差错报告报文
  3. 对具有多播地址的数据报都不发生ICMP差错报告报文
  4. 对具有特殊地址(如127.0.0.00.0.0.0)的数据报不发送ICMP差错报告报文

询问报文

询问报文有两种:

  1. 回送请求和回答:ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达及了解有关状态
  2. 时间戳请求和回答:ICMP时间戳请求报文时请某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中由一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。这种询问报文用来进行时钟同步测量时间

应用

分组区间探测 PING(Packet InterNet Groper): PING大家应该都很熟悉了,经常用来测试和目的主机之间是否畅通,其实PING就是使用了回送请求和回答报文

image.png

跟踪路由 traceroute: 用来测试IP数据报从源主机到目的主机都经过哪些路由器

image.png

路由跟踪是通过时间超过差错报告报文实现的,如下图主机H1最初发送TTL为1的ICMP报文,路由器R1收到报文后将TTl减1发现此时TTL为0,R1丢弃报文并向H1发送时间超过报文,那么H1就知道报文要经过R1。然后,H1发送TTl为2的报文,同理H1会知道报文要经过R2。如此循环往复直到H2向H1发送回应报文,H1便知道了报文经过的所有路由器

image.png

参考文献