TCP/IP 协议族 - ICMP 笔记

Apr 23, 2016


ICMP 是网络层的一个协议。它首先要封装成 IP 数据报,然后才传给下一层。

报文

可以分为两大类:差错报告报文和查询报文。

差错报文包括:

  • 终点不可达
  • 源点抑制
  • 超时
  • 参数问题
  • 改变路由

查询报文包括:

  • 回送请求或回答
  • 时间戳请求或回答

差错报告报文

以下是差错报告报文的一些要点:

  • 对于携带 ICMP 差错报文的数据报,不再产生差错报文。
  • 对于分片的数据报,如果不是第一个分片,则不产生。
  • 对于具有多播地址的数据报,不产生。
  • 对于具有特殊地址(127.0.0.1或0.0.0.0),不产生。

所有的差错报文都包括了一个数据部分,包括的是原始数据报的 IP 首部 + 该数据报数据的前 8 个字节。

加上首部是为了向接收差错报文的原始信源给出关于数据报本身的信息,包含前 8 个字节是因为这提供了关于端口号(UDP 和 TCP)和序号(TCP)的信息。

终点不可达

当路由器无法为一个数据报找到路由,或者主机无法交付一个数据报时,该数据报被丢弃,然后由路由器或主机向发出这个数据报的源主机返回一个终点不可达报文。

该报文可以由主机或者路由器发出。

它的类型是 3,代码是 0~15,其中,代码 2 - 协议不可达和代码 3 - 端口不可达只能由目的主机发出,其他的只能由路由器发出。

源点抑制

因为 IP 是无连接协议,在产生数据报的源主机和转发数据报的路由器以及处理数据报的目的主机没有任何联系,这样引起的问题就是缺乏流量控制拥塞控制

源点抑制报文就是为了给 IP 协议增加某种程度上的流量控制和拥塞控制设计的。 当路由器或主机因拥塞而丢弃数据报时,发送一个源点抑制报文。

这个数据报有两个作用:

  • 通知源点,数据报已被丢弃。
  • 警告源点,路径中某处出现了拥塞,源点必须抑制发送过程。

路由器必须为每一个丢弃的数据报向源主机发送一个源点抑制报文,而且没有一种机制可以告诉源点,拥塞已经被缓解,可以按照原来的速率发送报文了。源点只是不断地降低发送速率,直到不再收到更多的源点抑制报文为止。

超时报文

  1. 当 TTL 为 0 时,发送一个超时报文。
  2. 当组成一个报文的所有分片未能在某一时限内全部到达主机,产生超时报文。当第一个分片到达时,目的主机启动一个计时器。

参数问题

数据报首部中出现任何二义性,就会发送一个参数问题报文。

改变路由

因为主机不参与路由表的更新,所以主机里的路由表可能是错的。当它把一个报文发到一个不对的路由器上时,路由器会转发给正确的路由器,同时发送一个改变路由报文给主机,更新主机中的路由表。

查询

回送请求与回答

回送请求和回送回答报文是为了诊断而设计的。 一个主机或路由器可以向另一个主机或路由器发送回送请求报文,收到回送请求的主机返回回送回答报文。

这两个报文可以用来确定两台机器在 IP 级是否能彼此通信。

时间戳请求和回答

时间戳请求和时间戳回答报文。

所用的公式是: 发送时间 = 接收时间戳 - 原始时间戳 接受时间 = 分组返回的时间 - 发送时间戳 往返时间 = 发送时间 + 接受时间

ICMP 软件包

输入模块

input_module(ICMP Packet):
    if 类型为请求:
        产生回答报文
        发送
    if 类型指定的是一个改变路由报文:
        修改路由表
    if 是其他差错报文:
        通知给源协议

输出模块

output_moudule(要求):
    if 要求是定义一个差错报文:
        if 要求是从 IP 来的并且是禁止的:
            返回
        if 要求是一个有效的改变路由报文:
            返回
        产生一个差错报文
    if 要求定义的是一个请求:
        产生一个请求报文
    发送这个报文
    返回