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. JavaEE权限管理系统的搭建(三)--------springmvc和mabatis整合环境搭建

    本节介绍如何环境的搭建和配置: 首先要在父工程引入jar包依赖: <!-- 通过属性定义指定jar的版本 --> <properties> <spring.version ...

  2. 旧文备份:对象字典0x1005和0x1006的理解

    SYNC不一定由主站产生,因此,产生SYNC的节点,0x1005对象的值一般是0x40000080,第30位为1表示本节点产生 SYNC,而本节点的0x1006对象就是产生同步周期值了;而接收SYNC ...

  3. C#面向对象的基本概念

    “面向对象=对象+类+继承+通信”.如果一个软件系统使用了这样四个概念进行设计和实现,我们就可以认为这个软件系统是面向对象的. 一.一切都是对象 1. 对象概述 对象可以表示几乎所有的实物和概念.比如 ...

  4. css的position定位终极总结

    relative相对定位是相对于自己的位置定位,absolute绝对定位是向上级一级一级搜索有position属性的div,如果没有找到就相对于body定位

  5. Awt & Swing

    AWT 是抽象窗口组件工具包,是 java 最早的用于编写图形节目应用程序的开发包. Swing 是为了解决 AWT 存在的问题而新开发的包,它以 AWT 为基础的. 具体的说就是: AWT 是Abs ...

  6. 时间戳与QDateTime相互转换

    最近项目中需要将日期时间输出到Excel中,程序使用Qt开发,使用第三方库QtXlsx进行Excel读写操作.Excel中第一列为时间,时间间隔为1小时,如图所示. 赋值起始时间stDTime,则后续 ...

  7. JSON后台处理特殊字符方法,在JSONArray.fromObject转换时处理

    /** * 替换一个字符串中的某些指定字符 * @param strData String 原始字符串 * @param regex String 要替换的字符串 * @param replaceme ...

  8. php-语言参考-基本语法3.1

    一,PHP代码的开始和结束标记 1,<?php 和 ?> //重点 2,<script language="php"> 和 </script> ...

  9. Python学习第一弹

    开发语言: 高级:Python.java.PHP  C#   GO  ruby   C++           ——>字节码   低级:C.汇编                          ...

  10. Leetcode 173. 二叉搜索树迭代器

    题目链接 https://leetcode.com/problems/binary-search-tree-iterator/description/ 题目描述 实现一个二叉搜索树迭代器.你将使用二叉 ...