TCP/IP的网际层协议——ICMP

来源:百度文库 编辑:神马文学网 时间:2024/07/07 15:05:18
ICMP (Internet Control Message Proctocol,Internet控制信息协议)经常被认为是IP层的一个组成部分。它携带于IP数据包中
ICMP封装在IP数据包内部:
IP首部 ICMP数据包
ICMP的功能介绍
ICMP定义了一套差错 报文和控制报文,用于主机与路由器之间交换不可达目的地址、网络拥塞、重定向到更好的路径
报文生命周期超时等信息。例如,用ping命令来查询192.168.10.1的主机是否在线,路由器会给用户一个ICMP应答:目标
主机不可到达或者从192.168.10.1有回应。
ICMP报文主要有两大类:查询报文和错误报文。查询报文是指ICMP响应请求、相应回答、路由公告、地址屏蔽请求等。
而绝大部分ICMP信息是错误报文,例如,目的地址不可到达、源地址消亡、生命周期超期等。
ICMP报文:
类型(8位) 代码(8位) 校验和(16位)
(因不同的类型和代码而有不同的内容)
类型字段可以有不同的值,以描述特定类型的ICMP报文。某些ICMP报文还是使用代码字段的值来进一步描述不同的条件。
各种类型的ICMP报文如下表,它由报文中的类型字段和代码段来共同决定。最后两列表明ICMP报文是一份查询报文还是
一份错误报文。
类型  代码 描述  查询  错误
0       0 回应应答(Ping应答)     +     -
3    -     目标不可到达     -     +
3    0 网络不可到达     -           +
3    1 主机不可到达     -     +
3    2 协议不可到达     -     +
3    3 端口不可到达     -     +
3    4 禁止分割     -     +
3    5 源站选路失败     -
+
3    6 目标网路不认识     -     +
3    7 目标主机不认识     -     +
3    8 源主机被隔离(作废不用)     -     +
3    9 目标网络被强制禁止     -     +
3    10 目标主机被强制禁止     -     +
3    11 由于服务类型TOS,网络不可到达     -     +
3    12 由于主机类型TOS,主机不可到达     -     +
3    13 由于过滤,通信被强制禁止     -     +
3    14 主机越权     -     +
3    15 优先权中止生效     -     +
4       0 源端口被关闭(基本流控制)     -     +
5    - 重定向     -     +
5    0 对网络重定向     -     +
5    1 对主机重定向     -     +
5    2 对服务类型和网络重定向     -     +
5    3 对服务类型和主机重定向     -     +
8    0 请求回应(ping请求)     +     -
9    0 路由器通告     +     -
10    0 路由器请求     +     -
11    - 超时     -     +
11    0 传输期间生存时间(TTL)为0     -     +
11    1 在数据包组装期间生存时间为0     -     +
12    - 参数问题     -     +
12    0 坏的IP首部     -     +
12    2 缺少必须的选项     -     +
13    0 时间截请求     +     -
14    0 时间截应答     +     -
15    0 信息请求     +     -
16    0 信息应答     +        -
17    0 地址掩码请求     +     -
18    0 地址掩码应答     +     -
目标地址是广播地址或多播地址(D类地址)的IP数据包不会产生ICMP错误报文,这是为了防止ICMP错误报文对广播分组的
响应而带来的广播风暴。
ICMP不可到达的原因及分析
ICMP不可到达的报文类型值为3,可以依据不同的代码值实现不哦他那个的不可达功能。
1.网络不可到达
2.主机不可到达
3.禁止分割:
在上文介绍IP层的数据包大小时,曾提到在MTU较小的网络上,需要把大数据包划分成更小的数据包片(分片),以保证数
据包正常通过网络。
假如路由器A在将客户端的数据发往服务器时,需要分割客户机的数据包,但是数据包的IP头中的IP头中即设置了拒绝分
片位,那么路由器将会向客户机返回一个代码为4的“禁止分割”的ICMP信息。
以上3种信息都是有路由器发送的。
4.协议不可到达
如果数据包成功地到达了Web服务器,但是服务器上没有运行TCP或者UDP协议(基本上不可能有有种情况),那么Web服务
器将返回一个代码为2的“协议不可到达”的ICMP消息。
5.端口不可到达
如果数据包成功地到达了Web服务器,服务器上也运行有TCP协议,但是服务器上的相关软件还没有运行,无法处理客户机
连接,于是 服务器上的TCP/IP将返回一个代码为3的“端口不可到达”的ICMP消息。
以上两种信息是由主机发送的。
代码描述 场合 发送方
目标网络不可到达 路由表中无目标网络 路由器
目标主机不可到达 主机无响应 路由器
禁止分割 需要进行分割但设置了不分割个比特位 路由器
协议不可到达 主机上无相关的传输层协议(TCP、UDP) 主机
端口不可到达 目标端口没有被应用程序打开 主机
ICMP超时的原因分析
超时ICMP报文与IP报头中TTL字段一起使用。下面接单介绍一下“传输期间TTL值为0”的代码。
当数据包到达路由器时,路由器都需要把数据包IP头中的TTL减1.当TTL值被减到0时,数据包就会被丢弃。此时丢弃这个包的
路由器会返回一个代码为“传输期间TTL值为0”的ICMP消息给原始发送者。
TTL值可以防止数据包在网络上被循环往复地传输。例如,当发生路由回路时,数据包可能在回路上被一直循环地传输。但是
TTL字段的值都会减1,因此当TTL值减为0时,循环就会被自动丢失。
Windows操作系统中的Traceroute命令可以让用户看到IP数据包从一台主机传输到另一台主机的过程中所经过的路由。
Tacertoute是Cisco路由器上的命令格式,在Windows 2000中,trace命令写为“tracert”。
在Cisco2600系列路由器上使用traceroute命令;
traceroute 命令利用了“TTL超时”的报文。当使用traceroute命令时,发送使用UDP故意发送一份TTL为1的IP数据包给目标主机,
处理 ,处理这根数据包的第一个路由器将TTL值减1,然后丢弃该数据包,并向发送返回一份超时ICMP报文。这样trace命令就
得到了该路径中第一个路由器的地址,然后traceroute命令发送一份TTL值为2的数据包,第一个路由器将数据包转发给第二个路
由器。而在第二个路由器上,数据包的TTL值被减为0,因此这个路由器将丢弃这个数据包并向发送方返回ICMP超时信息,这
样就可以得到第二个路由器的地址。traceroute命令继续上述过程直至数据包到达目标主机。
traceroute命令如何判断数据包是否已经到达目标主机呢?实际上执行traceroute命令的设备发送原始数据包时,它会选择一个几乎
不可能的值作为目标UDP端口号(大于30000),目标主机的任何一个应用程序都不可能使用该端口。那么当该数据包到达目标主机
时,目标主机的UDP将产生一份代码为“端口不可达”的ICMP报文。而之前路由器返回的是“超时”ICMP报文,这要traceroute
命令只要区分所接收到的ICMP报文是“超时”还是“端口不可达”,就可以判断数据包是否已经到达目的地了。
ICMP重定向功能及应用
ICMP重定向报文是一个非常重要的工具。当主机向非本地子网发送数据包时,TCP/IP会自动将数据包转发给它的默认网关(缺省
路由器)。但是如果网络中还存在一个相对来说更好的本地路由器时,ICMP重定向功能会通知主机以后将这些数据包发送给那个
更好的路由器。
主机使用路由器B(IP地址为192.168.2.0/24)作为默认网关,但是对于到某个子网的路由(如192.168.3.0/24),路由器A才是最好的选择
默认情况下,主机还是会将数据包转发给路由器B。
路由器B从E0口收到主机发来的数据包并且检查自己的路由表,它发现路由器A是去往目标地址的下一跳,于是路由器B由从E0口
把数据发给路由器A。此时路由器B会检测到它正在发送数据的接口和此数据包到达的接口是同一个接口(即主机和两个路由器同处
与一个本地子网中)。路由器B发送一份ICMP重定向报文给主机,告诉它以后把这类数据包发送给路由器A而不是它自己。
ICMP回应请求与回应应答
大家对Windows中的ping命令应该很熟悉了,ping命令负责发送和接收ICMP回应请求及回应应答报文。
实际上ping所产生的数据报文是IP网络中能够生成和寻址的最小报文,它很适合排除网络连接方面存在的问题。
ping命令有些类似声纳与雷达,典型的ping命令实现方法是发送方首先在要发送的ICMP回应请求报文的数据域中存放当前时间;当
目标主机收到回应请求后,它返回一个ICMP回应应答报文给发送方;发送方收到ICMP回应应答报文的时间减去发送时间就得到往
返时间:
ICMP回应往返时间=ICMP回应应答报文到达时间-ICMP回应请求报文的发送时间
Cisco路由器和交换机上实现的扩展ping命令有很多实用的功能。例如,当用户在Cisco路由器上输入“ping”在回车以后,会出现一个
会话,其中用户可以定制ping发送的报文长度、数目、超时值、源地址、目标地址等。