通过路由器转发数据报, Internet 协议软件提供了不可靠的无连接数据报传送服务。假如路由器不能正确选择路由或传送数据报,或者它检测到一个异常条件影响它转发数据报,路由器需要通知源站 点采取措施避免或纠正出现的问题。为了使互联网中的路由器报告差错或提供有关意外情况的信息,在 TCP/IP 中设计了一个特殊用途的报文机制,称为 Internet 控制报文协议( Internet Control Message Protocol , ICMP )。它是 IP 的一部分,并在每个 IP 实现中都是必需的。

ICMP 机制

  ICMP 报文是放在一个 IP 数据报的数据部分中通过互联网的。 Internet 控制报文协议允许路由器向其它路由器或主机发送差错或控制报文, ICMP 在两台机器上的 Internet 协议软件之间提供了通信。

  最初的设计是为了允许路由器向主机报告投递出错的原因,但是 ICMP 并没有限制仅在路由器上使用。尽管限制某些 ICMP 报文的使用,但是任一台机器可以向任何其它机器发送 ICMP 报文,因此主机可以用 ICMP 与路由器或另一台主机通信。允许主机使用 ICMP 的主要优点是它为所有控制报文和信息报文提供了统一的机制。

  从技术上讲, ICMP 是一个差错报告机制。它为发生差错的路由器提供了向初始源站点报告差错的方法。虽然协议规范概要描述了 ICMP 的用途以及对差错报告可能采取措施的建议,但 ICMP 并没有全部指定对每个可能差错所产生的措施。当数据报产生差错时, ICMP 只能向数据报的初始源站点回送差错情况报告,源站点必须将有关的差错交给一个应用程序或采取其它措施来纠正问题。

  ICMP 报文要求两级封装,如图 2-8 所示。每个 ICMP 报文放在 IP 数据报的数据部分中通过互联网,而数据报本身放在帧的数据部分中通过物理网络。携带 ICMP 报文的数据报与携带用户信息的数据报具有完全相同的路由选择,没有附加的可靠性或优先级。因此,差错报文本身可能会丢失或被丢弃。此外,在一个已经拥塞的 网络中,差错报文可能会引起额外的拥塞。假如携带 ICMP 报文的 IP 数据报产生了差错,则差错处理过程产生一个异常事件,以免出现有关差错报文的差错报文。

图 2-8 ICMP 报文的两级封装

  特别需要提醒的是, ICMP 报文是用 IP 封装和发送的,但并不把它看成是高层协议,它是 IP 的一个必要部分。用 IP 传递 ICMP 报文的原因是可能需要经过几个物理网路才能到达其最终目的地,因此不能仅用物理传送来投递它们。

ICMP 报文格式

  尽管每个 ICMP 报文有自己的格式,但它们都以相同的三个字段开始:一个 8 位整数的报文类型( Type )字段用来标识报文、一个 8 位代码( Code )字段提供有关报文类型的进一步信息、以及一个 16 位校验和( Checksum )字段。此外,报告差错的 ICMP 报文总是包括产生问题的数据报报头及开头的 8 字节数据。在差错报告中返回 8 字节用户数据可以使接收方能够更精确地判断是哪个协议及哪个应用程序对该数据报负责。

  各种类型的 ICMP 报文如表 2-7 所示,不同类型由报文中的类型字段和代码字段来共同决定。表中的最后两列表明 ICMP 报文是一份查询报文还是一份差错报文。因为对 ICMP 差错报文有时需要作特殊处理,因此我们需要对它们进行区分。例如前面也曾提到,在对 ICMP 差错报文进行响应时,永远不会生成另一份 ICMP 差错报文(如果没有这个限制规则,可能会遇到一个差错产生另一个差错的情况,而差错再产生差错,这样会无休止地循环下去)。

表 2-7 ICMP 报文类型

