Internet控制报文协议

首先,我们必须先清楚,IP协议本身没有为终端系统提供直接的方法来发现那些发往目的地址失败的IP数据包,并且IP没有提供直接的方式来获取诊断信息,那么我们的故事来了。

Internet控制报文协议(ICMP)腾空而出,与IP结合使用,提供了与IP协议层配置和IP数据包处置相关的诊断和控制信息,即它负责传递可能需要注意的差错和控制报文。ICMP表明了某些类别的故障和配置信息,但是并不为IP网络提供可靠性。

注意:我们常见的丢包(路由器缓冲区溢出)并不会触发任何的ICMP信息。


在IPv4和IPv6中的封装

ICMP报文是在IP数据包内被封装传输的。

如图所示:

ICMP报文封装在IPv4和IPv6的内部,即在其头部后面。ICMP头部包含了整个ICMP数据段的校验和。

下图表示了报文的格式

我们可以了解到:

  • 类型字段长8位,ICMPv4为其保留42个值,但是只有8个常用,下文会提到。
  • 代码字段长8位,每个类型有不同的代码,代表不同的含义
  • 校验和长16位,涵盖了整个报文

如果一个ICMP报文校验和错误,显然是要被丢弃的;

同时这边给出中文版一个蹩脚的翻译 :没有ICMP报文可以表示收到的ICMP报文中的校验和是错误的。 原版本的翻译是: there is no ICMP message to indicate a bad checksum in a received ICMP message,较为顺口的翻译应该是,在收到的ICMP报文中没有指示校验和错误的ICMP报文,即ICMP的报文不会去指错另一个ICMP的报文。


ICMP报文

