程序员社区

详解RFC 792文档

介绍

ICMP,Internet Control Message Protocol,网络层中的一个子协议,目的是报告网关或目的主机与源主机通信时数据包处理中的错误,ICMP,在IP协议基础上,看起来像是更高级别的协议,然而,实际上ICMP是IP的一个组成部分,必须由每个IP模块来实现

ICMP报文在以下几种情况下发送:

  • 当报文无法到达目的地时
  • 当网关没有缓冲能力转发数据包时
  • 当网关可以指示主机在更短的路由上发送流量时

IP协议的设计并非绝对可靠,而ICMP的目的是提供有关通信环境中问题的反馈,而不是让IP协议可靠

ICMP消息会报告网关或目的主机处理数据包过程中的错误,但是不能报告ICMP消息处理过程中发生的错误,因为这样就会造成ICMP消息的无限循环,另外,ICMP消息仅发送有关处理Fragment Offset为0的分片包时的错误

上面这句话应该怎么理解

我理解的是,当一条IP数据包由于太长,而被分割成多个分片包传输时,如果发生错误,只会报告Fragment Offset为0的那条分片包的错误,也就是第一个分片包的错误,其他分片包的错误不会导致发送ICMP消息

ICMP消息格式

ICMP消息使用基于IP报头发送,所以IP首部中的Protocol字段值为1,表示更高级别的协议是ICMP

ICMP消息数据位于IP消息的payload里,其中第一个字节是ICMP消息类型字段,它决定着ICMP消息类型,也决定着后续数据的格式

目的不可达消息

Destination Unreachable Message

  • Type

1个字节,值为3

  • Code

1个字节

0 = 网络不可达
1 = 主机不可达
2 = 协议不可达
3 = 端口不可达
4 = 需要分片和设置DF
5 = 源路由失败

  • Checksum

2个字节

校验和覆盖ICMP首部和payload,采用简单计算方法-反码求和法,将来可能会替换此方法

  • unused

4个字节

未使用,填0

  • Internet Header + 64 bits of Original Data Datagram

长度可变

IP首部 + 原始数据包的前8个字节

主机用此数据匹配将消息与进程匹配,如果更高级别的协议使用端口号,则假设端口号位于原始数据包的前8个字节中

更高级别的协议,指的是TCP协议和UDP协议,它们的源端口号和目的端口号位于TCP或UDP协议的首部前4个字节

所以原始数据包的前8个字节,指的是TCP协议或UDP协议的首部的前8个字节,必定包含了端口号

这样ICMP协议就包含了IP首部和TCP或UDP首部的必要内容,就可以把错误信息交给应用层程序

目的不可达消息的使用场景

如果根据网关路由表中的信息,报文的IP首部中的目的地网络不可达,例如,到达目标网络的距离无穷大,网关会向源主机发送目的不可达消息,这应该是网络不可达消息

如果网关能够确定目标主机是否无法访问,如果无法访问时,网关也会向源主机发送目的不可达消息,这应该是主机不可达消息

如果在目标主机中,IP模块由于指示的上层的协议模块或进程端口无效而无法传递数据包,则目标主机可以向源主机发送目的不可达报文,如果是上层的协议模块无效,应该是协议不可达消息,如果是进程端口无效,应该是端口不可达消息

如果数据包必须被分片才能由网关转发,但是DF标志位被置为了1,这种情况下网关必须丢弃报文,并向源主机发送目的不可达报文,应该是需要分片和设置DF消息

可以看出

网络不可达、主机不可达、需要分片和设置DF、源路由失败,这四条消息是由网关发送,而协议不可达和端口不可达,是由目的主机发送

超时消息

Time Exceeded Message

  • Type

1个字节,值为11

  • Code

1个字节

0 = 传输过程中超过了生存时间
1 = 超出分片包重组时间

  • Checksum

2个字节

校验和覆盖ICMP首部和payload,采用简单计算方法-反码求和法,将来可能会替换此方法

  • unused

4个字节

未使用,填0

  • Internet Header + 64 bits of Original Data Datagram

长度可变

IP首部 + 原始数据包的前8个字节

主机用此数据匹配将消息与进程匹配,如果更高级别的协议使用端口号,则假设端口号位于原始数据包的前8个字节中

超时消息的使用场景

如果网关发现数据包的TTL值为0,则丢弃数据包,并向源主机发送超时消息,这应该是传输过程中超过了生存时间

如果目的主机在时限内未完成分片包重组,则丢弃分片包,并向源主机发送超时消息,这应该是超出分片包重组时间

这里千万要记住,如果Fragment Offset为0的分片包不可用,则目的主机不会发送超时消息

从上面可以看出

“传输过程中超过了生存时间”这条消息,是网关发送的,而“超出分片包重组时间”这条消息,是目的主机发送的

参数问题消息

Parameter Problem Message

  • Type

1个字节,值为12

  • Code

1个字节

0 = 指针指示错误

  • Checksum

2个字节

校验和覆盖ICMP首部和payload,采用简单计算方法-反码求和法,将来可能会替换此方法

  • Pointer

1个字节

指针标识检测到的错误字节的位置

  • unused

3个字节

未使用,填0

  • Internet Header + 64 bits of Original Data Datagram

长度可变

IP首部 + 原始数据包的前8个字节

主机用此数据匹配将消息与进程匹配,如果更高级别的协议使用端口号,则假设端口号位于原始数据包的前8个字节中

参数问题消息的使用场景

如果处理数据包的网关或主机发现报头参数有问题,以至于无法完成数据包的处理,则必须丢弃该数据包(这种问题的一个潜在原因是选项中的参数不正确),并向源主机发送参数问题消息

