ICMP控制报文协议

 通过路由器转发数据报, 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 程序就可以将路过的所有路由器及其响应时间打印出来,为用户提供两台主机之间路由的详细信息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值