【计算机网络系列】网络层⑥:网际控制报文协议ICMP

网际控制报文协议ICMP

为了更有效地转发IP数据报提高交付成功的机会,在网际层使用了网际控制报文协议ICMP(Internet Control Message Protocol)。

ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP是互联网的标准协议。但ICMP不是高层协议(看起来好像是高层协议,因为ICMP报文装在IP数据报中,作为其中的数据部分),而是IP层的协议。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。

ICMP报文格式如下图所示。
image.png

ICMP报文的种类

ICMP报文有两种,即ICMP差错报告报文ICMP询问报文

  • ICMP报文的前4字节是统一的格式,共有三个字段:类型代码检验和
    • 代码字段用于进一步区分某种类型中的几种不同情况。
    • 检验和字段用来检验整个ICMP报文。
  • 接着的4字节的内容与ICMP的类型有关。
  • 最后面是数据字段,其长度取决于ICMP的类型。

IP数据报首部的检验和并不检验IP数据报的内容,因此不能保证经过传输的ICMP报文不产生差错。

下表给出了几种常用的ICMP报文类型。
image.png

上表给出的ICMP差错报告报文共有四种,即:

  • 终点不可达:当路由器或主机不能交付数据报时就向源点发送终点不可达报文。
  • 时间超过:当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。
  • 参数问题:当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
  • 改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(也就是说,找到了更好的路由)。

所有的ICMP差错报告报文中的数据字段都具有同样的格式(如下图所示)。
image.png
把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。

提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。这些信息对源点通知高层协议是有用的。整个ICMP报文作为IP数据报的数据字段发送给源点。

下面是不应发送ICMP差错报告报文的几种情况:

  • 对ICMP差错报告报文,不再发送ICMP差错报告报文。
  • 对第一个分片的数据报片的所有后续数据报片,都不发送ICMP差错报告报文。
  • 对具有多播地址的数据报,都不发送ICMP差错报告报文。
  • 对具有特殊地址(如127.0.0.00.0.0.0)的数据报,不发送ICMP差错报告报文。

常用的ICMP询问报文有两种,即:

  • 回送请求或回送回答:ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态
  • 时间戳请求或时间戳回答:在ICMP时间戳请求报文发出后,就能够收到对方响应的ICMP时间戳回答报文。利用在报文中记录的时间戳(如报文的发送时间和接收时间),发送方很容易计算出当前网络的往返时延

ICMP的应用举例

ICMP的一个重要应用就是分组网间探测PING(Packet InterNet Groper),用来测试两台主机之间的连通性。PING使用了ICMP回送请求回送回答报文。PING是应用层直接使用网络层ICMP的一个例子。它没有通过运输层的TCP或UDP

C:\Users\Lucky_W>ping baidu.com

正在 Ping baidu.com [39.156.66.10] 具有 32 字节的数据:
来自 39.156.66.10 的回复: 字节=32 时间=52ms TTL=50
来自 39.156.66.10 的回复: 字节=32 时间=55ms TTL=50
来自 39.156.66.10 的回复: 字节=32 时间=67ms TTL=50
来自 39.156.66.10 的回复: 字节=32 时间=63ms TTL=50

39.156.66.10 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 52ms,最长 = 67ms,平均 = 59ms

最后显示出的是统计结果:发送到哪个机器(IP地址),发送的、收到的和丢失的分组数(但不给出分组丢失的原因),以及往返时间的最小值、最大值和平均值。

另一个非常有用的应用是traceroute(这是UNIX操作系统中的命令),用来跟踪一个分组从源点到终点的路径。在Windows操作系统中这个命令是tracert。下面简单介绍这个命令的工作原理。

  • traceroute从源主机向目的主机发送一连串的IP数据报,数据报中封装的是无法交付的UDP用户数据报。第一个数据报 P 1 P_1 P1的生存时间TTL设置为1。当 P 1 P_1 P1到达路径上的第一个路由器 R 1 R_1 R1时,路由器 R 1 R_1 R1先收下它,接着把TTL的值减1。由于TTL等于零了,因此 R 1 R_1 R1就把 P 1 P_1 P1丢弃,并向源主机发送一个ICMP时间超过差错报告报文。
  • 源主机接着发送第二个数据报 P 2 P_2 P2,并把TTL设置为2。 P 2 P_2 P2先到达路由器 R 1 R_1 R1 R 1 R_1 R1收下后把TTL减1,再转发给路由器 R 2 R_2 R2 R 2 R_2 R2收到 P 2 P_2 P2时TTL为1,但减1后TTL变为零了。 R 2 R_2 R2就丢弃 P 2 P_2 P2,并向源主机发送一个ICMP时间超过差错报告报文。这样一直继续下去。当最后一个数据报刚刚到达目的主机时,数据报的TTL是1。主机不转发数据报,也不把TTL值减1。但因IP 数据报中封装的是无法交付的运输层的UDP用户数据报,因此目的主机要向源主机发送ICMP终点不可达差错报告报文。

这样,源主机达到了自己的目的,因为这些路由器和最后目的主机发来的ICMP报文正好给出了源主机想知道的路由信息:到达目的主机所经过的路由器的IP地址,以及到达其中的每一个路由器的往返时间。

C:\Users\Lucky_W>tracert baidu.com

通过最多 30 个跃点跟踪
到 baidu.com [39.156.66.10] 的路由:

  1     2 ms     2 ms     2 ms  192.168.6.9
  2     *        *        *     请求超时。
  3    38 ms    16 ms    16 ms  172.21.0.98
  4     *        *        *     请求超时。
  5     *        *        *     请求超时。
  6    29 ms    18 ms    18 ms  223.87.28.9
  7     *        *        *     请求超时。
  8    66 ms     *        *     221.183.37.237
  9     *        *        *     请求超时。
 10    62 ms    55 ms    53 ms  111.13.188.38
 11    53 ms    52 ms    49 ms  39.156.27.1
 12    59 ms    51 ms    53 ms  39.156.67.1
 13     *        *        *     请求超时。
 14     *        *        *     请求超时。
 15     *        *        *     请求超时。
 16     *        *        *     请求超时。
 17    67 ms    52 ms    49 ms  39.156.66.10

跟踪完成。

从原则上讲,IP 数据报经过的路由器越多,所花费的时间也会越长。但有时正好相反。这是因为互联网的拥塞程度随时都在变化,也很难预料到。因此,完全有这样的可能:经过更多的路由器反而花费更短的时间。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlphaGuaGua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值