可以看出

参数问题消息由网关或目的主机发送

源端被关闭消息

Source Quench Message

  • Type

1个字节,值为4

  • Code

1个字节,值为0

  • Checksum

2个字节

校验和覆盖ICMP首部和payload,采用简单计算方法-反码求和法,将来可能会替换此方法

  • unused

4个字节

未使用,填0

  • Internet Header + 64 bits of Original Data Datagram

长度可变

IP首部 + 原始数据包的前8个字节

主机用此数据匹配将消息与进程匹配,如果更高级别的协议使用端口号,则假设端口号位于原始数据包的前8个字节中

源端被关闭消息的使用场景

如果网关由于没有足够的缓存空间将数据包路由到下一个网络,则该网关会丢弃IP数据包,并发送源端被关闭消息

如果数据包到达目的主机的速度太快而无法处理,目的主机也会发送源端被关闭消息给源主机,以降低数据包速率

网关可以为它丢弃的每条消息发送一个源端被关闭消息。收到源端被关闭消息后,源主机应降低将流量发送到指定目的地的速率,直到它不再从网关接收源端被关闭消息。然后,源主机可以逐渐增加将流量发送到目标的速率,直到它再次收到源端被关闭消息

这样做的好处是,动态利用网络性能,最大化发送数据,是网络中常见的方式

网关或主机可以在接近其容量限制时发送源端被关闭消息,而不是等到超过容量。这意味着触发源端被关闭消息的数据的数据包可能会被传递

源端被关闭消息由网关或目的主机发送

重定向消息

Redirect Message

  • Type

1个字节,值为5

  • Code

1个字节

0 = 为网络重定向数据包
1 = 为主机重定向数据包
2 = 为服务类型和网络重定向数据包
3 = 为服务类型和主机重定向数据包

  • Checksum

2个字节

校验和覆盖ICMP首部和payload,采用简单计算方法-反码求和法,将来可能会替换此方法

  • Gateway Internet Address

4个字节

原始数据包里目的IP地址所在的网关地址

  • Internet Header + 64 bits of Original Data Datagram

长度可变

IP首部 + 原始数据包的前8个字节

主机用此数据匹配将消息与进程匹配,如果更高级别的协议使用端口号,则假设端口号位于原始数据包的前8个字节中

重定向消息的使用场景

当网关检测到一台主机或网络设备使用非优化路由的时候,它会向该主机或网络设备发送一个ICMP重定向报文,请求主机或网络设备改变路由。网关也会把初始数据报向它的目的地转发

这里看出,网关并不会丢弃此数据包

对于具有IP源路由选项和目标地址字段中的网关地址的数据报,即使存在比源路由中的下一个地址更好的到达最终目标的路由,也不会发送重定向消息

Code 0、1、2、3都是由网关发送

Echo or Echo Reply Message

Echo or Echo Reply Message

  • Type

1个字节

8 = Echo Request
0 = Echo Reply

  • Code

1个字节,值为0

  • Checksum

2个字节

校验和覆盖ICMP首部和payload,采用简单计算方法-反码求和法,将来可能会替换此方法

  • Identifier

2个字节

帮助匹配ICMP Echo Request和ICMP Echo Reply消息,值可以为0

  • Sequence Number

2个字节

ICMP Echo Request报文的序列号,每发送一次,加1

  • Data

长度可变

ICMP Echo Request消息中的数据要在ICMP Echo Reply消息中返回

Echo or Echo Reply Message的使用场景

用于检测IP网络连通性的Ping/Tracert

ICMP Echo Request消息和ICMP Echo Reply消息的Identifier字段和Sequence Number字段,必须相同,通过判断它们来确定Echo Request消息有对应的Echo Reply,以此来检测网络是否连通

Echo or Echo Reply Message既可以用在网关上,也可以用在主机

Timestamp or Timestamp Reply Message

Timestamp or Timestamp Reply Message

  • Type

1个字节

13 = timestamp message
14 = timestamp reply message

  • Code

1个字节,值为0

  • Checksum

2个字节

校验和覆盖ICMP首部和payload,采用简单计算方法-反码求和法,将来可能会替换此方法

  • Identifier

2个字节

标识匹配timestamp message和timestamp reply message,值可以为0

  • Sequence Number

2个字节

timestamp message的序列号,每发送一次,加1

Identifier和Sequence Number标识匹配timestamp message和timestamp reply message,也就是说,目的主机收到timestamp message后会把这两个字段放入timestamp reply message中

  • Originate Timestamp

4个字节,单位为毫秒

Originate Timestamp是发送者在发送前的时间

  • Receive Timestamp

4个字节,单位为毫秒

Receive Timestamp是接收者接收消息时的时间

  • Transmit Timestamp

4个字节,单位为毫秒

Transmit Timestamp是接收者发送消息时的时间

timestamp message可以发送给网关或主机

Information Request or Information Reply Message

Information Request or Information Reply Message

  • Type

1个字节

15 = information request message
16 = information reply message

  • Code

1个字节,值为0

  • Checksum

2个字节

校验和覆盖ICMP首部和payload,采用简单计算方法-反码求和法,将来可能会替换此方法

  • Identifier

2个字节

标识匹配information request message和information reply message,值可以为0

  • Sequence Number

2个字节

information request message的序列号,每发送一次,加1

使用场景

源主机使用此网络中的地址作为源IP地址,目的IP地址设置为0,发送此消息,目的是为了找到源主机所在网络的数量,因为一个主机可以同时处于多个网络中

此消息可以发送网关或主机


赞(0) 打赏
未经允许不得转载:IDEA激活码 » 详解RFC 792文档

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区