ICMP报文可以分为两大类:

  • 有关IP数据包传递的ICMP报文(差错报文
  • 有关信息采集和配置的ICMP报文(查询或信息类报文

信息类报文包括回显请求和回显应答,以及路由器通告和路由器请求。

最常见的差错报文类型包括目的不可达,重定向,超时,和参数问题。

关于类型字段以及类型所使用的代码号表格在书本250页均有,这边不再强调


下面进一步讨论差错报文常用的类型:

目的不可达(ICMPv4类型3,ICMPv6类型1)和数据包太大(ICMPv6类型2)

目的不可这种类型的报文用来表示数据包无法送达目的地,其主要可细分成:

  • 主机不可达(ICMPv4代码1)和地址不可达(ICMPv6代码3)

    • 由路由器或主机产生,直接交付的时候由于某种原因无法到达目的地,例如主机关闭
  • 目的无路由(ICMPv6代码0)
    • 出现在到达数据包不必采用直接交付的方式来转发,但没有路由条目指定下一跳路由地址
  • 管理禁止通信(ICMPv4代码3)和目的管理禁止通信(ICMPv6代码1)
    • 通常是防火墙故意丢弃流量导致
  • 端口不可达(ICMPv4代码3)和端口不可达(ICMPv6代码4)
    • 当传入数据报的目的应用程序还没有准备好接收,就生成端口不可达报文

数据包太大(PTB):

如果一个IPv4路由器收到一个数据报大于选定的传出网络接口的MTU, 则其需要分片,但如果IP头部设置了不分片位字段,则其被丢弃。同时,产生ICMPv4目的不可达(PTB)报文,该报文能将下一跳的MTU包含在其中。

picture

而在ICMPv6中,因为IPv6只有数据包的发送者才能执行数据包分片,所以只产生ICMPv6目的不可达(PTB)报文,该报文能将下一跳的MTU包含在其中。


重定向(ICMPv4类型5,ICMPv6类型137)

当路由器收到一个来自主机的不是给自己的数据报时,转发数据报到下一跳更好的路由,同时,路由器发送一个重定位报文到主机,使其更新路由表,这样下一次数据报直接就会到新定义的节点上。如图所示:

重定向报文包含了数据报下一跳正确路由器的IPv4地址。如图

超时(ICMPv4类型11,ICMPv6类型3)

当由于TTL或跳数限制字段值调小致使路由器丢弃报文时,产生ICMP超时报文

一个工具:traceroute工具,被用于确定发送者到目的地路径上的路由器。

工作方式:

  1. TTL置1
  2. 发送数据报,接收路由器的ICMP超时报文,如果该路由为最终路由则停止。
  3. TTL+=1
  4. 转回第二步

参数问题(ICMPv4类型12,ICMPv6类型4)

当一个主机或者路由器接收到一个IP数据报,其IP头部存在不可修复的问题时就会产生一个ICMP参数问题报文。一个特殊的参数报文指针字段只是了错误字段相对于出错的IP头部的偏移值。


下面进一步讨论信息类报文常用的类型:

回显请求/应答(ping)(ICMPv4类型0/8,ICMPv6类型129/128)

原理,收到ICMP回显请求报文后,ICMP要求将任何接收到的数据返回给发送方。报文格式如下

其中,标识符字段可以让发送主机利用,借此分离返回的应答。

当一个ping实例运行的时候,序列号从0开始,每发送一个回显请求报文便加1.
ping打印出每个返回的数据报的序列号,方便用户查看数据报是否丢失等。

路由器发现:路由器请求RS和通告RA(ICMPv4类型9,10)

首先定期使用TTL=1,对本地网络的所有主机组播(224.0.0.1)。使用RS报文发送到所有路由器组播地址(224.0.0.2),路由器发现的主要目的是让一台主机学习到它所在本地子网中的所有路由器,这样让他选好出一个默认的路由。


处理ICMP报文

传入的信息类请求将被操作系统自动处理,而差错类报文传递给用户进程或传输层协议

特例:重定向报文将导致主机路由表中的自动更新,目的不可达报文用于路径MTU发现机制(PMTUD)。这一般由传输层协议来实现。


ICMP差错报文

限制生成的ICMP差错报文的元婴是限制生成所谓的广播风暴,ICMPv4有以下情况:

  • ICMPv4差错报文
  • 目的地址是IPv4广播或组播地址
  • 作为链路层的广播数据报
  • 不是第一个分片的其他分片
  • 源地址为环回地址,广播或组播地址,零地址。

ICMPv6有以下情况:

  • ICMPv6差错报文
  • ICMPv6重定向报文
  • 目的地址是IPv6的组播地址数据报(除PTB和参数问题报文)
  • 链路层广播组播的数据包
  • 源地址为未指定或组播地址,或者任意为发送者所致的选播地址

限制ICMP报文数据的方法是使用令牌桶
每个桶保留最大数量的令牌,每个令牌允许一定数量的报文被发送。桶定期被新的令牌填充。每发送一个报文就减一,

一个概念:当发送一个ICMP差错报文的时候,它包含了一个完整的源自“违规”或者“原始”数据包的IP头部副本,再加上原始数据报的IP有效载荷区中的任何其他数据。


第八章 Internet控制报文协议的更多相关文章

  1. 《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  2. ICMP Internet控制报文协议

    ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制消息是指网 ...

  3. TCP/IP详解学习笔记(5)-- ICMP:internet 控制报文协议

    1.概述      ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制 ...

  4. ICMP:Internet控制报文协议

    ICMP:Internet控制报文协议. 是IP层的组成部分.传递差错报文或其他信息. ICMP报文被封装在IP数据报内部: 详细格式例如以下所看到的: 个字段含义例如以下: 8位类型. 表示该ICM ...

  5. ICMP:internet 控制报文协议

    ICMP:internet 控制报文协议 1.概述      ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个 ...

  6. 《TCP/IP 详解 卷1:协议》第 8 章:Internet 控制报文协议

    路由器是 Internet 的重要组成部分,严密监视 Internet 的操作.IP 协议未给发送失败的 IP 数据包提供一种错误处理,也没有给端系统提供直接的方法来发现错误.为了解决这一不足之处,I ...

  7. TCP/IP详解 卷一(第六章 ICMP:Internet控制报文协议)

    ICMP是(Internet Control Message Protocol)Internet控制报文协议. 用于在IP主机.路由器之间传递控制消息.控制消息是指网络通不通.主机是否可达.路由是否可 ...

  8. TCP/IP详解,卷1:协议--第6章 ICMP:Internet控制报文协议

    引言 I C M P经常被认为是 I P层的一个组成部分.它传递差错报文以及其他需要注意的信息. I C M P报文通常被I P层或更高层协议( T C P或U D P)使用.一些I C M P报文把 ...

  9. TCP/IP 笔记 - ICMPv4和ICMPv6 : Internet控制报文协议

    ICMP是一种面向无连接的协议,负责传递可能需要注意的差错和控制报文,差错指示通信网络是否存在错误(如目的主机无法到达.IP路由器无法正常传输数据包等.注意,路由器缓冲区溢出导致的丢包不包括在ICMP ...

随机推荐

  1. C#中索引器的实现过程,是否只能根据数字进行索引?

    描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,  使程序看起来更为直观,更容易编写,可以用任意类型.

  2. angular2中一种换肤实现方案

    思路:整体思路是准备多套不同主题的css样式.在anguar项目启动时,首先加载的index.html中先引入一套默认的样式.当我们页面有动作时再切换css.  可以通过url传参触发,也可以通过bu ...

  3. C-net总结

    SMB服务器信息块   DHCP动态主机配置协议 STMP简单邮件传输协议 POP(邮件协议) Gnutella   网络分析数据   nslookup DNS(域名系统)  请求注释(RFC)文件 ...

  4. XCode快捷键使用

    :first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...

  5. 关于Vue 兄弟组件通信

    最近项目中遇到希望在操作路由组件里面内容的时候可以影响共用组件Header组件(这个其实就是他的兄弟组件)的操作.  意思就是 router-view指向的router来影响Header组件的信息 首 ...

  6. Orcale(一)

    oracle数据库基本语句查询 ORacle-12560:TNS 协议配置器错误 1.服务:1.监听服务未开启 2.服务器未开启 3.环境变量:Oracle_sid = orcl 4.regedit注 ...

  7. python__高级 : @修饰器(装饰器)的理解

    以下是第一次了解的时候写的东西,有的地方理解不正确,虽已改正但是太片面,请直接看下面第二次修改加上的内容. ---------------------------------------------- ...

  8. 两种查看SIP版本的方法python

    第一种:进入python命令行 print(sip.SIP_VERSION_STR) 注意对应的PyQt版本号和大小写 print(PyQt5.sip.SIP_VERSION_STR) 第二种:直接在 ...

  9. 36-应用Jwtbearer Authentication

    新建.net core webapi项目 E:\coding\netcore>dotnet new webapi --name JwtAuthSample 创建需要用到的实体对象类 namesp ...

  10. 关于RTKLIB资料整理和学习

    最近要做一个关于rtk的项目,采用rtklib源码基础上进行移植,由于我在嵌入式方面和rtk方面都是小白,所以无论是嵌入式通信还是rtk都得从头学起.嵌入式方面打算用stm32进行移植,现在已经基本掌 ...