基础资料
IP是一种无连接的数据报传输协议,提供了一种尽力而为的点到点数据传输服务。在数据传输过程中如果出现故障,将致使数据报无法到达信宿。为了让信源知道出现的问题,以便采取措施来避免或纠正,引入了网际控制报文协议ICMP(Internet Control Message Protocol)。
ICMP运行与IP之上,是IP协议的补充,通常也认为是IP协议的一部分。ICMP只是报告IP数据报传输过程中产生的错误信息,报文有很多类,其中回应请求是最常用的。计算机的ping命令,就采用ICMP回应请求和应答报文。
ICMP是一种无连接的协议,共有15种由其字段内包含的值所标识的不同的报文,这些报文允许源主机了解和恢复网间网上发生的某些问题,分为差错报告和查询报告两大类,其中差错报告报文用于反映IP数据报在传输过程中产生的错误信息,而查询报告报文用于反映从一台主机或路由器获取的特定信息,并且一般是成对出现的。
IP报文中协议字段的值为1,就表示这是ICMP报文。ICMP回应报文第1个字节是类型字段,第2个字节是代码字段,后面是两个字节的校验和,其他字段和信息则随着发送报文类型的不同而变化。
1.ICMP头和报文格式:
类型8bit | 代码8bit |
校验和16bit |
报头其他部分32bit |
数据(变长) |
ICMP报文包括报头和数据两部分组成,其中报头包含了类型、代码、校验和等控制信息。
·类型:8bit,用于定义ICMP报文类型。
·代码:用于标识发送这个特定报文类型的原因。
·校验和:用于数据传输过程的差错控制,提供ICMP整个报文的校验和。
·报头其他部分:由报文类型确定相应的内容,大部分差错报告报文未使用该字段。
·数据:提供了ICMP差错和状态报告信息,内容因报文类型而异。
2.ICMP差错报告:
ICMP差错报告用于报告数据报传输过程中出现的差错信息,并且是由发现错误的设备向信源报告差错信息,但不负责纠正错误。分为5种报告:
类别 | 描述 |
类别 |
描述 |
3类 |
信宿不可达 |
4类 |
源端抑制 |
5类 |
重定向 |
11类 |
超时 |
12类 |
参数问题 |
1)信宿不可达报告:
当路由器无法转发IP数据报时,或主机无法向上一层协议或端口提交IP数据报时,将丢弃当前的数据报,并产生信宿不可达差错报告向源主机报告出错信息。
类型 3 |
代码 |
校验和 |
全0(未使用) |
IP数据报报头+原始IP数据报中数据的前8字节 |
信宿不可达报告的报文类型为3,代码字段则进一步指明了丢弃该数据报的原因。
代码 | 描述 |
0 |
网络不可达,也可能是由于网络超过了所用路由选择协议的最大距离限制而认为太远。 |
1 |
主机不可达 |
2 |
协议不可达,即数据报中指定的高层协议不可用 |
3 |
端口不可达,一般指数据报要交付的应用程序未运行 |
4 |
需要分段但DF置位致使数据报无法分段 |
5 |
源路由失败 |
6 |
信宿网络未知 |
7 |
信宿主机未知 |
8 |
源主机被隔离(已弃用) |
9 |
与信宿网络的通信被禁止 |
10 |
与信宿主机的通信被禁止 |
11 |
对特定的服务类型ToS网络不可达,由于得不到指定的服务类型而不能访问信宿网络 |
12 |
对特定的服务类型ToS主机不可达,由于得不到指定的服务类型而不能访问信宿主机 |
13 |
因管理者设置过滤而使主机不可达(对主机的访问被禁止) |
14 |
因非法的优先级而使主机不可达,所请求的优先级对该主机是不允许的 |
15 |
因报文的优先级低于网络设置的最小优先级而使主机不可达 |
某些情况下,信宿不可达是检测不出来的。
2)源端抑制:
当路由器或信宿机由于拥塞而造成数据丢弃时,可以向信源机发送源端抑制报文,通知信源机数据报已经被丢弃,并警告信源机传输路径上出现拥塞。
源端抑制报告的报文格式与信宿不可达报文格式相同,只是其中的类型值改为4,代码值设为0。
由于信源机无法知道合适的数据报发送速度是多少,因此收到源端抑制报告报文后,将降低数据报的传输速度,直到不再收到该数据报为止。然后再逐步提高数据报发送速度,直到再次收到源端抑制报文。这样动态调整,使得网络保持较高的传输速度。
3)重定向报告:
网络结构变化比较频繁,路由表的更新只在路由器上进行,主机上的路由表不会随着网络拓扑结构的变化进行实时更新。这时,信源机就有可能将数据报发送给一个错误的路由器(或非最优路由器),收到这个数据报的路由器会把所收到的数据报转发给正确的路由器,同时向信源机发送重定向报告报文。当信源机收到该报文后,根据报文信息更新信源机中路由表的路由信息。
类型 5 |
代码 |
校验和 |
目标路由器的IP地址 |
IP数据报报头+原始IP数据报中数据的前8字节 |
其中的代码值为:
·0:对特定网络重定向
·1:对特定主机重定向
·2:基于指定的服务类型对特定网络重定向
·3:基于指定的服务类型对特定主机重定向
4)超时报告:
每个IP数据报报头都有一个存活时间字段TTL,并通过设置相应的TTL值来控制数据报在网络上的传输时间。每当数据报通过路由器时,该字段就减1,当TTL值为0时路由器就会丢弃该数据报,同时产生一个ICMP超时报告报文发送给信源机。另外,在信宿机进行分段重组时,也会启动一个重组定时器,一旦重组定时器超时,信宿机也将丢弃当前正在重组的数据报,并产生一个ICMP超时报告报文发送给信源机。
超时报告报文格式与信宿不可达报文格式相同,只是类型为11,代码0表示TTL超时,代码1表示分段重组超时。
路由跟踪Traceroute例程使用TTL值找到目的主机或网络的路径或路由。当执行Traceroute命令时,就发送一个在IP头中置TTL值为1的初始ICMP报文。可以用Traceroute程序来决定甚至探索到目的地的路径,Traceroute通过发送一系列TTL为1、2等的数据报来实现,然后使用像有标志的路一样的超时报文探索此路上的路由器。
⑤数据报参数问题:
如果路由器或信宿机发现数据报报头参数存在问题,如报头字段值不明确和空缺等,进而无法转发或处理该数据报,则会丢弃,同时向信源机发送一个数据报参数问题报告报文。
类型 12 |
代码 |
校验和 |
指针 |
全0(未用) |
IP数据报报头+原始IP数据报中数据的前8字节 |
其中,代码0表示报头参数错误,代码1表示缺少选项要求的部分。
3.ICMP查询报告:
ICMP查询报告都以查询/应答对的形式出现,即由信源机主动发出查询报告报文,接收方根据查询请求返回应答报告报文。ICMP提供了4种查询报告报文:
类别 | 描述 |
类别 |
描述 |
0类 |
回应应答 |
8类 |
回应请求 |
9类 |
路由器公告 |
10类 |
路由器选择 |
13类 |
时标请求 |
14类 |
时标应答 |
17类 |
地址掩码请求 |
18类 |
地址掩码应答 |
1)时间戳请求和应答报告:
互联网上,不同主机之间能够进行通信,但它们各自的系统常常是独立运行的,并且独立维护着自己的系统时间,有可能造成不同主机之间存在较大的时间差。为了实现不同主机或设备之间的时钟同步,ICMP引入了时间戳请求和应答报告。
信源机向信宿机发送一个时间戳请求报文,其中包括信源机发送该报文的时间Tss;信宿机收到该请求报文后返回一个时间戳应答报文,报文中包含信源机发送请求报文的时间Tss、信宿机收到请求报文的时间Tst和信宿机发送应答报文时间Tts,信源机可以根据收到应答报文时间Ttr和上面的三个时间来粗略计算信源机和信宿机之间的系统时间差(Tss-Tst+Ttr -Tts)/2,并根据该时间差调整自己的系统时间,实现与信宿机的时间同步。
类型 13/14 |
代码 |
校验和 |
标识 |
序号 |
初始时间戳 |
接收时间戳 |
发送时间戳 |
类型值13表示时间戳请求报告,类型值14表示时间戳应答报告,代码值都为0。信源机通过报文中的标识和序列号字段把时间戳请求报告和时间戳应答报告关联起来。时间戳的值都是从午夜起的世界时时间,单位ms。
2)回应请求与应答报告:
信源机向信宿机发送回应请求报告报文,信宿机收到该报文后,根据报文中的请求信息形成回应应答报告并回送给信源机。信源机可以根据回应应答报告报文来判断两个设备之间是否能正常通信。
类型 8/0 |
代码 |
校验和 |
标识 |
序号 |
数据(请求方指定,接收方原样返回) |
类型值8表示是回应请求报告,类型值0表示是回应应答报告,代码值都为0。标识和序列号用来匹配请求和应答报告,并且标识通常设置为发起请求报告的请求进程的ID。报文中的数据由信源指定,一般用来判断信宿的可达性。软件ping是很多系统中用来发送ICMP回应请求和应答报告的工具。
3)地址掩码请求与应答报告:
请求方创建地址掩码请求报告报文,并发送给所在网络中的路由器。如果请求方知道这个路由器的IP地址,则直接发送给该路由器;如果请求方不知道路由器地址,则在网络上广播该报文。路由器收到地址掩码请求报告报文后,创建地址掩码应答报文并回送给请求方,其中包含子网掩码信息。
类型 17/18 |
代码 |
校验和 |
标识 |
序号 |
地址掩码(请求报文中为0,应答报文中为子网掩码) |
类型值17表示是地址掩码请求报告,类型值18表示是地址掩码应答报告,代码值都为0。标识和序列号通常用来匹配请求和应答报告,由请求方设定,在应答报告中被返回。在请求报告中,地址掩码字段值为0,在应答报告中地址掩码字段值为子网掩码。
4)路由器询问与通告报告:
可以用来获取路由器信息,或检测路由器是否处于活动状态。某主机在引导后可以创建路由器询问报告报文,并通过广播或多播发出;当网络上的路由器接收到该报告后,将创建路由器通告报告报文并回送给请求主机。当然,即使没有收到路由器询问报文,路由器也可以定期广播或多播路由器通告报告报文,以便将自己的路由信息发送给网络上的主机。
类型10 | 代码0 |
校验和 |
0(保留) |
类型值为10表示是路由器询问报告,代码值为0。
类型9 | 代码0 |
校验和 |
地址数 |
地址项 |
生存时间16bit |
||||
路由器地址1 |
地址优先级1 |
路由器地址2 |
地址优先级2 |
...... |
类型值为9表示是路由器通告报告,代码值为0。地址数表示报文中所包含的路由器地址个数,地址项大小指明每个路由地址项所占32bit字的数目,生存时间字段指明了所通告地址的有效时间。路由器地址字段存放了路由器的IP地址,地址优先级是对应路由器地址的优先等级。若地址优先级为0,则该地址可以作为默认路由器地址。
4.ICMP报文的封装:
ICMP虽然是IP层的协议,但其报文是以IP数据报形式进行传递的,即ICMP报文本身被封装在IP数据报的数据区中。包含ICMP报文的IP数据报报头的协议类型字段设置为1。
对于封装有ICMP报文的IP数据报,其报头的源地址是ICMP请求方地址,目的地址是接收ICMP报文的信宿机IP地址。
5.ping应用程序:
ping程序是用来测试两台主机之间是否在IP层连通的常用工具,使用了ICMP回应请求报告和回应应答报告来测试信宿是否可达。ping程序还能测出从信源到信宿的往返时间。
Windows系统中提供的ping程序的命令格式为:
ping [-t][-a][-n count][-l size][-f][-i TTL][-v TOS][-r count][-s count][[-j host-list]|[-k host-list]][-w timeout]target_name
命令中常用选项的含义:
选项 | 描述 |
-t |
不停地向目标主机发送数据,按Ctrl+Break查看统计信息和继续,按Ctrl+C停止 |
-a |
以IP地址格式来显示目标主机的网络地址 |
-n count |
指定要ping多少次,具体次数由count指定 |
-l size |
指定发送到目标主机的数据报的大小 |
-f |
设置数据报中不分段标志 |
-i TTL |
设置数据报生存时间 |
-v TOS |
设置服务类型 |
-r count |
记录路由跳数 |
-s count |
跳数时间戳 |
-j host-list |
沿host-list表松散路由 |
-k host-list |
沿host-list表严格路由 |
-w timeout |
等待每一个回应应答的超时时间ms |
target name |
信宿机名称(或IP地址) |
比如,为了测试Windows主机上IP软件安装是否正确,可以使用:
ping 127.0.0.1
其中使用了环回地址。