TCP/IP协议之ICMP协议

ICMP协议

1、ICMP:被认为是IP层的组成部分,主要是用来传递差错报文以及其他需要注意的信息。
2、ICMP协议的格式
TCP/IP协议之ICMP协议_第1张图片

8位类型:类型字段有15个不同的值,以描述特定类型的ICMP报文。
16位校验和:检验和字段覆盖整个ICMP报文,使用二进制反码求和来检验报文是否出错。

typedef struct icmp_hdr
{
 unsigned char icmp_type; //消息类型
  unsigned char icmp_code; //代码
  unsigned short icmp_checksum; //校验和
  unsigned short icmp_id; //ID号
  unsigned short icmp_sequence; //序列号
  unsigned long icmp_timestamp; //时间戳
} ICMP_HDR,*PICMP_HDR;

  • 8位类型和8位代码共同决定了ICMP报文的类型
    TCP/IP协议之ICMP协议_第2张图片
    图中的最后两行表示ICMP报文是差错报文还是查询报文,一般来说差错报文都需要做特殊处理,因此需要对它进行区分。当收到一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据包的前八个字节。这样接收ICMP差错报文的模块就会把他与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据IP数据报前八个字节中的TCP/UDP报文首部的TCP/UDP端口号来判断)。
    下面几种情况不会产生ICMP差错报文:
  • ICMP差错报文(差错报文不会生成另一份差错报文,如果不是这样的话,将会永无休止的一直生成差错报文)
  • 目的地址是广播地址或多播地址的IP数据报
  • 作为链路层广播的数据报
  • 不是IP分片的第一片
  • 源地址不是单一主机的数据报(源地址不能为零地址、环回地址、广播地址或者多播地址)
    所有的ICMP差错报告报文中的数据字段都具有同样的格式。将收到的需要进行差错报告IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上响应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段的前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。
    TCP/IP协议之ICMP协议_第3张图片

ICMP地址掩码请求应答

地址掩码请求报文(type=17)和地址掩码应答报文(type=18)是为了子网请求应答而加到ICMP报文中的,其报文格式如下
TCP/IP协议之ICMP协议_第4张图片
ICMP中标识符和序列号字段由发送端任意选择设定,这些值在应答中被返。这样发送端就可以把应答与请求进行匹配。
我们可以写一个简单的程序(取名为i c m p a d d r m a s k),它发送一份I C M P地址掩码请求报文,然后打印出所有的应答。由于一般是把请求报文发往广播地址,因此这里我们也这样做。目的地址(140.252.13.63)是子网140.252.13.32的广播地址。TCP/IP协议之ICMP协议_第5张图片
在输出中我们首先注意到的是,从s v r 4返回的子网掩码是错的。显然,尽管s v r 4接口已经设置了正确的子网掩码,但是S V R 4还是返回了一个普通的B类地址掩码,就好像子网并不存在一样。
在这里插入图片描述SVR4处理I C M P地址掩码请求过程存在差错。
我们用t c p d u m p命令来查看主机b s d i上的情况,输出如图所示。我们用- e选项来查看硬件地址。
TCP/IP协议之ICMP协议_第6张图片
发到广播地址的ICMP地址掩码请求注意,尽管在线路上什么也看不见,但是发送主机s u n也能接收到I C M P应答(带有上面“来自本机”的输出行)。这是广播的一般特性:发送主机也能通过某种内部环回机制收到一份广播报文拷贝。由于术语“广播”的定义是指局域网上的所有主机,因此它必须包括发送主机在内。接下来,b s d i广播应答,而s v r 4却只把应答传给请求主机。通常,应答地址必须是单播地址,除非请求端的源I P地址是0 . 0 . 0 . 0。本例不属于这种情况,因此,把应答发送到广播地址是B S D / 3 8 6的一个内部差错。R F C规定,除非系统是地址掩码的授权代理,否则它不能发送地址掩码应答(为了成为授权代理,它必须进行特殊配置,以发送这些应答。参见附录E)。但是,正如我们从本例中看到的那样,大多数主机在收到请求时都发送一个应答,甚至有一些主机还发送差错的应答。
最后一点可以通过下面的例子来说明。我们向本机I P地址和环回地址分别发送地址掩码请求:
在这里插入图片描述上述两种情况返回的地址掩码对应的都是环回地址,即A类地址127.0.0.1。
发送给本机I P地址的数据报( 140.252.12.33)实际上是送到环回接口。
I C M P地址掩码应答必须是收到请求接口的子网掩码(这是因为多接口主机每个接口有不同的子网掩码),因此两种情况下地址掩码请求都来自于环回接口。

ICMP时间戳请求与应答

I C M P时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间(Coordinated Universal Time, UTC)(早期的参考手册认为U T C是格林尼治时间)。这种I C M P报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机获取的时间(如某些U n i x系统提供的r d a t e命令)只能提供秒级的分辨率。由于返回的时间是从午夜开始计算的,因此调用者必须通过其他方法获知当时的日期,这是它的一个缺陷。I C M P时间戳请求和应答报文格式如图所示。请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。但是,实际上,大多数的实现把后面两个字段都设成相同的值

你可能感兴趣的:(Linux)