ICMP 应用

  使用 ICMP 的各个命令可以测试/调试网络,分析路由器报告的 ICMP 报文可以得到当前网络状况相关的很多有用信息。如类型为 8 的请求和类型为 0 的应答可以测试目的站点的可达性;分析类型为 3 的报文可以了解目的站点不可达的原因;使用类型为 4 的报文可以实现拥塞控制;使用类型为 5 的报文可以实现重定向等。各种类型报文的具体含义参见参考文献 2 。下面我们简单介绍一些利用 ICMP 实现的常用 TCP/IP 调试工具。

  “ ping ”是 TCP/IP 提供的最常用调试工具,它用来测试另一台主机是否可达。该程序发送一份 ICMP 回送请求报文给主机,并等待返回 ICMP 回送应答。任何收到回送请求的机器都必须组成一个回送应答报文并将它传送给最初的发送站点。回送请求包含一个可选数据区,应答包含了在请求中所发送数据的 一个拷贝。如果在发送回送请求后收到相应的应答,则说明该主机是可达的。因为请求和应答都是在 IP 数据报中传送的,所以应答的成功接收就证实传送系统的主要部分是正常的。

  一般来说,如果不能 Ping 到某台主机,那么就不能 Telnet 或者 FTP 到那台主机。反过来,如果不能 Telnet 到某台主机,那么通常可以用 Ping 程序来确定问题出在哪里。 Ping 程序还能测出到这台主机的往返时间,以表明该主机离我们有“多远”。不过随着 Internet 安全意识的增强,出现了提供访问控制清单的路由器和防火墙,那么像这样没有限定的断言就不再成立了。

  另一个巧妙应用 ICMP 的程序是由 Van Jacobson 编写的 Traceroute ,该程序是一个能更深入探索 TCP/IP 协议的方便可用的工具,它可以让我们看到 IP 数据报从一台主机传到另一台主机所经过的路由。 Traceroute 程序利用的是 ICMP 报文和 IP 报头中的 TTL 字段(生存周期)。

  TTL 字段是由发送端初始设置一个 8bit 字段。每个处理数据报的路由器都需要把 TTL 的值减 1 或减去数据报在路由器中停留的秒数。由于大多数的路由器转发数据报的时延都小于 1 秒钟,因此 TTL 最终成为一个跳站的计数器,所经过的每个路由器都将其值减 1 。

  当路由器收到一份 IP 数据报,如果其 TTL 字段是 0 或 1 ,则路由器不转发该数据报。相反,路由器将该数据报丢弃,并给发送端发一份 ICMP “超时”信息。 Traceroute 程序实现的关键在于包含这份 ICMP 信息的 IP 报文的信源地址是该路由器的 IP 地址。

  Traceroute 程序的操作过程是:首先发送一份 TTL 字段为 1 的 IP 数据报给目的主机,处理这份数据报的第一个路由器将 TTL 值减 1 ,丢弃该数据报,并发回一份超时 ICMP 报文,这样就得到了该路径中的第一个路由器的地址;然后 Traceroute 程序发送一份 TTL 值为 2 的数据报,这样我们就可以得到第二个路由器的地址;继续这个过程直至该数据报到达目的主机。但是目的主机哪怕接收到 TTL 值为 1 的 IP 数据报,也不会丢弃该数据报并产生一份超时 ICMP 报文,这是因为数据报已经到达其最终目的地。那么我们该如何判断是否已经到达目的主机了呢? Traceroute 程序采用发送一份 UDP 数据报给目的主机的方法,但它选择一个不可能的值作为 UDP 端口号(大于 30000 ),使目的主机的任何一个应用程序都不可能使用该端口。因为,当该数据报到达时,将使目的主机的 UDP 模块产生一份“端口不可达”错误的 ICMP 报文。这样, Traceroute 程序所要做的就是区分接收到的 ICMP 报文是超时还是端口不可达,以判断什么时候结束。在确认到达目的主机后, Traceroute 程序就可以将路过的所有路由器及其响应时间打印出来,为用户提供两台主机之间路由的详细信息。

ICMP控制报文协议相关推荐

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

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

  2. 利用WireShark分析由Ping产生的Internet 控制报文协议(ICMP)

    2019独角兽企业重金招聘Python工程师标准>>> ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP ...

  3. 计算机网络-基本概念(2)【网络层】-网际控制报文协议ICMP

    为了更有效的转发IP数据报和提高交付成功的机会,在网络层使用了网际控制报文协议ICMP.ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告. 差错报告报文 终点不可达:使用tracerout ...

  4. 图文并茂的讲解 ICMP (网际控制报文)协议

    ICMP 网际控制报文 为了提高 IP 数据报交付成功的机会,在网络层使用了网际控制报文协议来允许主机或路由器报告差错和异常情况.ICMP 报文作为网际层数据报的数据,加上数据报的首部,组成 IP 数 ...

  5. ICMP:Internet控制报文协议

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

  6. ICMP(Internet Control Message Protocol)网际控制报文协议初识

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

  7. 网际控制报文协议icmp_网络中的ICMP(Internet控制消息协议)

    网际控制报文协议icmp ICMP(Internet控制消息协议)简介 (Introduction to ICMP (Internet Control Message Protocol)) IP (I ...

  8. 网络层(网际控制报文协议ICMP)

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

  9. Internet控制报文协议ICMP

    我们知道,互联网的网络层提供的是"best effort"尽力而为的服务,IP协议本身并没有任何可以帮助发方测试连接性能或者了解线路故障的机制.但是对于故障和错误的处理,是必不可少 ...

最新文章

  1. js插件 webp_(转)让浏览器支持Webp
  2. 你们网购遇到过这种店铺吗?我吓得第二天就退货了
  3. buffer 与cache 的区别
  4. qlistwidgetitem itempressed怎么区分左右键_图文介绍:断桥门窗五金配件怎么区分左右定义?...
  5. 【STM32】【STM32CubeMX】STM32CubeMX的使用之六:定时器配置输出PWM,实现变色呼吸灯
  6. JDK 1.8新特性
  7. UIPikerView的属性和使用方法
  8. 拓端tecdat|R语言中的广义线性模型(GLM)和广义相加模型(GAM):多元(平滑)回归分析保险资金投资组合信用风险敞口
  9. EDI 公开课:EDI 系统集成之数据库方案
  10. ElasticSearch进阶(五)MetricBeat的简单使用
  11. topcoder使用介绍
  12. MySQL原理与实践(五):数据库的锁机制
  13. 利用PHP的特性做免杀Webshell
  14. 2018 11.2 PION模拟赛
  15. 经典共识PoW的原理及实现
  16. 心路历程:当win10遇上win7激活程序...请默哀
  17. 为什么说OKRS-E是适合的OKR框架
  18. Autofill安装使用
  19. memcpy()详解
  20. 极好的搜索引擎: Goolgle 本网站和www搜索插件

热门文章

  1. 做了6年php,30岁程序员要去做外包,这个选择靠谱么?网友:别!
  2. 关于求1~n中与m互质的数的个数(容器原理+数论分解质因子)
  3. HNOI2004-宠物收养所
  4. 正在准备面试?一线互联网大厂面试真题系统收录!成功入职腾讯
  5. 5年经验Java程序员面试20天,拿下数个offer,总结出的经验感想!
  6. 我与今目标的爱恨情仇
  7. 基于微信小程序的医院预约挂号系统设计与实现 毕业设计论文 课题题目参考(1)功能和界面效果
  8. 云课堂-java-jvm学习总结
  9. 输入矩形的长和宽。计算其面积和周长
  10. Python 6 循环break,continu语句pass,else